道家人 发表于 2025-2-18 01:42:44

【MySQL】使用 JDBC 毗连数据库

https://img-blog.csdnimg.cn/img_convert/bdeddea1780ef2b490e7277bac0f1a81.gif
文章目录



[*]前言
[*]1. 认识 JDBC
[*]

[*]1.1 概念
[*]1.2 好处

[*]2. 使用 JDBC
[*]

[*]2.1 安装数据驱动包
[*]2.2 把 jar 包导入到项目中
[*]2.3 代码编写
[*]2.4 测试结果

[*]3. 代码优化
[*]4. 源码展示
[*]结语
前言

在 MySQL 系列中,我们先容了许多内容,包括但不限于建库建表,增删查改等等,但是这些操纵都是直接在本机上的 MySQL 举行的,而在实际的开辟过程中,我们很少会这样做,更多的是通过代码(C++、Java、Python……)来操纵数据库的。本日我们就会简单先容如何通过 Java 代码来操纵数据库
1. 认识 JDBC

1.1 概念

JDBC(Java Database Connectivity)是一个 Java API,它提供了一种标准的方法,用于 Java 步伐与各种数据库举行交互。简单来说,JDBC 是一个桥梁,使得 Java 应用步伐能够实行 sql 语句,以查询、更新和管理数据库中的数据
1.2 好处


[*]平台无关性:JDBC 使我们可以在任何支持 Java 的平台上运行的数据库访问代码,而无需关心底层数据库的类型
[*]数据库无关性:JDBC 提供了同一的 API,使得我们可以使用雷同的代码布局来访问不同类型的数据库,如 MySQL、Oracle、SQL Server 等
[*]简化数据库访问:JDBC 简化了数据库访问的过程,我们不需要深入了解底层数据库的复杂性,就可以通过 JDBC 提供的接口轻松地实行数据库操纵
2. 使用 JDBC

2.1 安装数据驱动包

所谓的数据驱动包,实际上就是包含了 JDBC 操纵数据库的 API 的一个 jar 包,内里有许多的 .class 文件,我们可以在官网下载驱动包 (https://dev.mysql.com/downloads/)
也可以在 Maven 中心仓库下载(https://mvnrepository.com/),此处我们简单演示一下在 Maven 下载数据驱动包


[*] 打开 Maven 网址,搜索栏输入“Mysql”,此时最上面会出现两个结果。因为博主使用的 MySQL 版本比较老,所以选择 “经典版”
https://i-blog.csdnimg.cn/direct/cafa9517fb9b448a9d60ae68eaeb6ee1.png
[*] 点进去后就是各种版本的驱动包了。这里需要下载和你 MySQL 安装的版本一致才可,我的MySQL是 5.7 的,所以要选择 5.1 开头的,后面的小版本无所谓;假如你的 MySQL 是 8.x 版本的,那你就要选择 8 开头的驱动包了
https://img-blog.csdnimg.cn/img_convert/f32321ee23616634a53863bc6373f723.png
[*] 博主这里选择 5.1.49 这个版本,点进去后下载 jar 包
https://i-blog.csdnimg.cn/direct/272cdb8b13a84cfbb8f97c8f1c3cba2f.png
[*] 这样就下载好啦~
https://img-blog.csdnimg.cn/img_convert/4465fb2f8f36883314596a510fd9c721.png
2.2 把 jar 包导入到项目中



[*] 先新建一个 Java 项目,并在这个项目下右键创建一个目录,命名为 lib(注意不要带有中文/特殊字符)
https://i-blog.csdnimg.cn/direct/0d7cd9a0d93b4582820ca2ba3799d690.png
[*] 接着找到我们下载好的 jar 包,直接复制然后粘贴到 lib 目录中(ctrl c 和 ctrl v 即可),点击 OK
https://img-blog.csdnimg.cn/img_convert/009b02a4dae7f495394311b922bb308b.png
[*] 然后右键 lib 目录,点击 add as library,再点击 OK 就行了。此时 idea 就能主动分析出 jar 包里有什么内容了
https://img-blog.csdnimg.cn/img_convert/a48c3f2ee3b858949760be3b2e69994a.png
https://img-blog.csdnimg.cn/img_convert/836b994aea5d4265bb5a3a3a0f2ecf72.png
[*] 这样就大功告成啦
https://img-blog.csdnimg.cn/img_convert/47f7da5005d778fa6898426cd8d5b175.png
2.3 代码编写

1. 创建数据源:要毗连数据库时,我们需要知道这个数据库的位置;我们可以通过 DataSource 对象来获取
      DataSource dataSource = new MysqlDataSource();
      ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/javatest?characterEncoding=utf8&useSSL=false"); // “Javatest”是数据库名
      ((MysqlDataSource)dataSource).setUser("root");
      ((MysqlDataSource)dataSource).setPassword("xxxxxxxxx"); // 根据你安装是设置的密码填入


[*]DataSourse 是 Java 中的一个接口,不能直接创建对象,因此我们使用 MysqlDataSource 这个子类来创建对象
[*]接下来是 setURL( )、setUser( )、setPassWord( ),它们都是 MysqlDataSource 中的方法,分别服务器的 url(同一资源定位符)、服务器的账号、服务器的密码()
[*]此处我们还使用了向上转型和向下转型,目的是为了降低耦合。若之后我们使用的数据库不是 MySQL,那修改代码就非常方便
2. 和数据库服务器创建网络毗连
Connection connection = dataSource.getConnection();


[*]要注意此处的导入的包是 import java.sql.Connection 这个,不要选错了
[*]此处的 Connection 对象,表示的就是一个数据库毗连(抽象的客户端服务器毗连)
[*]此处的异常可以使用 throw 直接抛出
3. 构造 SQL 语句
好比我们现在想要在表中插入一条信息,就可以使用字符串来表示
String sql = "insert into student values ('qiqi', 77)";
接着使用 PreparedStatement 来预编译这个 sql 语句
PreparedStatement statement = connection.prepareStatement(sql);


[*]我们写的 sql 语句就可以放在 statement 这个对象内里
[*]预编译指的是它可以在客户端发送 sql 语句前,先剖析一下,从而降低服务器的工作压力
4. 实行 SQL 语句
我们需要把 sql 发送到服务器上举行实行,可以使用 statement 里的方法


[*] 假如我们要实行的是增、删、改的操纵,那就使用 executeUpdate 方法
statement.executeUpdate();

[*] 假如我们要实行的是查操纵,那就使用 executeQuery 方法
statement.executeQuery();

5. 断开毗连,释放资源
在举行类似的网络通信时,在使用完后一定要记得释放资源。我们上面创建了 connection 和 statement 两个对象,它们都需要释放,我们按照创造顺序的相反来关闭(先 statement,后 connection)
statement.close();
connection.close();
完整代码如下:
package jdbc;import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import java.util.Scanner;public class TestUpdate {    public static void main(String[] args) throws SQLException {      //1.创建数据源对象(基本是默认的)      DataSource dataSource = new MysqlDataSource();      ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/javatest?characterEncoding=utf8&useSSL=false");      ((MysqlDataSource)dataSource).setUser("root");      ((MysqlDataSource)dataSource).setPassword("xxxxxxxxx");      //2.和数据库服务器创建网络毗连(选择Connection java.sql包)      Connection connection = dataSource.getConnection();
      //System.out.println(connection);//测试毗连是否乐成      //3.构造sql语句(基于PreparedStatement预处置惩罚)      String sql = "insert into student values ('qiqi', 77)";
//写死的      //4.把sql发送到服务器上举行实行      //statement.executeQuery()查询      //statement.executeUpdate()增删改      int n = statement.executeUpdate();
//影响的行数      System.out.println(n);      //5.释放上述资源(倒着释放)      statement.close();      connection.close();    }} 2.4 测试结果

https://img-blog.csdnimg.cn/img_convert/0322f795fff966c213533be0db7af8c8.png
终极打印 1,即影响的行数,表示插入乐成
3. 代码优化

String sql = "insert into student values ('qiqi', 77)";
//写死的

[*] 我们这里是把插入的 sql 给写死了,假如我们能够在控制台输入我们需要插入的信息,岂不美哉。因此得把代码修改一下
    //用户输入
    Scanner scanner = new Scanner(System.in);
    System.out.println("请输入姓名:");
    String name = scanner.nextLine();
    System.out.println("请输入分数:");
    int grade = scanner.nextInt();

        //修改sql语句
        String sql = "insert into a values ('"+ name +"',"+ grade +")";

[*] 这时候就可以通过控制台输入信息了。但是此处另有点小瑕疵,它有可能会引起 sql 注入攻击,别人可以通过代码直接拼接构造 sql 语句导致 sql 语句被恶意篡改(有一篇 2012 年的新闻报道了 sql 注入事件,感兴趣的可以看一下( 网传技能流号牌遮挡能干掉交警数据库 警方辟谣)
[*] 所以我们可以把 sql 语句再修改一下,使用占位符 “ ?”
String sql = “insert into a values (?,?)”;//?为占位符
接着通过 statement 对象内里的 setInt() 和 setString() 方法来设置这两个字段,从而将这个 sql 语句构造完整,这样就能防止 sql 注入攻击啦
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);statement.setString(2, name); 补充:数据库的查找操纵
上面我们提到了,假如我们要实行的是查操纵,那就得使用 executeQuery 方法
除此之外,返回的结果也不一样:


[*] 假如是增、删、改操纵的话,返回的就只是一个 int 类型的值,表示影响的行数,可以查验 sql 语句是否实行乐成
[*] 但是对于查操纵,它会返回一个结果集,也就是我们查询的结果,因此我们可以使用ResultSet 对象来举行接收,接着遍历内里的内容。最后也要记得关闭它哦
[*] 其他的代码就和上面的插入是一样的
package jdbc;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Testselect {
public static void main(String[] args) throws SQLException {
DataSource dataSource = new MysqlDataSource();
((MysqlDataSource)dataSource).setURL(“jdbc:mysql://127.0.0.1:3306/javatest?characterEncoding=utf8&useSSL=false”);
((MysqlDataSource)dataSource).setUser(“root”);
((MysqlDataSource)dataSource).setPassword(“xxxxxxxxx”);
    Connection connection = dataSource.getConnection();
    String sql = "select * from student";    PreparedStatement statement = connection.prepareStatement(sql);
    //一个聚集类,可以遍历得到    ResultSet resultSet = statement.executeQuery();
    //遍历结果    while (resultSet.next()) {      System.out.println(resultSet.getString("name"));      System.out.println(resultSet.getInt("grade"));    }    resultSet.close();    statement.close();    connection.close();} }
运行结果如下:
https://img-blog.csdnimg.cn/img_convert/c107a880238051679557915077510a27.png
4. 源码展示

插入操纵
package jdbc;import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import java.util.Scanner;public class TestUpdate {    public static void main(String[] args) throws SQLException {      //0.用户输入      Scanner scanner = new Scanner(System.in);      System.out.println("请输入姓名:");      String name = scanner.nextLine();      System.out.println("请输入分数:");      int grade = scanner.nextInt();      //1.创建数据源对象(基本是默认的)      DataSource dataSource = new MysqlDataSource();      ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/javatest?characterEncoding=utf8&useSSL=false");      ((MysqlDataSource)dataSource).setUser("root");      ((MysqlDataSource)dataSource).setPassword("xxxxxxxxx");      //2.和数据库服务器创建网络毗连(选Connection java.sql包)      Connection connection = dataSource.getConnection();
      //System.out.println(connection);//测试毗连是否乐成      //3.构造sql语句(基于PreparedStatement预处置惩罚)      //String sql = "insert into student values ('qiqi', 77)";
//写死的      //String sql = "insert into student values ('"+name+"',"+grade+")";      //代码看起来乱,而且可能会被“sql注入攻击”---> ');drop database xxx;      String sql = "insert into student values (?,?)";//?为占位符      //String sql = "delete from a where name = ?";//删除也是一样      PreparedStatement statement = connection.prepareStatement(sql);
//预编译      statement.setString(1,name); //1表示第一个问号      statement.setInt(2,grade);      //4.把sql发送到服务器上举行实行      //executeQuery()查询      //executeUpdate()增删改      int n = statement.executeUpdate();
//影响的行数      System.out.println(n);      //5.释放上述资源(倒着释放)      statement.close();      connection.close();    }} 查询操纵
package jdbc;import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;import javax.sql.DataSource;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class Testselect {    public static void main(String[] args) throws SQLException {      DataSource dataSource = new MysqlDataSource();      ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/javatest?characterEncoding=utf8&useSSL=false");      ((MysqlDataSource)dataSource).setUser("root");      ((MysqlDataSource)dataSource).setPassword("xxxxxxxxx");      Connection connection = dataSource.getConnection();
      String sql = "select * from student";      PreparedStatement statement = connection.prepareStatement(sql);
      //一个聚集类,可以遍历得到      ResultSet resultSet = statement.executeQuery();
      //遍历结果      while (resultSet.next()) {            System.out.println(resultSet.getString("name"));            System.out.println(resultSet.getInt("grade"));      }      resultSet.close();      statement.close();      connection.close();    }} 结语

本日我们先容了如何使用 JDBC 毗连数据库,通过代码来直接操纵 MySQL 数据库,上面展示的操纵方法还是比较粗糙的,而且随着技能的不断更新,我们也很少会直接使用 JDBC 了。但是理解上述的操纵方法对我们来说肯定是有作用,在后续使用框架的时候,底层原理还是离不开这个操纵思绪的。接下来是博主的一些碎碎念 (●’’●)
一个月没写博客了,有点生疏,加上需要回首前面的知识以及查阅资料,确实需要消耗更多的时间。不知道值不值得继续,但是总觉得学习完一个知识点后不总结篇博客就不得劲,本身写的东西到时候往返顾应该也更加得心应手吧。接下来我更加努力更新博客,加油 ( _)
希望各人能够喜欢本篇博客,有总结不到位的地方还请多多谅解。如有马虎,希望大佬们能够在私信或批评区指正,博主会及时改正,共同进步

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【MySQL】使用 JDBC 毗连数据库