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 package com.jyroy.test; 2 3 import java.sql.DriverManager; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 import java.sql.Statement; 7 8 import com.jyroy.util.JDBCUtil; 9 10 import java.sql.Connection; 11 import java.sql.Driver; 12 13 public class MainTest { 14 15 public static void main(String[] args) { 16 Connection connection = null; 17 Statement st = null; 18 ResultSet rs = null; 19 20 try { 21 //1.注册驱动 22 DriverManager.registerDriver(new com.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 package com.jyroy.DBUtil; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.SQLException; 6 7 public class DBUtil { 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 static Connection getConnection(){ 26 return connection; 27 } 28 }
我们在MainTest中调用
1 connection = DBUtil.getConnection();
运行之后,同样可以得到相同的查询结果
进行资源释放
上面的资源释放,只是简单的close掉了,更好的办法释放资源还是在finally语句块中,因此重新编写代码,使用finally语句块,我这里直接写了一个工具类,让代码更清晰一点。
finally一般拿来做一些善后清理工作,当try块里出现错误的话,会立即跳出try块,找到匹配的错误,执行catch块里的语句,此时,可能在try块里打开的文件没关闭,连接的网络没断开,对这些浪费的内存就不能及时释放回收,因此利用finally进行一些善后工作
1 package com.jyroy.util; 2 3 import java.sql.Connection; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 import java.sql.Statement; 7 8 public class JDBCUtil { 9 /* 10 释放资源 11 */ 12 13 public static void release(Connection connection, Statement st, ResultSet rs) { 14 closeConn(connection); 15 closeRs(rs); 16 closeSt(st); 17 } 18 19 private static void closeRs(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 void closeSt(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 void closeConn(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 package com.jyroy.test; 2 3 import java.sql.DriverManager; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 import java.sql.Statement; 7 8 import com.jyroy.DBUtil.DBUtil; 9 import com.jyroy.util.JDBCUtil; 10 11 import java.sql.Connection; 12 import java.sql.Driver; 13 14 public class MainTest { 15 16 public static void main(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 @Test 2 public void testInsert() { 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 @Test 2 public void testDelete() { 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 @Test 2 public void testUpdate() { 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 }