JDBC简介
Java数据库连接(Java Database Connectivity,JDBC),是一种用于执行SQL语句的Java API,它由一组用Java编程语言编写的类和接口组成。
JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。
使用JDBC编写的程序能够自动地将SQL语句传送给相应的数据库管理系统。
JDBC 是个"低级"接口,也就是说,它用于直接调用 SQL 命令。在这方面它的功能极佳,并比其它的数据库连接 API 易于使用,但它同时也被设计为一种基础接口,在它之上可以建立高级接口和工具。高级接口是"对用户友好的"接口,它使用的是一种更易理解和更为方便的 API,这种API在幕后被转换为诸如 JDBC 这样的低级接口。
JDBC扩展了Java的功能,由于Java语言本身的特点,使得JDBC具有简单、健壮、安全、可移植、获取方便等优势。
JDBC中常用类和接口
接口/类功能说明
DriverManager
数据库驱动管理类,用于加载和卸载各种驱动程序,并建立于数据库的连接
Connection
此接口用于连接数据库
Statement
此接口用于执行SQL语句并将数据检索到ResultSet中
ResultSet
结果集接口,提供检索SQL语句返回数据的各种方法
PreparedStatement
此接口用于执行预编译的SQL语句
CallableStatement
此接口用于执行SQL存储过程的语句
JDBC开发步骤
注册驱动
建立连接
创建statement
执行sql,得到ResultSet
查看结果
释放资源
开发第一个JDBC程序
源码
1 packagecom.jyroy.test;2
3 importjava.sql.DriverManager;4 importjava.sql.ResultSet;5 importjava.sql.SQLException;6 importjava.sql.Statement;7
8 importcom.jyroy.util.JDBCUtil;9
10 importjava.sql.Connection;11 importjava.sql.Driver;12
13 public classMainTest {14
15 public static voidmain(String[] args) {16 Connection connection = null;17 Statement st = null;18 ResultSet rs = null;19
20 try{21 //1.注册驱动
22 DriverManager.registerDriver(newcom.mysql.jdbc.Driver());23
24 //2.建立连接25 //方法一 参数一:协议+访问数据库,参数二:用户名,参数三:密码
26 connection = DriverManager.getConnection("jdbc:mysql://localhost/student", "root", "password");27
28 //方法二29 //DriverManager.getConnection("jdbc:msql://localhost/student?user=root&password=password");30
31 //3.创建statement,跟数据库打交道一定需要这个对象
32 st =connection.createStatement();33
34 //4.执行查询
35 String sql = "select * from stu";36 rs =st.executeQuery(sql);37
38 //5.遍历查询每一条记录
39 while(rs.next()) {40 int id = rs.getInt("id");41 String name = rs.getString("name");42 int age = rs.getInt("age");43
44 System.out.println("id = " + id + "; name = " + name + "; age = " +age);45 }46 //进行资源释放
47 connection.close();48 st.close();49 rs.close();50
51 } catch(SQLException e) {52 e.printStackTrace();53 }54 }55 }56
结果
使用工具类
借助工具类来方便JDBC的操作
获取数据库连接
建立数据库连接的类,里面封装好实现数据库连接的函数,方便调用实现数据库连接
这里说两个问题:
一:
这里多用了一个 Class.forName("com.mysql.jdbc.Driver"); 因为
在上面的例子中,Driver这个类里面有静态代码块(java.sql.DriverManager.registerDriver(new Driver())),我们在new的时候一开始就加载了Driver类,相当于注册了两次驱动,为了避免这个情况,使用Class.forName("com.mysql.jdbc.Driver");来进行驱动的注册。
二:
根据JDBC官方文档,在JDBC5之后,Class.forName(); 的注册驱动,官方已经帮我们实现了,我们不加载驱动(JDBC会自动识别使mysql还是oracl什么的,当然了,如果同时用了mysql和oracl就要写上了,这个时候就没法自动确定了),直接建立连接也是可以的,大家可以自己试一下把Class.forName();这句话注释掉,也是可以完美运行的!
1 packagecom.jyroy.DBUtil;2
3 importjava.sql.Connection;4 importjava.sql.DriverManager;5 importjava.sql.SQLException;6
7 public classDBUtil {8
9 private static Connection connection=null;10
11 static{12 try{13 //1.加载驱动程序
14 Class.forName("com.mysql.jdbc.Driver");15 //2.获得数据库的连接
16 connection = DriverManager.getConnection("jdbc:mysql://localhost/student", "root", "password");17
18 } catch(ClassNotFoundException e) {19 e.printStackTrace();20 } catch(SQLException e) {21 e.printStackTrace();22 }23 }24 //将获得的数据库与java的链接返回(返回的类型为Connection)
25 public staticConnection getConnection(){26 returnconnection;27 }28 }
我们在MainTest中调用
1 connection = DBUtil.getConnection();
运行之后,同样可以得到相同的查询结果
进行资源释放
上面的资源释放,只是简单的close掉了,更好的办法释放资源还是在finally语句块中,因此重新编写代码,使用finally语句块,我这里直接写了一个工具类,让代码更清晰一点。
finally一般拿来做一些善后清理工作,当try块里出现错误的话,会立即跳出try块,找到匹配的错误,执行catch块里的语句,此时,可能在try块里打开的文件没关闭,连接的网络没断开,对这些浪费的内存就不能及时释放回收,因此利用finally进行一些善后工作
1 packagecom.jyroy.util;2
3 importjava.sql.Connection;4 importjava.sql.ResultSet;5 importjava.sql.SQLException;6 importjava.sql.Statement;7
8 public classJDBCUtil {9 /*
10 释放资源11 */
12
13 public static voidrelease(Connection connection, Statement st, ResultSet rs) {14 closeConn(connection);15 closeRs(rs);16 closeSt(st);17 }18
19 private static voidcloseRs(ResultSet rs) {20 try{21 if(rs!=null) {22 rs.close();23 }24 } catch(SQLException e) {25 e.printStackTrace();26 }finally{27 rs = null;28 }29 }30
31 private static voidcloseSt(Statement st) {32 try{33 if(st!=null) {34 st.close();35 }36 } catch(SQLException e) {37 e.printStackTrace();38 }finally{39 st = null;40 }41 }42
43 private static voidcloseConn(Connection connection) {44 try{45 if(connection!=null) {46 connection.close();47 }48 } catch(SQLException e) {49 e.printStackTrace();50 }finally{51 connection = null;52 }53 }54
55 }
在MainTest类中进行使用
1 JDBCUtil.release(connection, st, rs);
数据库的增删查改
查询
1 packagecom.jyroy.test;2
3 importjava.sql.DriverManager;4 importjava.sql.ResultSet;5 importjava.sql.SQLException;6 importjava.sql.Statement;7
8 importcom.jyroy.DBUtil.DBUtil;9 importcom.jyroy.util.JDBCUtil;10
11 importjava.sql.Connection;12 importjava.sql.Driver;13
14 public classMainTest {15
16 public static voidmain(String[] args) {17
18 Connection conn = null;19 Statement st = null;20 ResultSet rs = null;21
22 try{23 //1.获取连接对象
24 conn =DBUtil.getConnection();25
26 //2.根据连接对象,得到statement
27 st =conn.createStatement();28
29 //3.执行查询
30 String sql = "select * from stu";31 rs =st.executeQuery(sql);32
33 //4.遍历输出结果
34 while(rs.next()) {35 String name = rs.getString("name");36 int age = rs.getInt("age");37
38 System.out.println(name + " " +age);39 }40
41 } catch(SQLException e) {42 //TODO 自动生成的 catch 块
43 e.printStackTrace();44 }finally{45 JDBCUtil.release(conn, st, rs);46 }47 }48 }
插入
1 @Test2 public voidtestInsert() {3 Connection conn = null;4 Statement st = null;5
6 try{7 //1.获取连接对象
8 conn =DBUtil.getConnection();9
10 //2.根据连接对象,得到statement
11 st =conn.createStatement();12
13 //3.执行插入
14 String sql = "insert into stu values(null, 'xiaoming', 12)";15
16 int result =st.executeUpdate(sql);17
18 //result表示影响的行数,大于0表示添加成功,否则失败
19 if(result > 0) {20 System.out.println("添加成功");21 }22 else{23 System.out.println("添加失败");24 }25
26 } catch(SQLException e) {27 //TODO 自动生成的 catch 块
28 e.printStackTrace();29 }finally{30 JDBCUtil.release(conn, st);31 }32 }
删除
1 @Test2 public voidtestDelete() {3 Connection conn = null;4 Statement st = null;5
6 try{7 //1.获取连接对象
8 conn =DBUtil.getConnection();9
10 //2.根据连接对象,得到statement
11 st =conn.createStatement();12
13 //3.执行删除
14 String sql = "delete from stu where name = 'xiaoming'";15
16 int result =st.executeUpdate(sql);17
18 //result表示影响的行数,大于0表示添加成功,否则失败
19 if(result > 0) {20 System.out.println("删除成功");21 }22 else{23 System.out.println("删除失败");24 }25
26 } catch(SQLException e) {27 //TODO 自动生成的 catch 块
28 e.printStackTrace();29 }finally{30 JDBCUtil.release(conn, st);31 }32 }
更新
1 @Test2 public voidtestUpdate() {3 Connection conn = null;4 Statement st = null;5
6 try{7 //1.获取连接对象
8 conn =DBUtil.getConnection();9
10 //2.根据连接对象,得到statement
11 st =conn.createStatement();12
13 //3.执行更新
14 String sql = "update stu set age = 11 where name = 'zhangsan'";15
16 int result =st.executeUpdate(sql);17
18 //result表示影响的行数,大于0表示添加成功,否则失败
19 if(result > 0) {20 System.out.println("更新成功");21 }22 else{23 System.out.println("更新失败");24 }25
26 } catch(SQLException e) {27 //TODO 自动生成的 catch 块
28 e.printStackTrace();29 }finally{30 JDBCUtil.release(conn, st);31 }32 }