Java第11次实验(JDBC数据库编程)
参考资料
Java JDBC编程实验参考文件
MySQL操作视频
MySQL Conncetor jar文件
数据库相关jar文件还可在Q群文件查找。
1.使用控制台操作数据库
1.1 MySQL数据库基本操作
- 参考:实验任务书题目1, 视频1、视频2。
- 演示:命令行下操作数据库,登录、打开、建表、插入数据
- 常见错误:语句后未跟
;;SQL语句中出现中文的标点符号,;未use数据库直接建表。 - 建表技巧:打开文本编辑器,将建表命令粘贴进去,根据需要修改并核对后再粘贴到MySQL命令行。
MySQL命令验证1
create database teststu; # 显示所有数据库
show databases; # 查看当前数据库包含的表
use teststu; # 一定要先打开(use)数据库
show tables; # 显示数据库中的所有表,现在数据库没有表
# 建表
create table students(
id int not null primary key auto_increment,
stuno varchar(20) not null,
name varchar(20) not null,
gender varchar(1) not null,
age int,
birthdate date,
major varchar(20));
# 查看表结构
desc students;
# 插入数据
insert into students(stuno,name,gender,birthdate,major,age) values('201010001', 'zhangsan', 'm', '1992-10-01','cs',25);
# 查询
select * from students;
# 删除
delete from students where id = 1;
MySQL命令验证2
MySQL命令错误信息详解:如下代码哪里会出错?为什么?如何改正?
# 插入数据
insert into students(stuno,name,age,gender,birthdate) values('201710002', '李四', 19, '女','1991-10-01');
insert into students(stuno,name,age,gender,birthdate) values('201710001', '王五', 17, '男','1993-10-01');
insert into students(stuno,name,age,birthdate) values('201710001', 'zhangsan', 18,'1992-10-01');
# 查询数据
select stuno, age from student order by age desc; # 按年龄降序
select stuno, age from students order by age; # 按年龄升序
select * from students order by birthdate; # 按出生日期升序
select * from students order by name, birthdate; # 先按姓名再按出生日期升序
select * from students where age > 18; # 找出age>18的学生
select * from students where name = 'zhangsan'; # 找出姓名为zhangsan的学生
select * from students where age > 17 order by id desc; # 找出age>17的学生,然后按照id降序排列
其他SQL语句
drop table student; # 删除student表,需要打开(use)某个数据库
drop database test; # 删除test数据库
select database(); # 查看当前打开的数据库
也可尝试运行实验参考文件中的DBInit(实验-数据库初始化).txt中的SQL命令。可能会出错,尝试排错。
1.3 使用GUI管理数据库
5分钟入门MySQL Workbench(免费)
Navicat Premium Lite(免费)-但需注册
MySQL数据库管理工具navicat基本使用方法(收费)
2. 使用JDBC连接数据库、使用Statement
任务
- 运行
ConnectMySQL.java。会出现什么错误?为什么?- 首先要将MySQL Connector Jar导入项目。见“常见问题1"。
- 正确的URL:
String URL = "jdbc:mysql://localhost:3306/teststu?serverTimezone=Asia/Chongqing"; - MySQL Connector 6以上的驱动器类名为:
String driverName = "com.mysql.cj.jdbc.Driver"; //这句可不要
- 编写方法
public static List<Student> getAllStudents();从数据库中获得所有学生数据放入列表并返回。- 将数据库中得到的数据拼装成对象
- 编写方法
public static int insert(Student stu);将Student对象插入数据库。- 如何将插入Student对象转换成相应的SQL语句?使用字符串拼接SQL非常麻烦且不安全,如何改进?使用
String.format(format, args)方法格式化字符串。 - 问题:获取连接、释放资源的冗余代码非常多。改进:尝试使用try...with...resources语法改进关闭资源的代码。
- 改进:使用JDBCUtil.java改写,简化冗余代码。
- 使用
String.format(format, args)方法格式化字符串会让拼接SQL字符串更容易一些,但依然会有安全问题。尝试使用PreparedStatemt进行改写?
- 如何将插入Student对象转换成相应的SQL语句?使用字符串拼接SQL非常麻烦且不安全,如何改进?使用
public static void main(String[] args) {
Student s = new Student();
s.setStuno("2022123456");
s.setName("韩梅梅");
s.setAge(18);
s.setGender("女");
Date d = new Date(System.currentTimeMillis()); //获得当前日期
s.setBirthdate(d);
insert(s);//现在只是测试代码生成的SQL语句是否正确
}
public static int insert(Student stu){
// 如何编写正确的insert语句
String sqlfmt = "insert into students(stuno,name,age,gender,birthdate)"
+ " values('%s', '%s', %d, '%s','%s');";//%s代表字符串形式,%d代表十进制整数形式
String sql = String.format(sqlfmt, stu.getStuno(), stu.getName(), stu.getAge(),
stu.getGender(),stu.getBirthdate());
System.out.println(sql);
// 底下编写连接数据库、插入数据库的代码
return 0;
}
- 思考:冗余代码非常多,如何改进?
- 移除Class.forName方法及相关的catch字句;
- 使用try...with...resources语法改进关闭资源的代码;
- 重要:使用JDBCUtil工具类对连接数据库、释放资源的代码进行复用。
- 课后任务:分别编写不同的方法来测试insert、delete、update。详见实验任务书题目2。
常见问题
- 如何将jar加入项目?
- IDEA请参考文章:在test module中引用chpt03.jar。
- 简易流程:新建目录lib-拷贝connectorjar文件到lib目录-右键点击lib-
Add as library...
- 简易流程:新建目录lib-拷贝connectorjar文件到lib目录-右键点击lib-
- Eclipse操作步骤如下:
- 右键点击项目,新建lib目录(Folder),将对应jar拷贝进该目录。注意:是右键点击"项目",而不是点击"src"。
- 右键点击项目->Properties->Build Path->Configure Build Path->选择"Libraries"->点击"Add JARs"将刚才的jar文件添加进来。
- 注意:Java 11下需在module-info.java中添加requires java.sql;
- IDEA请参考文章:在test module中引用chpt03.jar。
- MySQL数据类型与Java数据类型的转换
- MySQL中的varchar、char对应Java的String
- date类型对应java.sql.Date
- 进阶:如何将Student类中的birthDate的类型改为JDK 8中的LocalDate?
- 可使用
java.sql.Date对象的toLocalDate()将java.sql.Date转换为java.time.LocalDate
- 可使用
- MySQL Connector的版本改变会影响驱动类名(driverClassName)。
- 版本5:
com.mysql.jdbc.Driver - 版本6:
com.mysql.cj.jdbc.Driver - 注意:JDBC 4 及以后的版本会自动加载驱动,无需关心。
- 版本5:
- URL
- 版本5:
jdbc:mysql://localhost:3306/test?userUnicode=true&characterEncoding=UTF-8 - 版本6及以上:
jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Chongqing
- 版本5:
参考资料:
代码:StatementTest.java、ConnectMySQL.java;视频:实验视频3
JDBC访问数据库的一些小技巧
在JDBC中使用Java8的日期LocalDate、LocalDateTime
Java8中LocalDate的使用---项目中日期处理
MySQL Connector6 以上还需指定时区。
com.mysql.cj.jdbc.Driver 新特性jdbc.url连接供参考
使用AI学习操作数据库与进行JDBC编程
步骤:
- IDE中安装Lingma插件并登录
- 在Lingma的智能问答模式下创建数据库(MySQL)及表。提示词:帮我创建[x]数据库,与[y]表。表结构为[z]。注意:[]中为替换占位符。
- 创建maven模块testdb
- 在Lingma的智能体模式发送提示词:当前模块testdb需要访问MySQL数据库teststu,帮我进行必要的初始化。
- 查看pom.xml,并在AI的帮助下简单了解其含义。
- 查看AI自动生成的源代码,并在AI的帮助下理解每段代码的含义。
- 比较智能问答与智能体模式,
3. PreparedStatement与参数化查询
任务
- 使用PreparedStatement:参考实验任务书-题目3(尝试使用JDBCUtil.java,编写第一个演示PreparedStatement的代码)
- 选做:批量插入,参考:BatchUpdateTest.java。
使用AI完成任务
使用AI编写一个展示PreparedStatement的用法小程序。参考提示词如下:
## 功能
1. 通过name查询学生列表,支持模糊查询;
2. 指定age返回小于或大于该age的学生列表
3. 显示出生年月日在某个范围内的所有学生列表
4. 显示所有年龄超过指定age的同学的年龄平均值
## 界面
包含必要的控制台菜单,也可使用GUI界面
## 约束
- 不要使用数据库连接池
- 复用当前模块中的数据库连接工具类
参考资料:
代码:参考代码\重要-数据库访问dao模式\utils**目录下的JDBCUtil.java**
PreparedStatementTest1.java
4.JDBCUtil与DAO(推荐)
- 参见:实验任务书题目5
5. 事务处理(可选)
- 参见:实验任务书题目4
- 参考代码:TransactionTest.java
6. 数据库连接池(加分)
任务(加分):使用数据库连接池改造你前面的数据库访问程序代码。
可使用轻量级的HikariCP数据库连接池(Spring默认的数据库连接池),也可稍微重一点的企业级Druid数据库连接池(阿里开发)。
- 参见:实验任务书题目6
- HikariCP 介绍。需使用Maven创建项目。
- 数据库连接池(Druid的简单使用)
- JDBC数据库连接池Druid详解

浙公网安备 33010602011771号