集美大学 计算机 郑如滨

教学博客

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

参考资料

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

任务

  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. 右键点击项目,新建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. 使用PreparedStatement:参考实验任务书-题目3(尝试使用JDBCUtil.java,编写第一个演示PreparedStatement的代码)
  2. 选做:批量插入,参考:BatchUpdateTest.java。

参考资料:

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


4. 事务处理(可选)

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

5.JDBCUtil与DAO(推荐)

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

6. 数据库连接池

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

下次实验

实验-12-JSP简单入门

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