使用JDBC连接操作数据库

时间:2022-09-12 15:16:40

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连接操作数据库

 

使用工具类

  借助工具类来方便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();

  运行之后,同样可以得到相同的查询结果

使用JDBC连接操作数据库

 

进行资源释放

  上面的资源释放,只是简单的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     }