• JDBC


    一、JDBC概述🍎

    在开发中我们使用的是java语言,那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。

    在这里插入图片描述

    (一)、 JDBC概念🥝

    JDBC(Java Data Base Connectivity) 是 Java 访问数据库的标准规范.是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范

    (二)、 JDBC原理🥝

    JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。

    (三)、 JDBC好处🥝

    • 各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发
    • 可随时替换底层数据库,访问数据库的Java代码基本不变
      以后编写操作数据库的代码只需要面向JDBC(接口),操作哪儿个关系型数据库就需要导入该数据库的驱动包,如需要操作MySQL数据库,就需要再项目中导入MySQL数据库的驱动包。如下图就是MySQL驱动包
      在这里插入图片描述

    二、JDBC快速入门🍎

    (一)、 数据准备🥝

     -- 创建 jdbc_user表 
    CREATE TABLE jdbc_user (
      id INT PRIMARY KEY AUTO_INCREMENT ,
      username VARCHAR(50),
      PASSWORD VARCHAR(50),
      birthday DATE
    );
    -- 添加数据
    INSERT INTO jdbc_user (username, PASSWORD,birthday) 
    VALUES
    ('admin1', '123','1991/12/24'), 
    ('admin2','123','1995/12/24'),
    ('test1', '123','1998/12/24'),
    ('test2', '123','2000/12/24');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    (二)、 Mysql 驱动包🥝

    引用驱动包
    在这里插入图片描述

    (三)、 API使用🥝

    注册驱动
    在这里插入图片描述

    	public static void main(String[] args) throws ClassNotFoundException { 
    		//1.注册驱动   注册驱动(jar 8以下)
    		// forName 方法执行将类进行初始化 
    		Class.forName("com.mysql.jdbc.Driver"); 
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注:5.1以后版本需要带.cj 会默认自动注册

    Class.forName(com.mysql.cj.jdbc.Driver);
    
    • 1

    查询MySQL提供的Driver类,看它是如何实现的,源码如下:
    在这里插入图片描述

    在该类中的静态代码块中已经执行了 DriverManager 对象的 registerDriver() 方法进行驱动的注册了,那么我们只需要加载 Driver 类,该静态代码块就会执行。而 Class.forName(“com.mysql.jdbc.Driver”); 就可以加载 Driver 类。

    获得连接
    Connection 接口,代表一个连接对象 ,具体的实现类由数据库的厂商实现
    使用 DriverManager类的静态方法,getConnection可以获取数据库的连接
    在这里插入图片描述

    url

    jdbc:mysql://localhost:3306/db4?characterEncoding=UTF-8&&useSSL = false
    ?useSSL = false
    
    • 1
    • 2

    第一部分是协议 jdbc,这是固定的;
    第二部分是子协议,就是数据库名称,连接mysql数据库,第二部分当然是mysql了;
    第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql的第三部分分别由数据库服务器的IP地址(localhost)、端口号(3306),以及要使用的数据库名称组成。

    代码示例

    public static void main(String[] args) throws Exception { 
    //1.注册驱动 
    Class.forName("com.mysql.jdbc.Driver"); 
    //2.获取连接 url,用户名, 密码 
    String url = "jdbc:mysql://localhost:3306/db4"; 
    Connection con = DriverManager.getConnection(url, "root", "123456");
    
    //com.mysql.jdbc.JDBC4Connection@2e3fc542 
    System.out.println(con); 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    获取语句执行平台

    通过Connection 的 createStatement方法 获取sql语句执行对象
    在这里插入图片描述

    Statement : 代表一条语句对象,用于发送 SQL 语句给服务器,用于执行静态SQL语句并返回它所生成结果的对象。
    Statement类常用方法 说明
    int executeUpdate(String sql); 执行insert update delete语句.返回int类型,代表受影响的行数
    ResultSet executeQuery(Stringsql); 执行select语句, 返回ResultSet结果集对象

    public static void main(String[] args) throws Exception { 
    //1.注册驱动 
    Class.forName("com.mysql.jdbc.Driver"); 
    //2.获取连接 url,用户名, 密码 
    String url = "jdbc:mysql://localhost:3306/db4"; 
    Connection con = DriverManager.getConnection(url, "root", "123456"); 
    //3.获取 Statement对象
    Statement statement = con.createStatement(); 
    //4.执行创建表操作 
    String sql = "create table test01(id int, name varchar(20),age int);"; 
    //5.增删改操作 使用executeUpdate,增加一张表 
    int i = statement.executeUpdate(sql); 
    //6.返回值是受影响的函数 
    System.out.println(i); 
    //7.关闭流 
    statement.close(); 
    con.close(); 
    } 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    处理结果集
    只有在进行查询操作的时候, 才会处理结果集

    public static void main(String[] args) throws SQLException { 
    //1.注册驱动 可以省略 
    //2.获取连接 
    String url = "jdbc:mysql://localhost:3306/db4"; 
    Connection con = DriverManager.getConnection(url, "root", "123456"); 
    //3.获取 Statement对象 
    Statement statement = con.createStatement(); 
    String sql = "select * from jdbc_user"; 
    //执行查询操作,返回的是一个 ResultSet 结果对象 
    ResultSet resultSet = statement.executeQuery(sql); 
    //4.处理结果集 resultSet 
    
    } 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    ResultSet接口
    作用:封装数据库查询的结果集,对结果集进行遍历,取出每一条记录。

    boolean next()
    1、游标向下一行;2、返回 boolean 类型,如果还有下一条记录,返回 true,否则返回 false
    xxx getXxx( String or int)
    1、通过列名,参数是 String 类型。返回不同的类型2、通过列号,参数是整数,从1开始。返回不同的类型

    public static void main(String[] args) throws SQLException { 
    //1.注册驱动 可以省略 
    //2.获取连接 
    String url = "jdbc:mysql://localhost:3306/db4"; 
    Connection con = DriverManager.getConnection(url, "root", "123456"); 
    //3.获取 Statement对象 
    Statement statement = con.createStatement(); 
    String sql = "select * from jdbc_user"; 
    //执行查询操作,返回的是一个 ResultSet 结果对象 
    ResultSet resultSet = statement.executeQuery(sql); 
    //4.处理结果集 // 
    //next 方法判断是否还有下一条数据 
    // boolean next = resultSet.next(); 
    // System.out.println(next);  
    //getXXX 方法获取数据 两种方式 
    // int id = resultSet.getInt("id");//列名 
    // System.out.println(id); 
     int anInt = resultSet.getInt(1);//列号 
    // System.out.println(anInt);
    //使用while循环 
    while(resultSet.next()){ 
    	//获取id 
    	int id = resultSet.getInt("id"); 
    	//获取姓名 
    	String username = resultSet.getString("username"); 
    	//获取生日 
    	Date birthday = resultSet.getDate("birthday"); 
    	System.out.println(id + " = " +username + " : " + birthday); 
    }
    //关闭连接 
    resultSet.close(); 
    statement.close(); 
    con.close(); 
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    释放资源
    需要释放的对象:ResultSet 结果集,Statement 语句,Connection 连接
    释放原则:先开的后关,后开的先关。ResultSet ==> Statement ==> Connection
    放在哪个代码块中:finally 块
    与IO流一样,使用后的东西都需要关闭!关闭的顺序是先开后关, 先得到的后关闭,后得到的先关闭

    
    public static void main(String[] args) { 
    Connection connection = null; 
    Statement statement = null; 
    ResultSet resultSet = null; 
    try {
    	//1.注册驱动(省略) 
    	//2.获取连接 
    	String url = "jdbc:mysql://localhost:3306/db4"; 
    	connection = DriverManager.getConnection(url, "root", "123456"); 
    	//3.获取 Statement对象 
    	statement = connection.createStatement(); 
    	String sql = "select * from jdbc_user"; 
    	resultSet = statement.executeQuery(sql); 
    } catch (SQLException e) { 
    	e.printStackTrace(); 
    } finally { 
       /**
    	* 开启顺序: connection ==> statement => resultSet 
    	* 关闭顺序: resultSet ==> statement ==> connection 
    	*/ 
    	try {
    		connection.close(); 
    		resultSet.close(); 
    		statement.close(); 
    	} catch (SQLException e) { 
    		e.printStackTrace(); 
    	}
    } 
    } 
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    流程:

    • 创建工程,导入驱动jar包
      注册驱动(jar 8以下)
     Class.forName("com.mysql.jdbc.Driver");
    
    • 1

    获取连接

     Connection conn = DriverManager.getConnection(url, username, password);
    
    • 1
    • Java代码需要发送SQL给MySQL服务端,就需要先建立连接
      定义SQL语句
     String sql =  “update…” ;
    
    • 1

    获取执行SQL对象
    执行SQL语句需要SQL执行对象,而这个执行对象就是Statement对象

     Statement stmt = conn.createStatement();
    
    • 1

    执行SQL

     stmt.executeUpdate(sql);  
    
    • 1
    • 处理返回结果
    • 释放资源

    编写代码如下:

    /* 1. 注册驱动 */
    Class.forName("com.mysql.jdbc.Driver");//8.0 有变化
    /* 2. 获取连接 */
    String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
    String username = "root";
    String password = "123456";
    Connection conn = DriverManager.getConnection(url, username, password);
    /* 3. 定义sql */
    String sql = "update jdbc_user set password= 20 where username= 'xx'";
    /* 4. 获取执行sql的对象 Statement */
    Statement stmt = conn.createStatement();
    /* 5. 执行sql */
    int count = stmt.executeUpdate(sql);//受影响的行数
    /* 6. 处理结果 */
    System.out.println(count);
    /* 7. 释放资源 */
    stmt.close();
    conn.close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    步骤总结

    获取驱动(可以省略)
    获取连接
    获取Statement对象
    处理结果集(只在查询时处理)
    释放资源

    三、JDBC实现增删改查🍎

    JDBC工具类
    什么时候自己创建工具类?
    如果一个功能经常要用到,我们建议把这个功能做成一个工具类,可以在不同的地方重用。
    “获得数据库连接”操作,将在以后的增删改查所有功能中都存在,可以封装工具类JDBCUtils。提供获取连接对象的方法,从而达到代码的重复利用。
    工具类包含的内容
    可以把几个字符串定义成常量:用户名,密码,URL,驱动类
    得到数据库的连接:getConnection()
    关闭所有打开的资源:

     /**
      * JDBC 工具类 
      */ 
    public class JDBCUtils { 
    	//1. 定义字符串常量, 记录获取连接所需要的信息 
    	public static final String DRIVERNAME = "com.mysql.jdbc.Driver"; 
    	public static final String URL = "jdbc:mysql://localhost:3306/db4?characterEncoding=UTF-8"; 
    	public static final String USER = "root"; 
    	public static final String PASSWORD = "123456"; 
    	//2. 静态代码块, 随着类的加载而加载 
    	static{ 
    		try {
    			//注册驱动 
    			Class.forName(DRIVERNAME); 
    		} catch (ClassNotFoundException e) { 
    			e.printStackTrace(); 
    		} 
    	}
    	//3.获取连接的静态方法 
    	public static Connection getConnection(){ 
    		try {
    			//获取连接对象 
    			Connection connection = DriverManager.getConnection(URL, USER, PASSWORD); 
    			//返回连接对象 
    			return connection; 
    		} catch (SQLException e) { 
    			e.printStackTrace(); 
    			return null; 
    		} 
    	}
    	//关闭资源的方法 
    	public static void close(Connection con, Statement st){
    		if(con != null && st != null){ 
    			try {
    				st.close(); 
    				con.close(); 
    			} catch (SQLException e) { 
    				e.printStackTrace(); 
    			} 
    		} 
    	}
    	
    	public static void close(Connection con, Statement st, ResultSet rs){ 
    		if(rs != null){ 
    			try {
    				rs.close(); 
    			} catch (SQLException e) { 
    				e.printStackTrace(); 
    			} 
    		}
    		close(con,st); 
    	} 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    (一)、DML操作🥝

    插入记录
    解决插入中文乱码问题.

    jdbc:mysql://localhost:3306/db4?characterEncoding=UTF-8 
    characterEncoding=UTF-8 指定字符的编码、解码格式。
    
    • 1
    • 2

    代码示例

    /** 
     * 插入数据 
     * @throws SQLException 
     */ 
    @Test 
    public void testInsert() throws SQLException { 
    	//1.通过工具类获取连接 
    	Connection connection = JDBCUtils.getConnection(); 
    	//2.获取Statement 
    	Statement statement = connection.createStatement(); 
    	//2.1 编写Sql
    	String sql = "insert into jdbc_user values(null,'张百万','123','2020/1/1')"; 	
    	//2.2 执行Sql 
    	int i = statement.executeUpdate(sql); 
    	System.out.println(i); 
    	//3.关闭流 
    	JDBCUtils.close(connection,statement); 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    (二)、更新记录🥝

    /**
     * 修改 id 为1 的用户名为 广坤 
     */ 
     @Test 
     public void testUpdate() throws SQLException { 
     	Connection connection = JDBCUtils.getConnection(); 
     	Statement statement = connection.createStatement(); 
     	String sql = "update jdbc_user set username = '广坤' where id = 1"; 
     	statement.executeUpdate(sql); 
     	JDBCUtils.close(connection,statement); 
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    (三)、删除记录🥝

    /**
     * 删除id 为 3 和 4的记录 
     * @throws SQLException 
     */ 
     @Test 
     public void testDelete() throws SQLException { 
     	Connection connection = JDBCUtils.getConnection(); 
     	Statement statement = connection.createStatement(); 
     	statement.executeUpdate("delete from jdbc_user where id in(3,4)"); 
     	JDBCUtils.close(connection,statement); 
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    (四)、 DQL操作🥝

    查询姓名为张百万的一条记录

    public static void main(String[] args) throws SQLException { 
    //1.获取连接对象 
    Connection connection = JDBCUtils.getConnection(); 
    //2.获取Statement对象 
    Statement statement = connection.createStatement(); 
    String sql = "SELECT * FROM jdbc_user WHERE username = '张百万';"; 
    ResultSet resultSet = statement.executeQuery(sql); 
    //3.处理结果集 
    while(resultSet.next()){ 
    //通过列名 获取字段信息 
    int id = resultSet.getInt("id"); 
    String username = resultSet.getString("username"); 
    String password = resultSet.getString("password"); 
    String birthday = resultSet.getString("birthday"); 
    System.out.println(id+" "+username+" " + password +" " + birthday); 
    }
    //4.释放资源 
    JDBCUtils.close(connection,statement,resultSet); 
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    ElasticSearch 安装(单机版本)
    【斯坦福计网CS144项目】Lab4: TCPConnection
    mysql中有isolated transaction吗举例说明
    为什么TDM更适合数字传输?(模拟信号与数字信号传输比较,TDM与FDM传输方式比较)
    Mongodb 副本集名称重命名
    构建基于深度学习神经网络协同过滤模型(NCF)的视频推荐系统(Python3.10/Tensorflow2.11)
    python中的关联关系
    Leetcode 2909. Minimum Sum of Mountain Triplets II
    Bytebase 和 GitLab 签署 Technology Partner 技术合作伙伴协议
    Spring MVC中Restful风格引入
  • 原文地址:https://blog.csdn.net/2301_77444674/article/details/133378104