相关推荐recommended
JDBC超级详细 安装 使用 (2023新版)通俗易懂
作者:mmseoamin日期:2024-03-20

JDBC详细介绍 安装 使用 通俗易懂

1.1 JDBC 概述

英文全称:Java Data Base Connectivity 翻译过来就是 java数据库连接,它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询(executeQuery)、更新(executeUpdate)等操作。

使用 jdbc 准备工作

JDBC超级详细 安装 使用 (2023新版)通俗易懂,请添加图片描述,第1张

1.在设置的新项目文件下定义一个 lib 文件夹,在创建文件夹内加入 mysql-connector-java-5.1.47.jar 注:我的数据库版本是5版本

下载地址: https://nowjava.com/jar/version/mysql/mysql-connector-java.html

温馨提示:下载与自己数据库相对应的版本,数据库8以上版本效率很高,但是稳定性不能保证,所以实际开发中使用数据库5版本较多。求稳

1.2 jdbc 操作数据库执行操作流程
1.2.1 准备数据库连接必要参数
/*  
选择正确的驱动程序,从而建立到数据库的连接,这里可以改变的是 company 字段在localhost:3306/后面,?serverTimezone前面,这个字段决定你使用的具体是哪个数据库
*/
String jdbcUrl ="jdbc:mysql://localhost:3306/company?	   							       	serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&useSSL=false";
// 提供数据库名字
String username = "root";
// 提供数据库密码
// String password 这里我将我的密码注释掉了,大家记得加上
// 定义驱动类字段 
String driverClass = "com.mysql.jdbc.Driver";
// 准备必要参数字段
Connection connection = null;
Statement statement = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
// 这个字段用来后面记录数据库改变行数
int affectedRows = 0;
Statement 与 PreparedStatement 的区别
  1. PreparedStatement是预编译的,对于批量处理可以大大提高效率.

  2. 使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。

  3. statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, preparedstatement支持批处理

  4. Statement 不能防止 SQL 注入 ,PreparedStatement 可以防止 SQL 注入,SQL 注入说白了就是数据库被盗了,里面的信息会被偷取,例如你的微信号,和密码泄露了。

1.2.2 加载驱动
// 这里用定义字符串变量等于 com.mysql.jdbc.Driver
Class.forName(driverClass);
1.2.3 获取数据库链接对象
connection = DriverManager.getConnection(jdbcUrl, username, password);
1.2.4 准备 SQL 语句
/*
这里提供静态 sql 语句
*/
String sql1 = "insert into student(name, age, gender) VALUES ('三不沾', 66, false)";
String sql2 = "select * from student where id = ?";

注:sql 语句 大致分为两种,一种为查询如 select,一种为改变数据如:delete 、update、insert into等

工具使用提示:

准备 目标执行 SQL 语句
字符串中 Alt + Enter ==> Inject language or reference ==> 输入 MySQL 回车
在自动补齐 SQL 过程中,可以首先使用 use XXX 选择对应的数据库,方便后续操作

JDBC超级详细 安装 使用 (2023新版)通俗易懂,请添加图片描述,第2张

应用成功后展示台展示结果
company> use company
[2023-03-27 11:45:42] completed in 3 ms
1.3 通过 Connection 获取数据库搬运工对象(Statement PreparedStatement)
// 获取 SQL 语句搬运工对象
statement = connection.createStatement();
 // 获取 SQL 语句搬运工对象 可批处理 防SQL注入
 statement = connection.prepareStatement(sql);
1.4 (Statement PreparedStatement) 具体使用
1.4.1 Statement 创建
// 定义要执行的 SQL 语句
String sql1 = "insert into student(name, age, gender) VALUES ('三不沾', 66, false)";
// 获取 SQL 语句搬运工对象
statement = connection.createStatement();
1.4.2 PreparedStatement 创建
// 这里使用有定位符的 SQL 语句,为了突出 PreparedStatement 的特点
String sql = "select * from student where id = ?";
// 获取 SQL 语句搬运工对象 这里可以与 Statement 对比
statement = connection.prepareStatement(sql);
1.5 ResultSet 结果集部分知识

这里定义的 resultSet 是单向的,只能单向遍历的结果集,只能执行 next() 方法

1.5.1 数据库数据改变操作(插入,删除,修改)
/*
驱动执行 sql 语句,affectedRows 将记录改变数据的行数
*/
affectedRows = statement.executeUpdate(sql);
// 输出展示
System.out.println("SQL 语句执行对于数据表影响行数:" + affectedRows);
1.5.2 数据库未改变(查询)
// 这里有1个定位符
String sql = "select * from student where id = ?";
/*
这里的第一个参数 1 是参数位置,这里区别与数组下标,不是从0开始,而是从1开始
第二个1是,为参数赋值 有多种类型,可以是字符串,整形,浮点型,不过也可以统一使用object
赋值结束后得到 sql 语句: select * from student where id = 1
*/
statement.setObject(1,1);
resultSet = statement.executeQuery();
// 从头遍历获取数据库每行字段对应各项数据,输出展示
 if (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                int age = resultSet.getInt("age");
                boolean gender = resultSet.getBoolean("gender");
                System.out.println("Name:" + name);
                System.out.println("Age:" + age);
                System.out.println("Gender:" + gender);
            }
1.6 resultSet 高级用法
1.6.1 图解

JDBC超级详细 安装 使用 (2023新版)通俗易懂,请添加图片描述,第3张

俗称用什么拿什么 可以将结果集放入Object[],也可以放入List>等

1.6.2 将 resultSet 数据转化成 Object[]
public Object[] handle(ResultSet res) throws SQLException {
    // 定义数组    
    Object[] arr = null;
    // 获取操作之前,必要准备   
    ResultSetMetaData metaData = res.getMetaData();
    // 获取元数据字段个数
    int columnCount = metaData.getColumnCount();
    // 循环遍历结果集    
    if (res.next()) {
        // 定义数组长度
        arr = new Object[columnCount];
	    // 循环操作进行赋值 这里要注意,数据结果集是从1开始遍历的
        for (int i = 0; i < columnCount; i++) {
                arr[i] = res.getObject(i + 1);
            }
        }
        return arr;
    }
1.6.3 将 resultSet 数据转化成 List>
public List> handle(ResultSet res) throws SQLException {
    // 定义 Map 集合    
    Map map = null;
    // 定义 List 集合    
    List> list = new ArrayList<>();
    // 获取操作之前,必要准备     
    ResultSetMetaData metaData = res.getMetaData();
    // 获取元数据字段个数
    int columnCount = metaData.getColumnCount();
	// 循环遍历结果集
    if (res.next()) {
        // 定义 map 长度   
        map = new HashMap(columnCount);
        // 循环操作进行赋值    
        for (int i = 1; i <= columnCount ; i++) {
            /*
            给 map 赋值 metaData.getColumnName(i) 获取字段名称 
            res.getObject(i) 获取字段对应数据
            */
            map.put(metaData.getColumnName(i),res.getObject(i));
            }
        // 将赋值好的 map 添加到 List 集合中    
        list.add(map);
         }
     // 返回 list 集合    
     return list;
  }
1.7 关闭资源
/**
  * 定义关闭所有资源
  * @param resources 所有资源字段 connection,statement,或者connection,statement,resultSet
  */
private static void close(AutoCloseable... resources) {
        if (resources != null && resources.length > 0) {
            Arrays.stream(resources).forEach(source -> {
                try {
                    if (source != null) {
                        source.close();
                    }
                    }catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
    }
1.8 总结

学会了上述知识,你就已经算是基本了解 JDBC 在Java中大致起到什么作用,扮演什么样的角色

后期我们会进阶学习这一部分知识,即使用封装的思想,简化代码。

感谢您能读到这里,你的鼓励是我坚持的动力。