目录
参考资料
Java JDBC编程实验参考文件
MySQL Conncetor jar文件
MySQL操作视频
数据库相关jar文件请参考QQ群文件。
第1次实验
1.使用控制台操作数据库
MySQL数据库基本操作
- 完整演示一遍登录、打开数据库、建表、插入
- 常见错误:语句后未跟
;
,SQL中出现中文的标点符号, 未use数据库直接建表 - 技巧:打开文本编辑器,将正确的建表命令粘贴进去,然后在下面对照着打
参考资料:
实验任务书题目1, 视频1、视频2。
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,birthdate) values('201710001', 'zhangsan', 18,'1992-10-01');
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');
# 查询数据
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命令。可能会出错,为什么?
其他:使用GUI管理数据库
5分钟入门MySQL Workbench(免费)
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加入项目?
- 右键点击项目,新建lib目录(Folder),将对应jar拷贝进该目录。注意:是右键点击"项目",而不是点击"src"。
- 右键点击项目->Properties->Build Path->Configure Build Path->选择"Libraries"->点击"Add JARs"将刚才的jar文件添加进来。
- 注意:Java 11下需在module-info.java中添加requires java.sql;
- 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
- 版本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连接供参考
3. PreparedStatement与参数化查询
任务
- 使用PreparedStatement:参考实验任务书-题目3(尝试使用JDBCUtil.java,编写第一个演示PreparedStatement的代码)
- 选做:批量插入,参考:BatchUpdateTest.java。
参考资料:
代码:参考代码\重要-数据库访问dao模式\utils**目录下的JDBCUtil.java**
PreparedStatementTest1.java
4. 事务处理(可选)
- 参见:实验任务书题目4
- 参考:TransactionTest.java
5.JDBCUtil与DAO(推荐)
- 参见:实验任务书题目5
6. 数据库连接池
- 参见:实验任务书题目6
- 使用C3P0数据库连接池,也可尝试使用最近比较流行的Druid数据库连接池(阿里开发)或Spring默认的数据库连接池(HikiriCP)
- 数据连接池参考资料
- 数据库连接池(Druid的简单使用)
- JDBC数据库连接池Druid详解