一.jdbc的编写
1.首先导入jar包
- 导入数据库厂商提供的驱动jar包,我们这里使用MySQL,所以导入MySQL的驱动 mysql-connector-java-5.1.7-bin.jar,这两个包需要放在web-inf里lib下面。
- 如果使用的是oracle数据的话就导入ojdbc6.jar。
2.注册驱动
在驱动程序的静态代码块中,会自动将驱动程序通过DriverManager进行注册,所以我们要做的只是将驱动类加载进JDK中,静态代码块将会自动执行。
3.获取数据库连接
获取连接的意思就是调用DriverManager的getConnection()方法即可,里面用到了url,password,username三个参数,其中url是数据库的端口号以及库名,password是创建数据库的密码,username默认的orcl或者mysql的root,他的命名是 jdbc:mysql://主机地址:端口号/库名 对应的 jdbc:mysql://localhost:3306/test
jdbc:oracle:thin:@主机地址:端口号:数据库名 对应的 jdbc:oracle:thin:@localhost:1521:atguigu 其中最后的是自己定义的,前面的到端口号都基本上是默认的。
4.获取Statement对象
获取Statement对象用来执行SQL语句,通过Connection对象的相关方法即可。值得注意的是它存在漏洞,这是黑客攻击的重点,所以一般不使用,取而代之的是prepareStatement,后面操作的就是这样的
5.执行Sql语句
在获取数据库连接和Statement对象后,正式建立了联系,再进行java代码对数据库的增删改插,进一步从前台调数据同java和后台的数据库进行数据的交换。同时也可以把数据库数据拿出来作为比较。
6.resultSet接口
在进行jdbc查询操作的时候会返回一个result对象,只有查询的时候返回一个resultset类型的,他用了st.executeQuery(sql2);它next()的返回值是一个boolean的类型,如果数据库存在这样的值就返回true,否则继续走直到所有数据查询玩。对应的增删改就只要判断数据库里的数据有什么改动,用到了executeUpdate(sql1);也就是说返回一个数值型的,如果操作了就大于0,可用来判断是否增删改了,如果想要判断插入的数据还是要调用executeQuery()。
7.释放资源
在所有操作都执行完了就要关闭连接了。关闭的顺序与连接的顺序正好反过来,先关ResultSet、再关Statement、最后关Connection。这样才不会出错
package com.neuedu.web;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.Statement;public class TestConnection { public static void main(String[] args) throws Exception { // 由于要try、catch许多异常,防止代码过于繁琐,就直接抛出异常 String username="root"; String password="yantao1"; String url="jdbc:mysql://localhost:3306/books"; String driverClass="com.mysql.jdbc.Driver"; //首先用来获取数据库地址,用户名和密码。另外定义了一个加载驱动的字符串。 Class.forName(driverClass); //加载驱动也可以直接Class.forName("com.mysql.jdbc.Driver"); Connection conn=DriverManager.getConnection(url,username,password); //获取数据库的连接通过驱动程序的getConnection方法。 Statement st=conn.createStatement(); //上面的一行存在sql漏洞问题,具体的是如果选择查询就会出现where后面的判断语句,如果有or 1=1,必定成立的语句就会出错,黑客攻击的漏洞。 String sql="insert into teacher(id,aname) values(null,'咕噜噜')"; String sql1="update teacher set aname='咕噜' where aname in('咕噜')"; String sql2="select id,aname from teacher"; PreparedStatement st1=conn.prepareStatement(sql); //conn.executeStatement这个方法就是来解决漏洞问题的。它与上面的不同在于它是上面的子类,需要在里面通过sql的string类型才可以调用,不能调用空的。 //父类的接口指向子类就是多态,同一个变量可以指向多个对象,一种事物多种形态。 int execute=st1.executeUpdate(sql1); //这个是用来判断增删改的,当数据库数据发生了变化,对应的数据库更新了,所以返回了一个影响了行的行数的int类型,可以判断他大于0说明进行了数据库的操作。 ResultSet rs=st1.executeQuery(sql2); //这个是在数据库里寻找,如果有的话就返回一个对象,否则返回的是空。 if(execute>0){ System.out.println(execute); System.out.println("成功"); } //如果发生了数据变化就输出。 while (rs.next()) { System.out.println(rs.getInt(1)+rs.getString("aname")); //对于这个用了一个迭代,就是每一行都判断是否相等,如果不想等鼠标向下一行,知道所有的行都执行完了,才可以结束。 } if(rs!=null){ rs.close(); } if(st!=null){ st.close(); } if(conn!=null){ conn.close(); } //最后关闭所有的连接,释放资源。 }}
另外这个将连接操作和关闭一起操作了,十分的繁琐,而没有封装,所有代码都公开,在实际的业务里是不存在的,这里可以定义一个连接类,在定一个业务层,业务层调用连接层的东西, 最后将写一个最总的类用来调用所有的类。