JDBC实现数据库增删改查(CRUD)笔记 | 课堂实战版
前言
这篇笔记整理了课堂上用Java JDBC操作MySQL数据库实现增删改查(CRUD)的核心代码和知识点,从基础的代码实现到可优化的点逐一梳理,方便后续回顾和巩固~
一、JDBC基础认知
JDBC(Java Database Connectivity)是Java操作关系型数据库的标准接口,核心流程分为4步:
- 加载数据库驱动(MySQL 8.0+驱动类:
com.mysql.cj.jdbc.Driver); - 获取数据库连接(指定URL、用户名、密码);
- 执行SQL语句(增删改用
executeUpdate,查询用executeQuery); - 关闭数据库连接(释放资源)。
本次实战的数据库连接信息统一为:
- URL:
jdbc:mysql://localhost:3306/may7?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8(may7为数据库名,指定时区+编码); - 用户名:root(根据自己实际);
- 密码:111111(根据自己实际)。
二、增删改查(CRUD)实战
1. 新增(Create)------ Insert操作
核心逻辑:通过Statement.executeUpdate(sql)执行INSERT语句,返回受影响行数。
课堂实战中针对不同表(student、class、course、relationship)编写了对应的新增工具类,以AddStudentUtil为例:
java
package com.qcby.sql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class AddStudentUtil {
public static void main(String[] args) throws Exception {
// 新增学生的SQL语句
String sql = "insert into student(name,sex,age,sno,class_num) values('张兵','女',18,'20230101',1011)";
Add(sql);
}
public static void Add(String sql) throws Exception {
// 1.加载MySQL驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2.获取数据库连接
String url = "jdbc:mysql://localhost:3306/may7?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8";
String username= "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url,username,password);
// 3.执行新增SQL
int count = conn.createStatement().executeUpdate(sql);
// 4.关闭连接
conn.close();
}
}
其他新增类(AddClassUtil/AddCourseUtil/AddRelationshipUtil)逻辑完全一致,仅SQL语句针对不同表调整,核心都是调用executeUpdate执行INSERT语句。
2. 删除(Delete)------ Delete操作
核心逻辑:同样用Statement.executeUpdate(sql)执行DELETE语句,返回受影响行数。
以DeleteStudentUtil为例:
java
package com.qcby.sql;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
public class DeleteStudentUtil {
public static void main(String[] args) throws Exception {
// 删除学生的SQL语句
String sql = "delete from student where id=1";
delete(sql);
}
public static void delete(String sql) throws Exception {
// 1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2.获取连接
String url = "jdbc:mysql://localhost:3306/may7?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
// 3.执行删除SQL
int count = conn.createStatement().executeUpdate(sql);
// 4.关闭连接
conn.close();
}
}
DeleteClassUtil/DeleteCourseUtil/DeleteRelationshipUtil均遵循此逻辑,仅删除的表和条件不同。
3. 修改(Update)------ Update操作
核心逻辑:还是通过Statement.executeUpdate(sql)执行UPDATE语句,返回受影响行数。
⚠️ 课堂代码里有个小笔误:UpdataCourseUtil类名拼写错误(正确应为UpdateCourseUtil),实际开发要注意命名规范~
以UpdateStudentUtil为例:
java
package com.qcby.sql;
import java.sql.Connection;
import java.sql.DriverManager;
public class UpdateStudentUtil {
public static void main(String[] args) throws Exception {
// 修改学生信息的SQL语句
String sql = "update student set name='王王' where id=3";;
Update(sql);
}
public static void Update(String sql) throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
String url ="jdbc:mysql://localhost:3306/may7?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url,username,password);
int count = conn.createStatement().executeUpdate(sql);
conn.close();
}
}
UpdateClassUtil/UpdateRelationshipUtil/UpdataCourseUtil都是修改不同表的字段,核心逻辑无差异。
4. 查询(Retrieve)------ Select操作
查询和增删改不同,需要用Statement.executeQuery(sql)执行SELECT语句,返回ResultSet结果集,再遍历结果集获取数据。
课堂示例SearchUtil(查询relationship表):
java
package com.qcby;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
public class SearchUtil {
public static void main(String[] args) throws Exception {
String sql = "select * from relationship";
search(sql);
}
public static void search(String sql) throws Exception {
// 1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2.获取连接
String url = "jdbc:mysql://localhost:3306/may7?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);
// 3.执行查询SQL,获取结果集
ResultSet rs = conn.createStatement().executeQuery(sql);
// 4.遍历结果集
while (rs.next()) {
String id=rs.getString("id");
String sno=rs.getString("sno");
String cno=rs.getString("cno");
System.out.println(id);
System.out.println(sno);
System.out.println(cno);
System.out.println("-----------------");
}
}
}
三、代码优化点(课堂延伸)
课堂上的代码是最基础的实现,实际开发中需要优化以下几点:
- 重复代码封装 :驱动加载、连接获取、连接关闭这些逻辑在每个类中都重复了,可封装成
JDBCUtil工具类,减少冗余; - 资源安全关闭 :当前代码直接
conn.close(),如果执行SQL时抛出异常,连接可能无法关闭,需用try-catch-finally或JDK7+的try-with-resources自动关闭资源; - SQL注入风险 :使用
Statement执行SQL存在注入风险,建议替换为PreparedStatement(预编译SQL); - 命名规范统一 :比如
DeleteStudentUtil的方法是delete(小写),其他删除类是Delete(大写),类名/方法名要统一; - 异常处理 :当前代码直接
throws Exception,实际需捕获具体异常(如ClassNotFoundException/SQLException)并合理处理。
四、总结
本次课堂实战的核心是掌握JDBC操作数据库的核心流程:
加载驱动 → 获取连接 → 执行SQL → 处理结果 → 关闭连接
增删改的核心是executeUpdate(返回受影响行数),查询的核心是executeQuery(返回结果集)。
这些基础代码是理解JDBC的关键,后续学习中可以基于此封装工具类、引入数据库连接池(如Druid)、结合ORM框架(如MyBatis)进一步简化开发,但底层的JDBC逻辑是根基,一定要吃透~