zhrb

参考资料

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 student(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

任务

  1. 运行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"; //这句可不要
  2. 编写方法public static List<Student> getAllStudents();从数据库中获得所有学生数据放入列表并返回。
    • 将数据库中得到的数据拼装成对象
  3. 编写方法public static int insert(Student stu);将Student对象插入数据库。
    • 如何将插入Student对象转换成相应的SQL语句?使用字符串拼接SQL非常麻烦且不安全,如何改进?
    • 改进:使用String.format(format, args)方法格式化字符串。会让拼接SQL字符串更容易一些,但依然会有安全问题。如何使用PreparedStatemt进行改写?
    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;		
    	
    }
  1. 思考:冗余代码非常多,如何改进?
    • 移除Class.forName方法及相关的catch字句;
    • 使用try...with...resources语法改进关闭资源的代码;
    • 重点:使用JDBCUtil工具类进行代码复用
  2. 课后任务:分别编写不同的方法来测试insert、delete、update。详见实验任务书题目2

常见问题

  1. 如何将jar加入项目?
    1. 右键点击项目,新建lib目录(Folder),将对应jar拷贝进该目录。注意:是右键点击"项目",而不是点击"src"。
    2. 右键点击项目->Properties->Build Path->Configure Build Path->选择"Libraries"->点击"Add JARs"将刚才的jar文件添加进来。
    • 注意:Java 11下需在module-info.java中添加requires java.sql;
  2. MySQL数据类型与Java数据类型的转换
    • MySQL中的varchar、char对应Java的String
    • date类型对应java.sql.Date
  3. 进阶:如何将Student类中的birthDate的类型改为JDK 8中的LocalDate?
    • 可使用java.sql.Date对象的toLocalDate()将java.sql.Date转换为java.time.LocalDate
  4. 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

参考资料:

代码:StatementTest.java、ConnectMySQL.java
在JDBC中使用Java8的日期LocalDate、LocalDateTime
Java8中LocalDate的使用---项目中日期处理
实验视频3
MySQL Connector6 以上还需指定时区
com.mysql.cj.jdbc.Driver 新特性jdbc.url连接供参考

3. PreparedStatement与参数化查询

任务

  1. 重要:使用JDBCUtil.java改造你的代码。课堂上进行演示。
  2. 课后任务:参考实验任务书题目3
  3. 选做:批量插入,参考:BatchUpdateTest.java。

参考资料:

代码:参考代码\重要-数据库访问dao模式\utils**目录下的JDBCUtil.java**
PreparedStatementTest.java


4. 事务处理

  • 参见:实验任务书题目4
  • 参考:TransactionTest.java

5.JDBCUtil与DAO

  • 参见:实验任务书题目5

6. 数据库连接池

  • 参见:实验任务书题目6
  • 使用C3P0数据库连接池,也可尝试使用最近比较流行的Druid数据库连接池(阿里开发)或Spring默认的数据库连接池(HikiriCP)
  • 数据连接池参考资料

下次实验

实验-12-JSP简单入门

分类:

技术点:

相关文章:

  • 2021-09-29
  • 2022-12-23
  • 2021-05-31
  • 2022-12-23
  • 2022-12-23
  • 2021-12-18
  • 2021-11-07
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-12-22
  • 2021-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案