jdbc技术连接MySQL
本篇文章写于2022年12月Java实训之后,对于jdbc技术有了一点点了解,故有了这篇文章;重点介绍java代码实现
jdbc是什么
JDBC是一种可用于执行SQL语句的JavaAPI(ApplicationProgrammingInterface应用程序设计接口)。它由一些Java语言编写的类和界面组成。JDBC为数据库应用开发人员、数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以用纯Java语言编写完整的数据库
这里的数据库指的是市面上流行的数据库。如MySQL、Oracle、SQL server等数据库。
jdbc主要能完成的任务
简单地说,JDBC能完成下列三件事:
1)同一个数据库建立连接;
2)向数据库发送SQL语句;
3)处理数据库返回的结果
本片文章的环境
java版本:jdk1.8.0_221
数据库:MySQL 5.7.26
编译器:IntelliJ IDEA 2021.2.3
代码实现
手动调用Class.forName()
先来看实现数据库连接的代码
Class.forName("com.mysql.jdbc.Driver");//加载MySQL连接驱动
加载驱动,我们进到driver类中看一下,这个类长下面这样
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
public Driver() throws SQLException {
}
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
}
关键代码为DriverManager.registerDriver(new Driver());
先new一个Driver对象,然后将他注册到DriverManager中
跟进到DriverManager.registerDriver这个方法中
public static synchronized void registerDriver(java.sql.Driver driver)
throws SQLException {
registerDriver(driver, null);
}
继续跟进registerDriver(driver, null) 方法
public static void registerDriver(java.sql.Driver driver, DriverAction da)
throws SQLException {
if (driver != null) {
//如果该驱动尚未注册,那么将他添加到 registeredDrivers 中去。这是一个支持并发情况的特殊ArrayList
registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
} else {
// This is for compatibility with the original DriverManager
throw new NullPointerException();
}
println("registerDriver: " + driver);
}
关于这个支持并发情况的ArrayList,在该类的开头有提到过
private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();
到这里Class.forName(“com.mysql.jdbc.Driver”) 的工作就完成了,工作就是:将mysql驱动注册到DriverManager中去。接下来我们看是怎么进行调用的
DriverManager.getConnection方法分析
注册完成后就可以进行MySQL的连接
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/music_db?serverTimezone=UTC&useSSL=false", "root", "root");
参数为你要连接的数据库地址+用户名和密码
这里我加上serverTimezone=UTC&useSSL=false是因为在MySQL高版本情况下因为时区的问题以及安全ssl连接问题导致连接失败,所以手动设置一下时区以及关闭ssl,关于具体内容可以看这位大佬的文章:https://blog.csdn.net/BestEternity/article/details/104382446
跟进DriverManger.getConnection方法
public static Connection getConnection(String url,
String user, String password) throws SQLException {
java.util.Properties info = new java.util.Properties();
if (user != null) {
info.put("user", user);
}
if (password != null) {
info.put("password", password);
}
return (getConnection(url, info, Reflection.getCallerClass()));
}
方法很简单判断是否非空,最后再次调用自己,继续跟进getConnetction,进到getConnection方法
对上文提到静态变量 registeredDrivers 进行了遍历,调用了connect(url, info)方法,这是一个接口,由各个不同的驱动自己实现。
那么到此为止,我们就获得了connection对象,可以对数据库进行操作了
调用方法并实现MySQL数据库操作
接下来就可以直接调用该方法对相应表进行增删改查操作了,如下
向musci_db数据库中的tb_user表中插入username=admin&password=admin的一条数据
完整实现代码
public class jdbc_insert {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("com.mysql.jdbc.Driver");//加载MySQL连接驱动
//建立MySQL连接
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/music_db?serverTimezone=UTC&useSSL=false", "root", "root");
//定义sql执行语句
String sql = "insert into tb_user(username,password) values(?,?)";
//创建并调用prepareStatement方法执行执行sql语句
PreparedStatement ps = conn.prepareStatement(sql);
//给变量赋值构成完成sql语句
ps.setString(1, "admin");//第一个?处赋username=admin
ps.setString(2, "admin");//第二个?处赋password=admin
//判断是否成功
int i = ps.executeUpdate();
if (i > 0) {
System.out.println("success!");
} else {
System.out.println("default!");
}
ps.close();
conn.close();
}
}
运行尝试是否成功,显示插入成功,并且数据库已经成功显示这条数据,关于删改查也是一样的套路,就不再详细介绍了