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

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

被折叠的 条评论
为什么被折叠?



