JDBC连接MySQL数据库(截图+注释+详细分析+知识延伸)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: JDBC连接MySQL数据库(截图+注释+详细分析+知识延伸)

前言:JDBC(Java Database Connectivity),中文翻译为:Java数据库连接,是Java和数据库之间的一个桥梁,是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了查询、更新数据库等方法。
简单来说JDBC的作用:与数据库建立连接,发送操作数据库的语句,然后处理结果。

说明:
如果已经准备好相应的jar包,可以从第二条开始看起。
本篇博文写的范围比较广,可以在目录中选择自己需要的方面去了解!
本人写了代码后,都测试了一遍,代码部分几乎没问题!
此篇博文本人肝了两天半,对于初学者来说,应该算是介绍得比较全面了!

一.导入相应版本的jar包

mysql-connector-java在Java应用程序通过JDBC访问mySQL数据库时需要该包支持,是一个驱动包,下载及导入过程:
1.百度搜索maven,如下图,点击第一个链接:在这里插入图片描述
2.按照提示点击,通过测试
在这里插入图片描述
3.进入主页面之后,在搜索栏中输入mysql,选择第一个MySQL Connector在这里插入图片描述
4.点进进入之后,会有很多版本,我们根据自己mysql数据库的版本,选择对应年份发布的mysql-connector-java
比如我的mysql版本是8.0.11,它是2018年4月份发布的,一般我们选择同年或之后发布的更高版本是不会出错的,我选择的是目前的最新 版本mysql-connector-java-8.0.21.jar,点击选择它在这里插入图片描述
5.之后我们点击jar即可下载
在这里插入图片描述
6.下载好文件之后,我们在module中新建一个Directory,取名为lib在这里插入图片描述
7.然后把刚下载好的jar包直接拖到lib里面去,根据提示点击ok,导入完成!
在这里插入图片描述
在这里插入图片描述
8.导入后我们看不了jar包中的内容,我们在lib上点击右键选择Add as Library… ,点击ok。
在这里插入图片描述
9.之后我们就可以看到jar包里面的内容了
在这里插入图片描述
以上就完成了驱动包的导入!

二.获取连接对象(原始方式和druid连接池方式)

1.原始的jdbc连接方式:

public class Task {
    
    @Test
    public void toTest() throws Exception {
    
        //1.加载驱动(Driver这个类)反射机制,不懂反射想了解的可以进本人主页,java栏中查看相关博文
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接对象 ,第一个参数是数据库的url,前面基本一致后面ysw_blog是数据库名
        Connection con = DriverManager.getConnection(
                "jdbc:mysql://127.0.0.1:3306/ysw_blog",
                "root",
                "你的密码");
        //输出连接对象的哈希地址
        System.out.println(con);
    }
}

测试结果截图:
在这里插入图片描述

2.druid连接池方式

这个步骤我们需要导入druid的jar包,jar包下载方式可以去maven主页下载,可以参考上面的步骤,下载好后也是直接把jar包拖入lib目录中
在这里插入图片描述
导入后lib目录下有这两个jar包
在这里插入图片描述
druid连接池方式,代码+注释如下:

 @Test
    public void toTest1() throws SQLException {
     
        //1.创建druid的数据源
        DruidDataSource ds = new DruidDataSource();
        //2.给数据源配置传入参数
        ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        ds.setUrl("jdbc:mysql://127.0.0.1:3306/ysw_blog");
        ds.setUsername("root");
        ds.setPassword("你的密码");
        //3.通过数据源可以获取连接对象
        DruidPooledConnection con = ds.getConnection();
        System.out.println(con);
    }

测试结果截图:
在这里插入图片描述
ps:红色字体不是报错,正常的

三.查询修改操作

1.使用原始的jdbc方式去对数据库进行增删改查

I.代码部分(注释详细到每一步):

import org.junit.Before;
import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Task1 {
      
    //@SuppressWarnings("all")的作用:可以让编译器不再提醒有重复行的警告
//    @SuppressWarnings("all")
    //把连接对象变成类成员,这样每次进行单元测试的时候就避免了再次写连接数据库的代码部分
     private Connection con;



    /***********************************连接数据库******************************/
    //@Before注解:在执行@Test注解之前先执行before注解
    @Before
    public void init() throws Exception {
      
        //1.加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接对象
        con = DriverManager.getConnection(
                "jdbc:mysql://127.0.0.1:3306/ysw_blog",
                "root",
                "你的密码");
    }



    /**************************************增***********************************/
    @Test
    //使用原始的jdbc连接,向数据库增加数据
    public void toTest0() throws Exception {
      
        //1.创建sql语句模版
        String sql="INSERT INTO type VALUES(null,?,?);";
        //2.获取能够执行sql语句的对象
        PreparedStatement perstmt = con.prepareStatement(sql);
        //占位符为问好,即?
        //3.给sql模板中的占位符赋值
        perstmt.setString(1,"职业");
        perstmt.setString(2,"选手");
        //4.执行sql
        perstmt.executeUpdate();
    }



    /**************************************删***********************************/
    @Test
    //使用原始的jdbc连接,删除数据库中的数据
    public void toTest1() throws Exception {
      
        //1.创建sql语句模版
        String sql="DELETE FROM type WHERE tname = ?;";
        //2.获取能够执行sql语句的对象
        PreparedStatement perstmt = con.prepareStatement(sql);
        //占位符为问好,即?
        //3.给sql模板中的占位符赋值
        perstmt.setString(1,"职业");
        //4.执行sql
        perstmt.executeUpdate();
    }



    /**************************************改***********************************/
    //使用原始的jdbc连接,修改数据库中的数据
    @Test
    public void toTest2() throws Exception {
      
        //1.创建sql语句模版
        String sql="UPDATE type SET route = ? WHERE tname = ?;";
        //2.获取能够执行sql语句的对象
        PreparedStatement perstmt = con.prepareStatement(sql);
        //占位符为问好,即?
        //3.给sql模板中的占位符赋值
        perstmt.setString(1,"jdbc更改了");
        perstmt.setString(2,"新插入的");
        //4.执行sql
        perstmt.executeUpdate();
    }



    /**************************************查***********************************/
    //使用原始的jdbc连接,查找数据库中的指定数据
    @Test
    public void toTest3() throws Exception {
      
        //1.创建sql语句模版
        String sql="SELECT * FROM type WHERE tid =? ;";
        //2.获取能够执行sql语句的对象
        PreparedStatement perstmt = con.prepareStatement(sql);
        //占位符为问好,即?
        //3.给sql模板中的占位符赋值
        perstmt.setInt(1,2);
        //4.执行sql,返回结果集rs
        ResultSet rs = perstmt.executeQuery();
        //5.如果rs中只有一行,只需判断是否有数据即可 ,如果rs有多行,可以使用循环去遍历每条数据
        if(rs.next()){
      

            //在rs.next()指向的这条查询结果中,通过对应的列序号取值
            int tid = rs.getInt(1);
            String tname = rs.getString(2);
            String route = rs.getString(3);

            //在rs.next()指向的这条查询结果中,通过对应的列名取值
            //int did = rs.getInt("tid");
            //String dname = rs.getString("tname");
            //String location = rs.getString("route");

            System.out.println(tid);
            System.out.println(tname);
            System.out.println(route);
        }

    }

    @Test
    //使用原始的jdbc连接,查找数据库中的数据所有数据
    public void toTest4() throws Exception {
      
        //1.创建sql语句模版
        String sql="SELECT * FROM type;";
        //2.获取能够执行sql语句的对象
        PreparedStatement perstmt = con.prepareStatement(sql);
        //3.执行sql,返回结果集rs
        ResultSet rs = perstmt.executeQuery();
        //4.如果rs中只有一行,只需判断是否有数据即可 ,如果rs有多行,可以使用循环去遍历每条数据
        while (rs.next()){
      
            //在rs.next()指向的这条查询结果中,通过对应的列名取值
            int tid = rs.getInt("tid");
            String tname = rs.getString("tname");
            String route = rs.getString("route");
            System.out.println(tid+"*****"+tname+"*****"+route);
        }

    }

}


上述代码各个测试部分运行后的截图:
数据库原始的数据:
在这里插入图片描述

II.增(对应上面的代码部分toTest0)

程序运行后控制台截图:
在这里插入图片描述
程序运行后数据库对应的type表截图:
在这里插入图片描述
ps:因为之前我测试时插入过两条数据,所有最后一条数据插入默认id位9

III.删(对应上面的代码部分toTest1)

程序运行后控制台截图:
在这里插入图片描述
程序运行后数据库对应的type表截图:
在这里插入图片描述

IV.改(对应上面的代码部分toTest2)

程序运行后控制台截图:
在这里插入图片描述
程序运行后数据库对应的type表截图:
在这里插入图片描述

V.查 (对应上面的代码部分toTest3和toTest4)

a.查找数据库中的指定数据,输出到控制台:

在这里插入图片描述

b.查找数据库中的所有数据,输出到控制台:

在这里插入图片描述

2.使用druid连接池方式去对数据库进行增删改查

下面只演示druid连接池方式对数据库进行查询操作,其他操作和上面的1.类似,可以参考上面的 1.使用原始的jdbc方式去对数据库进行增删改查.

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;
import org.junit.Before;
import org.junit.Test;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Task2 {
       
    //把连接对象变成类成员,这样每次进行单元测试的时候就避免了再次写连接数据库的代码部分
    private DruidPooledConnection con;

    //@Before注解:在执行@Test注解之前先执行before注解
    @Before
    public void init() throws SQLException {
       
        //1.创建druid的数据源
        DruidDataSource ds = new DruidDataSource();
        //2.给数据源配置连接参数
        ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        ds.setUrl("jdbc:mysql://127.0.0.1:3306/ysw_blog");
        ds.setUsername("root");
        ds.setPassword("你的密码");
        //3.通过数据源可以获取连接对象
        con = ds.getConnection();
    }

    //查询hero表所有数据
    @Test
    public void toTest() throws SQLException {
       
        //1.创建sql语句模版
        String sql="SELECT * FROM hero;";
        //2.获取能够执行sql语句的对象
        PreparedStatement perstmt = con.prepareStatement(sql);
        //3.执行sql,返回结果集rs
        ResultSet rs = perstmt.executeQuery();
        //4.如果rs中只有一行,只需判断是否有数据即可 ,如果rs有多行,可以使用循环去遍历每条数据
        while (rs.next()){
       
            //在rs.next()指向的这条查询结果中,通过对应的列名取值
            int id = rs.getInt("id");
            String name = rs.getString("name");
            String age = rs.getString("age");
            String sex = rs.getString("sex");
            String price = rs.getString("price");
            String type_id = rs.getString("type_id");
            System.out.println(id+"*****"+name+"*****"+age+"*****"+sex+"*****"+price+"*****"+type_id);
        }
    }
}

hero表数据:
在这里插入图片描述
上述代码测试,控制台输出:
在这里插入图片描述

四.将查询结果集rs中的数据封装到list集合中

Hero类:Hero类的一个对象对应查询集rs中的一行数据
比如我的rs集中有15行数据,可以创建15个Hero对象,把查询到的数据封装到对象中。

1.用于测试的主类:

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;
import org.junit.Before;
import org.junit.Test;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class Task2 {
        
    //把连接对象变成类成员,这样每次进行单元测试的时候就避免了再次写连接数据库的代码部分
    private DruidPooledConnection con;

    //@Before注解:在执行@Test注解之前先执行before注解
    @Before
    public void init() throws SQLException {
        
        //1.创建druid的数据源
        DruidDataSource ds = new DruidDataSource();
        //2.给数据源配置连接参数
        ds.setDriverClassName("com.mysql.cj.jdbc.Driver");
        ds.setUrl("jdbc:mysql://127.0.0.1:3306/ysw_blog");
        ds.setUsername("root");
        ds.setPassword("你的密码");
        //3.通过数据源可以获取连接对象
        con = ds.getConnection();
    }
    
    //查询hero表数据,并封装到List集合中
    @Test
    public void test2() throws SQLException {
        
        //1.创建sql语句模版
        String sql="SELECT * FROM hero;";
        //2.获取能够执行sql语句的对象
        PreparedStatement perstmt = con.prepareStatement(sql);
        //3.执行sql,返回结果集rs
        ResultSet rs = perstmt.executeQuery();
        ArrayList<Hero> list = new ArrayList<>();
        //4.如果rs中只有一行,只需判断是否有数据即可 ,如果rs有多行,可以使用循环去遍历每条数据
        while (rs.next()){
        
            //在rs.next()指向的这条查询结果中,通过对应的列名取值

            int id = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            String sex = rs.getString("sex");
            int price = rs.getInt("price");
            int type_id = rs.getInt("type_id");
            Hero hero = new Hero(id,name,age,sex,price,type_id);
            //hero对象装进list中
            list.add(hero);
        }
        //输出
        for(int i = 0 ; i < list.size() ; i++) {
        
            System.out.println(list.get(i));
        }
    }
}


2.上述代码用到的Hero类:

public class Hero {
          private int id; private String name; private int age; private String sex; private int price; private int type_id; //get set方法 public int getId() {
          return id; } public void setId(int id) {
          this.id = id; } public String getName() {
          return name; } public void setName(String name) {
          this.name = name; } public int getAge() {
          return age; } public void setAge(int age) {
          this.age = age; } public String getSex() {
          return sex; } public void setSex(String sex) {
          this.sex = sex; } public int getPrice() {
          return price; } public void setPrice(int price) {
          this.price = price; } public int getType_id() {
          return type_id; } public void setType_id(int type_id) {
          this.type_id = type_id; } //构造方法 public Hero(int id, String name, int age, String sex, int price, int type_id) {
          this.id = id; this.name = name; this.age = age; this.sex = sex; this.price = price; this.type_id = type_id; } public Hero() {
          } //重新toString,方便输出 @Override public String toString() {
          return "Hero{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", sex='" + sex + '\'' + ", price=" + price + ", type_id=" + type_id + '}'; } } 

3.运行结果截图:

在这里插入图片描述

五.DbUtils操作

1.什么是DbUtils

DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发。

2.导入DbUtils的jar包

用这个的时候,我们需要导入DbUtils的jar包,同样也是在maven上去下载,下载好jar包后直接拖入lib中,具体详细细节参考文章开始的一.,即一.导入相应版本的jar包。

3.DbUtils用到的类和方法:

QueryRunner类:它的主要作用是用来操作执行sql语句
其中有query方法:主要作用是进行查询操作
也有update方法:主页作用是进行增 删 改 操作
ResultSetHandler接口:它的作用主要针对查询到的结果进行操作

4.具体操作(代码+注释):

我们在这个过程中需要用到druid连接池去连接数据库

I.query方法使用(代码+注释+截图):

import com.alibaba.druid.pool.DruidDataSource; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import org.junit.Test; import java.sql.SQLException; import java.util.List; public class Task3 {
           @Test public void test1() throws Exception {
           //1.创建druid的数据源 DruidDataSource ds = new DruidDataSource(); //2.给数据源配置连接参数 ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); ds.setUrl("jdbc:mysql://127.0.0.1:3306/ysw_blog"); ds.setUsername("root"); ds.setPassword("你的密码"); //3.创建qr对象,需要传入数据源ds QueryRunner qr = new QueryRunner(ds); //4.查询操作,把查询到的结果级封装到了Hero的的对象中, // 比如我的rs集中有15行数据,需要创建15个Hero对象,把查询到的数据封装到对象中, //再把对象装入list集合中. List<Hero> list = qr.query("select * from hero ", new BeanListHandler<Hero>(Hero.class)); //输出 for (int i = 0; i < list.size(); i++) {
           System.out.println(list.get(i)); } } } 

运行结果截图:
在这里插入图片描述

II.update方法使用(代码+注释+截图):

 @Test public void test2() throws Exception {
            //1.创建druid的数据源 DruidDataSource ds = new DruidDataSource(); //2.给数据源配置连接参数 ds.setDriverClassName("com.mysql.cj.jdbc.Driver"); ds.setUrl("jdbc:mysql://127.0.0.1:3306/ysw_blog"); ds.setUsername("root"); ds.setPassword("你的密码"); //3.创建qr对象,需要传入数据源ds QueryRunner qr = new QueryRunner(ds); //增删改,可以直接传入执行sql语句 //增 qr.update("INSERT INTO type VALUES (NULL,?,?);","ysw","blog"); //删 qr.update("DELETE FROM type WHERE tid = ?;",6); //改 qr.update("UPDATE type SET tname = 'YuShiwen' WHERE tname = ?;","ysw"); } 

增删改运行截图:
原type表截图:
在这里插入图片描述
执行增加操作
对应的控制台输出和type表:
在这里插入图片描述
在这里插入图片描述
执行删除操作
对应的控制台输出和type表:
在这里插入图片描述

在这里插入图片描述
执行修改操作
对应的控制台输出和type表:
在这里插入图片描述
在这里插入图片描述

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
15天前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
18天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
34 2
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1630 14
|
26天前
|
存储 关系型数据库 MySQL
基于案例分析 MySQL 权限认证中的具体优先原则
【10月更文挑战第26天】本文通过具体案例分析了MySQL权限认证中的优先原则,包括全局权限、数据库级别权限和表级别权限的设置与优先级。全局权限优先于数据库级别权限,后者又优先于表级别权限。在权限冲突时,更严格的权限将被优先执行,确保数据库的安全性与资源合理分配。
|
30天前
|
Java 关系型数据库 MySQL
mysql5.7 jdbc驱动
遵循上述步骤,即可在Java项目中高效地集成MySQL 5.7 JDBC驱动,实现数据库的访问与管理。
120 1
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-24 Sqoop迁移 MySQL到Hive 与 Hive到MySQL SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
84 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-23 Sqoop 数据MySQL到HDFS(部分) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
37 0
|
1月前
|
SQL 分布式计算 关系型数据库
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
Hadoop-22 Sqoop 数据MySQL到HDFS(全量) SQL生成数据 HDFS集群 Sqoop import jdbc ETL MapReduce
46 0
|
8天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
23 1
|
10天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
25 4