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

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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
11月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
622 158
|
10月前
|
存储 消息中间件 监控
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
蒋星熠Jaxonic,数据领域技术深耕者。擅长MySQL到ClickHouse链路改造,精通实时同步、数据校验与延迟治理,致力于构建高性能、高一致性的数据架构体系。
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
|
10月前
|
SQL Java 数据库连接
除了JDBC,还有哪些常见的数据库访问技术?
除了JDBC,还有哪些常见的数据库访问技术?
768 2
|
11月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
726 156
|
11月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
779 161
|
10月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
942 6
|
11月前
|
SQL Java 关系型数据库
Java连接MySQL数据库环境设置指南
请注意,在实际部署时应该避免将敏感信息(如用户名和密码)硬编码在源码文件里面;应该使用配置文件或者环境变量等更为安全可靠地方式管理这些信息。此外,在处理大量数据时考虑使用PreparedStatement而不是Statement可以提高性能并防止SQL注入攻击;同时也要注意正确处理异常情况,并且确保所有打开过得资源都被正确关闭释放掉以防止内存泄漏等问题发生。
477 13
|
11月前
|
SQL 关系型数据库 MySQL
MySQL数据库连接过多(Too many connections)错误处理策略
综上所述,“Too many connections”错误处理策略涉及从具体参数配置到代码层面再到系统与架构设计全方位考量与改进。每项措施都需根据具体环境进行定制化调整,并且在执行任何变更前建议先行测试评估可能带来影响。
1862 11
|
11月前
|
SQL 监控 关系型数据库
查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
以上步骤提供了直观、实用且易于理解且执行的指导方针来监管和优化数据库服务器配置。务必记得,在做任何重要变更前备份相关配置文件,并确保理解每个参数对系统性能可能产生影响后再做出调节。
920 11
|
11月前
|
SQL 关系型数据库 MySQL
排除通过IP访问MySQL时出现的连接错误问题
以上步骤涵盖了大多数遇到远程连接 MySQL 数据库时出现故障情形下所需采取措施,在执行每个步骤后都应该重新尝试建立链接以验证是否已经解决问题,在多数情形下按照以上顺序执行将能够有效地排除并修复大多数基本链接相关故障。
652 3

推荐镜像

更多