• JDBC 编程 (使用Java操作MySQL数据库)


    目录

    0、👩‍💻介绍👨‍💻

    1、配置 JDBC 环境

    1)原理

    2)下载驱动包

    3)把刚才下载的 jar 包导入到项目中使用(以 IDEA 为例)

     2、JDBC 代码编写步骤

    1)创建数据源对象,数据源对象就是描述了要访问的数据库是啥,在哪 

    2) 让代码和数据库服务器建立连接

    3)构造要执行的 SQL 语句

    4) 执行 SQL

    5)完成滞后于,关闭释放资源

    6)总代码

    7)拓展:通过字符串拼接的方式,让用户输入数据进行插入

     使用 PreparedStatement 拼装机制

     3、插入、删除、更新、查找

    删除操作🌚

    更新操作🌛

    ​编辑 查找操作🌜


    0、👩‍💻介绍👨‍💻

            咱们可能见过很多数据库,例如 oracle、MySQL、SQLsever等。

    而这些数据库都会提供一些API,供我们使用操作使用。但是每中数据库提供的API都不一样,这就给我们带来了许多问题

    例如:

    1.我们程序员要掌握多种不同的数据库 API,提高了学习成本

    2.如果一个项目要把数据库 替换成另外一种,改动就会很大!

               为了解决上述问题,Java 就提供了一组统一风格的数据库操作 API,然后让这些数据库厂商来适配 Java 的 API。这个 API 就叫做 JDBC !!!

    API:Application Programming Interface  应用程序编程接口~~

    提供一组 类/方法,让程序员直接调用~

     所以我们程序员只用掌握这一种 API 就可以操作所有数据库!!

    1、配置 JDBC 环境

    1)原理

    我们程序员在操作数据库时,使用应用程序调用JDBC接口来具体操作对于的数据库。

    而这些数据库会提供一个原生驱动包,完成 原生API 到 JDBC API 直接的转化。

    这个转换 API 的过程,计算机术语叫做 “适配”(adapt)

            

    我们配置的环境就是把 驱动包 给下载下来,并且导到项目中!!!

    2)下载驱动包

    我们可以去中央仓库去下载:mvnrepository

    下面以 MySQL 为例

    1️⃣首先我们在搜索框内 输入 MySQL 然后进行查找,搜索出来的第一条记录就是我们要找的,点进去。

     2️⃣进去之后我们会发现后很多版本,这里我们要下载与我们 MySQL 版本相对应的(大版本对应即可,小版本没事 例 数据库是 8.0 那就用 8系列)

    我这里 MySQL 版本是 5.7 。大家也可以在“服务”里面查看 MySQL 的版本

    选中对应的版本,点击下载(下载的按钮很隐蔽,下图红框就是下载按钮)

     

    3)把刚才下载的 jar 包导入到项目中使用(以 IDEA 为例)

    1️⃣先创建一个目录,比如 叫 lib,和 src 同级。

     把下载的 jar 包拷贝进去

     2️⃣右键新创建好的目录,点击 Add as Library,然后点 OK

     这个选项就是把刚才创建好的目录标记成 存放库 文件(jar包)的目录,然后 IDEA 就能识别我们的 jar 包!!!

    如果我们的 jar 包可以展开,如下。就说明我们导包成功啦

     2、JDBC 代码编写步骤

     1)创建数据源对象,数据源对象就是描述了要访问的数据库是啥,在哪 

    创建数据源对象

    DataSource dataSource = new MysqlDataSource();

    这个  DataSource 是 java 标准库里面的类,MysqlDataSource 是 MySQL 驱动包中的类。

    DataSource 是个接口类,不能实例化自己,而 MySQLDataSource 正好是实现了该接口的具体类。

    注:如果我们导入 驱动包 失败,就找不到导入 MysqlDataSource 的包!!

    import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

     (每种数据库都会提供对应的类来实现 DataSource 接口 )

    通过数据源找到数据库的位置(找到到家) 

    ((MysqlDataSource) dataSource).setURL(URL);

    setURL 方法不是 DataSource 里的,而是 MySQLDataSource 的,得转成子类引用

    MySQL 是一个客户端服务器的程序,描述服务器的位置,会使用 URL 这个概念来表示。

    但是有的数据库,比如 SQLite,就不是客户端服务器结构,也就谈不上 URL

     这个 URL 我们可以直接复制粘贴使用(注:要写正确的数据库名)

    "jdbc:mysql://127.0.0.1:3306/创建数据库名?characterEncoding=utf8&useSSL=false"

     设置 用户名 和 密码 (拿钥匙进家门)

    1. ((MysqlDataSource) dataSource).setUser("root");
    2. ((MysqlDataSource) dataSource).setPassword("123456");//输入你个人设置的密码

    用户名统一都是root(MySQL 自带的用户名)

    密码,就是你安装数据库的时候设置的密码

    注:如果没有设置密码,要写成空字符串的形式 如 ....setPassword("");

     2) 让代码和数据库服务器建立连接

    Connection connection = dataSource.getConnection();

    这里我们要处理一下异常,不然会报错!

     注意:使用 Connection 来表示连接,不要导入错误的包,不然会连接失败!!!

    import java.sql.Connection;
    

    到这里,我们可以运行一下代码,如果没有报错说明连接数据库成功

     如果是以下这样,就说明 URL 没有写对 

    如果报错出 Access denied 就说明 用户名 或者 密码 错误 

    3)构造要执行的 SQL 语句

            我们可以把要执行的 SQL 语句转成字符串,传给Connction对象的 prepareStatement() 方法中。

    语法:

    String sql = "要操作的SQL语句";
    
    PreparedStatement statement = connection.prepareStatement(sql);

            1.先通过字符串。描述出来要执行的 SQL 是啥

            2.然后构造成 PreparedStatement 对象

    connection.prepareStatement(sql) 含义:先通过字符串,描述出来要执行的 SQL语句,然后再构造成 PreparedStatement 对象对 SQL 语句进行预解析,然后把结果发给数据库!!
    
    为什么要在本地解析SQL语句:这个解析过程是比较消耗时间和资源的,而数据库要日理万机,要处理很多客户端的其请求。把所有的解析工作都交给服务器来完成,会让本就不富裕的系统资源雪上加霜!所以就把一部好解析工作,放到客户端来完成。
    

    这里就要写我们想要执行的语句,例如往 test库中 student 表中插入一个学生数据

    1. String sql = "insert into student values(1,'张三')";
    2. PreparedStatement statement = connection.prepareStatement(sql);

    这里大家要注意一点,例如使用 Java/C++/Python.... 操作数据库,本质上还是通过 SQL语句来操作 !!

    4) 执行 SQL

    执行方法有两个,如下

    方法名作用返回值
    executeUpdate对应插入、删除、修改语句返回这次 SQL 操作影响到的行数(整数类型)
    executeQuery对应查询语句返回 临时表数据
    int n = statement.executeUpdate();

    5)完成滞后于,关闭释放资源

    前面的语句对象和连接对象,都需要消耗资源。需要我们手动释放资源,这里主要释放内存资源。

    1. statement.close();
    2. connection.close();

    注意:这里释放资源的顺序,要和之前申请资源的顺序正好相反(先创建的后释放,后创建的先释放)

    6)总代码

    1. public static void main(String[] args) throws SQLException {
    2. //1. 创建数据源对象
    3. DataSource dataSource = new MysqlDataSource();
    4. ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false");
    5. ((MysqlDataSource) dataSource).setUser("root");
    6. ((MysqlDataSource) dataSource).setPassword("123456");
    7. //2. 让代码和数据库建立连接
    8. Connection connection = (Connection) dataSource.getConnection();
    9. //3. 构造要执行的 SQL 语句【构造请求】
    10. String sql = "insert into student values(1,'张三')";
    11. PreparedStatement statement = connection.prepareStatement(sql);
    12. //4. 执行SQL 【发送请求 & 读取响应】
    13. int n = statement.executeUpdate();
    14. //5. 完成之后,需要关闭释放相关资源
    15. statement.close();
    16. connection.close();
    17. }

     7)拓展:通过字符串拼接的方式,让用户输入数据进行插入

    我们可以手动拼装 SQL 语句,将我们想插入的数据替换成变量,然后在拼接到 SQL 语句中,如下

    1. //[用户输入] 通过用户输入的数据,来确定插入的值
    2. Scanner scanner = new Scanner(System.in);
    3. System.out.println("请输入要插入的学号:");
    4. int id = scanner.nextInt();
    5. System.out.println("请输入要插入的姓名:");
    6. String name = scanner.next();
    7. //3. 构造要执行的 SQL 语句【构造请求】
    8. String sql = "insert into student values("+ id +",'"+ name +"')";

    为了方便查看拼接后 SQL 语句是否正确,我们可以打印 statement 对象来查看我们 要执行的 SQL语句

    System.out.println("statement: "+ statement);

    上述手动拼接 SQL 虽然可行,但是存在两个问题

    1. 代码非常乱 ~~尤其是拼的 SQL 变成啥样了,看不清晰,不直观

    2.不安全~容易引发SQL注入漏洞

    SQL注入例如像 name 这种,使用户自己输入的。用户可能会输入一些奇怪的东西,来对数据库进行破坏,如 name = ');drop database xxxx.... 等当 name 拼接到 SQL语句中,就会使我们原来的语句结束掉,然后执行删库操作。

    因此,应该借助 PreparedStatement 内部提供的 SQL 拼装机制,这样代码更简单更直观,同时会对拼接内容进行更加严格的校验检测,避免 SQL 注入!!

     使用 PreparedStatement 拼装机制

    第一步:在 SQL 中需要插入数据的部分用 ?做占位符

    第二步:使用 PreparedStatement 中 set 系列方法

    set数据类型(第几个'?',替换内容);

    数据类型如:Int 、String(首字母要大写)

    1. String sql = "insert into student values(?,?)";
    2. PreparedStatement statement = connection.prepareStatement(sql);
    3. statement.setInt(1,id); //替换第一个 '?'
    4. statement.setString(2,name); //替换第二个 '?'

     3、插入、删除、更新、查找

    JDBC 看起来是很麻烦的代码,实际上是固定的逻辑。而插入、删除、更新、查找这些操作其实也就第三步和第四步代码不同,其他的都一样,所以下面就只列举第三步和第四步代码了。

    大家可以那下面代码作为模板,进行练习。

    1. //1. 创建数据源对象
    2. DataSource dataSource = new MysqlDataSource();
    3. ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/数据库名?characterEncoding=utf8&useSSL=false");//自己要操作的数据库名
    4. ((MysqlDataSource) dataSource).setUser("root");
    5. ((MysqlDataSource) dataSource).setPassword("密码");//要填写自己设置的密码
    6. //2. 让代码和数据库建立连接
    7. Connection connection = (Connection) dataSource.getConnection();
    8. //3. 构造要执行的 SQL 语句【构造请求】
    9. //4. 执行SQL 【发送请求 & 读取响应】
    10. //5. 完成之后,需要关闭释放相关资源
    11. statement.close();
    12. connection.close();

    这里插入操作在上面已经当例子举了,这里就不找赘述了

    删除操作🌚

    1. //3. 构造要执行的 SQL 语句【构造请求】
    2. //[用户输入] 通过用户输入的数据,来确定更新的值
    3. Scanner scanner = new Scanner(System.in);
    4. System.out.println("请输入要删除学生的学号:");
    5. int id = scanner.nextInt();
    6. String sql = "delete from student where id = ? ";
    7. PreparedStatement statement = connection.prepareStatement(sql);
    8. statement.setInt(1,id);
    9. System.out.println("statement: "+ statement);
    10. //4. 执行SQL 【发送请求 & 读取响应】
    11. int n = statement.executeUpdate();

    更新操作🌛

    1. //3. 构造要执行的 SQL 语句【构造请求】
    2. //[用户输入] 通过用户输入的数据,来确定更新的值
    3. Scanner scanner = new Scanner(System.in);
    4. System.out.println("请输入要修改学生的学号:");
    5. int id = scanner.nextInt();
    6. System.out.println("请输入要修改姓名:");
    7. String name = scanner.next();
    8. String sql = "update student set name = ? where id = ? ";
    9. PreparedStatement statement = connection.prepareStatement(sql);
    10. statement.setInt(2,id);
    11. statement.setString(1,name);
    12. System.out.println("statement: "+ statement);
    13. //4. 执行SQL 【发送请求 & 读取响应】
    14. int n = statement.executeUpdate();

     查找操作🌜

    查找操作跟其他操作不同,在执行 SQL 中要用 executeQuery 方法

    executeQuery 方法 返回的是一个 ‘表’ 数据结构,要用 ResultSet 来接收。

    我们要想得到查找数据,还要遍历 ResultSet对象,使用 next() 方法

    next() 方法就是遍历表中的每一行,每次钓鱼共 next ,就往下走一行!!

    如果能走,就返回 true,否则就是 false

     

    在每一行中,通过 get 系列方法得到每一列的值。

    getXXX(列名/第几列);

    注意:列的类型是什么就用什么类型的变量来接收

    1. //3. 构造要执行的 SQL 语句【构造请求】
    2. String sql = "select * from student";
    3. PreparedStatement statement = connection.prepareStatement(sql);
    4. //4. 执行SQL 【发送请求 & 读取响应】
    5. // 查询语句使用 executeQuery
    6. // 返回结果是 ResultSet 结果集 里面是一个 表
    7. ResultSet resultSet = statement.executeQuery();
    8. //遍历结果集
    9. while(resultSet.next()){
    10. //此处的参数可以是列名,也可以是序号
    11. int id = resultSet.getInt("id");
    12. String name = resultSet.getString("name");
    13. System.out.println("id = "+ id +" name = " + name);
    14. }

     

  • 相关阅读:
    javacc之路1--- Token Manager
    ElementUI RUOYI 深色适配
    【电商】管理后台--采购管理(执行层)
    记一次时间序列算法的自回归预测--AR&Autoreg
    LeetCode 70. 爬楼梯
    扩散模型新应用——微软推出蛋白质生成框架EvoDiff
    使用keil反汇编时的记录
    音视频转换软件Permute mac中文板特点介绍
    查找算法【哈希表】 - 处理冲突的方法:链地址法 & 建立公共溢出区
    mysql当前数据库获取所有表名及字段名的sql
  • 原文地址:https://blog.csdn.net/weixin_53564801/article/details/126355310