集美大学 计算机 郑如滨

教学博客

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

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

任务

  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)方法格式化字符串。
    • 问题:获取连接、释放资源的冗余代码非常多。改进:尝试使用try...with...resources语法改进关闭资源的代码。
    • 改进:使用JDBCUtil.java改写,简化冗余代码。
    • 使用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. IDEA请参考文章:在test module中引用chpt03.jar
      • 简易流程:新建目录lib-拷贝connectorjar文件到lib目录-右键点击lib-Add as library...
    2. Eclipse操作步骤如下:
      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
    • 注意:JDBC 4 及以后的版本会自动加载驱动,无需关心。
  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;视频:实验视频3
JDBC访问数据库的一些小技巧
在JDBC中使用Java8的日期LocalDate、LocalDateTime
Java8中LocalDate的使用---项目中日期处理
MySQL Connector6 以上还需指定时区
com.mysql.cj.jdbc.Driver 新特性jdbc.url连接供参考

使用AI学习操作数据库与进行JDBC编程

步骤:

  1. IDE中安装Lingma插件并登录
  2. 在Lingma的智能问答模式下创建数据库(MySQL)及表。提示词:帮我创建[x]数据库,与[y]表。表结构为[z]。注意:[]中为替换占位符。
  3. 创建maven模块testdb
  4. 在Lingma的智能体模式发送提示词:当前模块testdb需要访问MySQL数据库teststu,帮我进行必要的初始化。
  5. 查看pom.xml,并在AI的帮助下简单了解其含义。
  6. 查看AI自动生成的源代码,并在AI的帮助下理解每段代码的含义。
  7. 比较智能问答智能体模式,

3. PreparedStatement与参数化查询

任务

  1. 使用PreparedStatement:参考实验任务书-题目3(尝试使用JDBCUtil.java,编写第一个演示PreparedStatement的代码)
  2. 选做:批量插入,参考: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数据库连接池(阿里开发)。

下次实验

实验-12-JSP简单入门

posted on 2017-05-23 10:51  zhrb  阅读(2052)  评论(0)    收藏  举报