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表:
在这里插入图片描述
在这里插入图片描述

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
15天前
|
安全 Java 数据库连接
gbase8a JDBC常用特性-Kerberos认证方式连接
JDBC常用特性-Kerberos认证方式连接
|
16天前
|
Java 数据库连接 网络安全
JDBC常用特性-SSH隧道连接
JDBC常用特性-SSH隧道连接
|
26天前
|
关系型数据库 MySQL 网络安全
DBeaver连接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)
“Access denied for user ''@'ip' (using password: YES)”错误通常与MySQL用户权限配置或网络设置有关。通过检查并正确配置用户名和密码、用户权限、MySQL配置文件及防火墙设置,可以有效解决此问题。希望本文能帮助您成功连接MySQL数据库。
41 4
|
29天前
|
数据库 C# 开发者
ADO.NET连接到南大通用GBase 8s数据库
ADO.NET连接到南大通用GBase 8s数据库
|
28天前
|
数据库连接 Linux Shell
Linux下ODBC与 南大通用GBase 8s数据库的无缝连接配置指南
本文详细介绍在Linux系统下配置GBase 8s数据库ODBC的过程,涵盖环境变量设置、ODBC配置文件编辑及连接测试等步骤。首先配置数据库环境变量如GBASEDBTDIR、PATH等,接着修改odbcinst.ini和odbc.ini文件,指定驱动路径、数据库名称等信息,最后通过catalog.c工具或isql命令验证ODBC连接是否成功。
|
1月前
|
安全 关系型数据库 MySQL
【赵渝强老师】MySQL的连接方式
本文介绍了MySQL数据库服务器启动后的三种连接方式:本地连接、远程连接和安全连接。详细步骤包括使用root用户登录、修改密码、创建新用户、授权及配置SSL等。并附有视频讲解,帮助读者更好地理解和操作。
161 1
|
1月前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
55 3
|
27天前
|
JSON JavaScript 关系型数据库
node.js连接GBase 8a 数据库 并进行查询代码示例
node.js连接GBase 8a 数据库 并进行查询代码示例
|
28天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(上)
|
28天前
|
数据库连接 数据库 C#
Windows下C# 通过ADO.NET方式连接南大通用GBase 8s数据库(下)
本文接续前文,深入讲解了在Windows环境下使用C#和ADO.NET操作南大通用GBase 8s数据库的方法。通过Visual Studio 2022创建项目,添加GBase 8s的DLL引用,并提供了详细的C#代码示例,涵盖数据库连接、表的创建与修改、数据的增删查改等操作,旨在帮助开发者提高数据库管理效率。