JDBC连接MySql数据库(包含Druid、DbUtils)流程控制及API详解

本文详细介绍了JDBC连接MySQL数据库的流程,包括下载驱动、注册驱动、获取连接、创建Statement、执行SQL以及释放资源。同时,文章对比了Druid连接池的使用,强调了预编译与防止SQL注入的重要性。最后,探讨了Apache的DbUtils如何简化数据库操作,减少了代码量,提升了开发效率。

JDBC连接MySQL数据库(包含Druid、DbUtils)流程控制及API详解


本人在校学渣一枚,写文章主要是为了记录学习情况和方便复习,若有不正之处还请大家不吝赐教。^_^ ^_^,环境: MacOS 12.5 、 MySQL 8.0.30 、 IDEA 2022.2.2 (Community Edition) 、mysql-connector-java-8.0.30、 druid-1.2.8.jar 、 commons-dbutils-1.7.jar、 commons-dbutils-1.7-tests.jar

一、JDBC

1.JDBC(Java Database Connectivity)简介

我自己总结的白话
为什么有JDBC:因为数据库种类繁多,例如MySQL,SQL Server,Oracle等,且底层代码实现都不一样。要用Java语言对数据库操作非常繁琐,移植性差。造成学习,开发,维护成本高,所以就需要一套通用的代码来制定一套规则。大家都遵循这套规则,大大减少了成本。这个规则就是JDBC。
JDBC是什么:JDBC是由Sun公司开发的一套针对数据库的接口,具体对接口的实现由各自的数据库厂商完成。
JDBC的意义:JDBC可移植性高,一套代码可以在不同的数据库使用(也许会有小小的改动),简化了连接过程,降低了学习和开发成本。

2.控制流程
0.下载导入mysql-connector-java-8.0.30的jar包。

下载后解压 添加到工程下,我这里建了文件夹libs存放jar包。右击add as Library 点击OK 就可以用了

1.创建实体类。建好数据库和表(添加数据)方便后面使用
import java.util.Date;


public class Students {
   
   
    private String name;
    private String id;
    private String sex;
    private double score;
    private String classes;
    private String phoneNumber;
   private Date date;

    public double getScore() {
   
   
        return score;
    }

    public void setScore(double score) {
   
   
        this.score = score;
    }

    public Date getDate() {
   
   
        return date;
    }

    public void setDate(Date date) {
   
   
        this.date = date;
    }

    
    //这里需要无参的构造函数,在DbUtils会用到
    public Students() {
   
   

    }


    public Students(String name, String id, String sex, String classes, double score, String phoneNumber, Date date) {
   
   
        this.name = name;
        this.id = id;
        this.sex = sex;
        this.score = score;
        this.classes = classes;
        this.phoneNumber = phoneNumber;
        this.date = date;
    }


    @Override
    public String toString() {
   
   
        return "Students{" +
                "name='" + name + '\'' +
                ", id='" + id + '\'' +
                ", sex='" + sex + '\'' +
                ", score=" + score +
                ", classes='" + classes + '\'' +
                ", phoneNumber='" + phoneNumber + '\'' +
                ", date=" + date  +"\n"+
                '}';
    }

    public String getName() {
   
   
        return name;
    }

    public void setName(String name) {
   
   
        this.name = name;
    }

    public String getId() {
   
   
        return id;
    }

    public void setId(String id) {
   
   
        this.id = id;
    }

    public String getSex() {
   
   
        return sex;
    }

    public void setSex(String sex) {
   
   
        this.sex = sex;
    }

    public String getClasses() {
   
   
        return classes;
    }

    public void setClasses(String classes) {
   
   
        this.classes = classes;
    }

    public String getPhoneNumber() {
   
   
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
   
   
        this.phoneNumber = phoneNumber;
    }
}

数据库表设计

注意表的数据类型要和实体类对应上。表头名和属性名要一样。

2.注册驱动
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");

这里用到了Java的反射机制。通过Class类的forName方法实例化Driver类。实例化的同时执行Driver的静态代码块(注册驱动),也会在DriverManager类中注册自己(注册过一次就不需要在此注册了)
这是静态代码块
注册过的驱动会显示在这里

3.获取连接
//获取连接
 Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/Test", "root", "1234567890");
 

因为在注册驱动时,DriverManager管理了驱动并且这个类有获取连接的静态方法,传入的参数是(连接地址,用户名,密码);

Connection中有很多方法可以对connection设置,其中用的比较多的是setAutoCommit。这个方法可以设置数据库事务的提交属性。若不设置默认自动提交(sql语句执行后万一遇到问题不可以回滚,造成数据错误)。可以改成手动提交,确保事务执行的一致性、原子性。

4.创建Statement对象
Statement statement1 = connection.createStatement();
Statement statement2 = connection.createStatement();

因为Statement中有方法可以执行SQL语句。Statement有很多方法设置statement状态,这里创建两个statement对象用于执行两句SQL语句,原则上一个就够,用两个的原因在第五点讲到。
这里有个平常但也很严重的问题——SQL注入风险。JDBC中有防止sql注如风险的方法,后面讲。

5.执行SQL
  //4.执行sql语句
        
        //查询语句  返回ResultSet对象
        ResultSet set = statement1.executeQuery("select * from tb_Students where sex='男'");
        //操作语句  返回更改后受影响行数
        int count = statement2.executeUpdate("update tb_Students set ID='318102021' where name='张三'");
       

executeQuery:用于执行查询操作,返回一个ResultSet对象。
executeUpdate:执行更、删、 改操作。

这两个方法用得比较多。还有其他方法可以设置statement的状态或者获取属性。可以去文档看看。

说一下为什么创建两个statement。因为如果创建一个statement执行两句Sql,在执行executeQuery之后set中有数据,再执行executeUpdate语句,系统会自动执行set.close()操作。后面处理数据的时候就得不到set的数据。

应对方法:
1.创建两个statement。
2.先执行executeUpdate把结果存到count中,再执行executeQuery。
3.执行executeQuery得到set直接处理结果,再执行executeUpdate。
我这里为了加深印象用了麻烦的方法。

6.处理结果
 //5.处理结果
        List<Students> list = new ArrayList<>();
        while (set.next()){
   
   
            list.add(new Students(set.getString(1),set.getString(2),
                    set.getString(3), set.getString(4),
                    set.getDouble(5),set.getString(6),
                    set.getDate("date")));
        }
        System.out.println(list);
        System.out.println(count);

这里要注意的是set。ResultSet有next方法,返回类型是boolean,可用于判断是否有数据。如果有返回true,否则返回false。

next可以理解为一个按行读取数据的指针。一开始定位在第一行前面,执行到最后一行时定位在最后一行后面。

根据每个表头对应的数据类型选择合适的get方法。方法里面的参数可以是表头的位置(位置从1开始计数)例如:set.getDouble(5),也可以是表头本身,要用字符串形式穿进去,例如 set.getDate(“date”)。

得到参数后利用实体类的有参构造函数实例化对象存入list集合。

7.释放资源
//6.释放资源
        set.close();
        statement1.close();
        statement2.close();
        connection.close();

手动关闭资源。按照先打开的后关闭原则关闭

完整代码




import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class JDBCTest {
   
   

    public static void main(String[] args) throws Exception{
   
   

        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2.获取连接
        Connection connection = DriverManager
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值