Loading... # JDBC ## JDBC 简介 jdbc是java程序连接数据库服务器的桥梁. > JDBC是一套连接数据库的规范,里面定义的都是接口。数据库厂商需要实现这套接口连接自家的数据库。数据库厂商实现接口的是驱动。 ## JDBC 定义 > Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们通常说的JDBC是面向关系型数据库的。 ![image.png](https://www.zunmx.top/usr/uploads/2023/07/2009713251.png) 它是一个规范而不是一个接口, 我们可以使用JDBC 连接不同的数据库,可以为多种关系型数据库提供同意访问. ## JDBC工作原理 由SUM(Oracle)提供一套访问数据库的规范, 并提供连接数据库的协议标准, 这组协议称之为JDBC API ; 然后各个数据库厂商会遵循这个规范提供一套访问自己数据库服务的程序, 称之为数据库驱动. JDBC API是接口, 而 JDBC 驱动才是接口的具体实现, 没有驱动时无法完成数据库连接操作的. 所以每个数据库厂商都会有自己的驱动, 用来连接自己公司的数据库. JDBC 驱动就是JDBC API 的实现类. 不同类型的数据库有自己的驱动程序, 为了方便使用, 已经将这个驱动程序打成 jar 文件, 可以直接导入到项目中. ## JDBC作用 ### 没有 JDBC 无JDBC 时是如何实现的java连接数据库? > 写代码,自己写驱动. 无JDBC 时会遇到的问题 > 1. 不知道不同数据库的解析方式.操作方式 > 2. 代码量比较繁重 > 3. 连接不同的数据库需要编写不同的代码去连接 ### 有 JDBC 好处 > 1. 对多种关系数据库提供统一访问 > 2. 切换方便, 需要修改少量代码即可 ## JDBC 常见接口和类 + DriverManager 类 + 驱动管理类 + 注册JDBC驱动 + Connection 接口 + 连接对象 + 建立数据库的连接 + Statement 接口 + SQL 编译器 + 向数据库发送并执行SQL语句 + ResultSet 接口 + 查询结果集 + 执行查询时, 对返回的结果进行处理 ## JDBC 下载 略 ## 入门案例 1. 创建一个user表 2. 创建项目(Java project) 3. 写代码 ```java package top.zunmx.jdbcDemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBC_demo { public static void main(String[] args) throws ClassNotFoundException, SQLException { /* * JDBC 的固定实现思路(important) * 1. 注册驱动 * 2. 获取连接 * 3. 创建执行sql对象, 并定义sql * 4. 执行SQL * 5. 处理结果集 * 6. 释放资源 */ // 1. 注册驱动(使用反射方法) Class.forName("com.mysql.jdbc.Driver"); // 全限定类名的全路径 // 2. 获取连接(驱动管理类) /** * url/user/password */ Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test","root","123456"); // 3. 创建执行sql的对象, 并定义sql Statement st = conn.createStatement(); String sql = "select * from user"; // 4. 执行sql ResultSet rs = st.executeQuery(sql); // 5. 处理结果集 while(rs.next()) { int uid = rs.getInt("uid"); String username = rs.getString("username"); String password = rs.getString("password"); System.out.println(uid + "\t" + username + "\t" + password); } rs.close(); st.close(); conn.close(); } } ``` 8.x 时区问题 ```java package top.zunmx.jdbcDemo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBC_demo8 { public static void main(String[] args) throws ClassNotFoundException, SQLException { /* * JDBC 的固定实现思路(important) * 1. 注册驱动 * 2. 获取连接 * 3. 创建执行sql对象, 并定义sql * 4. 执行SQL * 5. 处理结果集 * 6. 释放资源 */ // 1. 注册驱动(使用反射方法) Class.forName("com.mysql.cj.jdbc.Driver"); // 全限定类名的全路径 // 2. 获取连接(驱动管理类) /** * url/user/password */ Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&characterEncoding=utf-8","root","123456"); // 3. 创建执行sql的对象, 并定义sql Statement st = conn.createStatement(); String sql = "select * from user"; // 4. 执行sql ResultSet rs = st.executeQuery(sql); // 5. 处理结果集 while(rs.next()) { int uid = rs.getInt("uid"); String username = rs.getString("username"); String password = rs.getString("password"); System.out.println(uid + "\t" + username + "\t" + password); } rs.close(); st.close(); conn.close(); } } ``` ```java Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&characterEncoding=utf-8","root","123456"); ``` > ? 拼接符, 后面拼接的是字符串 > > & 如果后面需要继续拼接参数,使用&符号隔开 以下几个问题: 1. unknow database 'xxx' 1. 未找到数据库 2. Access denied for 'xxx' 1. 用户名密码错误 3. Communications link failure 1. 服务器断开连接 ## JDBC 的详解 ### 注册驱动 ```java Class.forName("com.mysql.jdbc.Driver"); ``` 注册驱动实际上是把Driver类, 加载JVM(类加载器), 并且完成类的初始化工作; ![image.png](https://www.zunmx.top/usr/uploads/2023/07/683477977.png) ### 创建连接对象 DriverManager 驱动管理器. 注册驱动, 数据库连接等 getConnection(url,username,password); 获取链接. 该方法会尝试和数据库进行连接操作. jdbc:mysql://ip:port/dbname + jdbc 主协议名 + mysql 子协议名 + ip mysqld地址 + port mysql端口 + dbname 数据库名称 尝试连接本机时可以省略ip:port ### 执行sql语句 statement对象 - executeQuery(String sql) - 执行查询的SQL 语句 只能查 不能增删改 - executeUpdate(String sql) - 执行更新的SQL语句 // 只能做增删改,不能查 - execute(String sql) 一般不用 - 执行任意语句 但是返回值是boolean - select true - insert update delete false ### 处理结果集 rs.next() 代表的是指针, 返回值是Boolean类型的, 将光标移动到下一行, 如果有数据则返回真, 否则返回假 getxxx (xxx 代表数据类型--字段的) ### 释放资源 释放资源: 建议倒序关闭资源 ## JDBC 执行CRUD操作 ```java package top.zunmx.JDBC; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import org.junit.Test; public class JTest { @Test public void addUser() throws Exception { // 1. 注册驱动 Class.forName("com.mysql.jdbc.Driver"); // 2. 获取连接 Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1/test", "root", "123456"); // 3. 创建执行sql语句的对象 Statement st = conn.createStatement(); // 定义sql String sql = "insert into user values(null ,'aaa','bbb')"; // 4. 执行sql int i = st.executeUpdate(sql); if (i > 0) { System.out.println("yes"); } else { System.out.println("no"); } st.close(); conn.close(); } @Test public void updateUserByUid() throws Exception { Class.forName("com.mysql.jdbc.Driver"); // 大小写 Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1/test", "root", "123456"); Statement st = conn.createStatement(); String sql = "update user set username = 'matrix' where uid = 2"; int executeUpdate = st.executeUpdate(sql); System.out.println(executeUpdate); st.close(); conn.close(); } @Test public void deleteUserByUid() throws Exception { Class.forName("com.mysql.jdbc.Driver"); // 大小写 Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1/test", "root", "123456"); Statement st = conn.createStatement(); String sql = "delete from user where uid = 2"; int executeUpdate = st.executeUpdate(sql); System.out.println(executeUpdate); st.close(); conn.close(); } @Test public void findUserByUid() throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1/test", "root", "123456"); Statement st = conn.createStatement(); String sql = "select * from user where uid = 3"; st.executeQuery(sql); ResultSet rs = st.executeQuery(sql); while (rs.next()) { System.out.println(rs.getString(1) + "===" + rs.getString(2) + "===" + rs.getString(3)); } } } ``` ## 封装工具类 ``` package top.zunmx.utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCUtils { static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static Connection getConnection() { Connection conn; try { conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1/test", "root", "123456"); return conn; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public static void closeAll(ResultSet rs, Statement st, Connection conn) { if (rs != null) { try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (st != null) { try { st.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } ``` ## 预处理对象PreparedStatement ```java package top.zunmx.JDBC; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Scanner; import org.junit.Test; import top.zunmx.utils.JDBCUtils; public class PreSt2 { public static void main(String [] args) throws SQLException { System.out.print("Login Demo\nUser:"); String usr = new Scanner(System.in).nextLine(); System.out.print("Password:"); String pwd = new Scanner(System.in).nextLine(); System.out.println(usr + "<==>" + pwd); Connection conn = JDBCUtils.getConnection(); String sql = "select * from `user` where `username` = ? and `password`=?"; PreparedStatement psvm = conn.prepareStatement(sql); psvm.setString(1, usr); psvm.setString(2, pwd); ResultSet rs = psvm.executeQuery(); if (rs.next()) { System.out.println("Login Success " + rs.getString("username")); } else { System.err.println("Login Failure"); } JDBCUtils.closeAll(rs, psvm, conn); System.out.println("System Shutdown!"); } } ``` 常见方法 + setInt(int index, int value) + index 占位符位置 + value int值 + setString(int index, int value) + index 占位符位置 + value String 值 + executeQuery() + 返回的是ResultSet + executeUpdate() + 返回的是几行受影响 ### 预处理对象执行CRUD ```sql package top.zunmx.JDBC; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Iterator; import org.junit.Test; import top.zunmx.utils.JDBCUtils; public class Pdemo2 { @Test public void addUser() throws SQLException { Connection conn = JDBCUtils.getConnection(); String sql = "insert into user values(?,?,?)"; PreparedStatement psvm = conn.prepareStatement(sql); psvm.setString(1, null); psvm.setString(2, "baoqiang"); psvm.setString(3, "dub"); int eu = psvm.executeUpdate(); if (eu > 0) { System.out.println("success"); } else { System.out.println("failure"); } psvm.setString(1, null); psvm.setString(2, "nailiang"); psvm.setString(3, "bobo"); eu = psvm.executeUpdate(); if (eu > 0) { System.out.println("success"); } else { System.out.println("failure"); } // 方法2 psvm.setString(1, null); psvm.setString(2, "yuxuan"); psvm.setString(3, "123456"); psvm.addBatch(); psvm.setString(1, null); psvm.setString(2, "guotai"); psvm.setString(3, "123"); psvm.addBatch(); int[] eb = psvm.executeBatch(); for (int i = 0; i < eb.length; i++) { System.out.println(i+" "+ eb[i]); } JDBCUtils.closeAll(null, psvm, conn); } @Test public void deleteUserByUid() throws Exception{ Connection conn = JDBCUtils.getConnection(); String sql = "delete from user where uid = ?"; PreparedStatement psvm = conn.prepareStatement(sql); psvm.setInt(1, 10); long i = psvm.executeLargeUpdate(); System.out.println(i); JDBCUtils.closeAll(null, psvm, conn); } @Test public void updateUserByUid() throws Exception{ Connection conn = JDBCUtils.getConnection(); String sql = "update user set username = ? where uid = ?"; PreparedStatement psvm = conn.prepareStatement(sql); psvm.setString(1, "Dog"); psvm.setInt(2, 10); long i = psvm.executeLargeUpdate(); System.out.println(i); JDBCUtils.closeAll(null, psvm, conn); } @Test public void queryUserByUid() throws Exception{ Connection conn = JDBCUtils.getConnection(); String sql = "select * from user where uid = ?"; PreparedStatement psvm = conn.prepareStatement(sql); psvm.setInt(1, 1); ResultSet rs = psvm.executeQuery(); while(rs.next()) { int uid = rs.getInt("uid"); String usr = rs.getString("username"); String pwd = rs.getString("password"); System.out.println(uid+"\t"+usr+"\t"+pwd); } } } ``` © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏