0. 本周课程设计发布
1. 本周学习总结
1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容。
1.思维导图如下:
2.补充:
- 数据库
- 为了实现一定目的按某种规则组织起来的“数据”的“集合”
- 关系型数据库系统:使用表(table)来存储数据;使用行(row)区分不同记录,每行代表一条记录,每一行由若干列(column,字段)组成;表中一列中的数据类型必须一致
- 主键:通过主键可以唯一的确定一条记录,也可以通过多个列的联合确定主键
- 数据库的完整性规则
- 关系表中的行必须是唯一的,所以必须有主键,且主键不能为空。
- 列是不可分的
- 某些行的某些列的值可以为null
- 注意:null代表没有赋值,而不是指空值或者0
- MySql数据库简单操作
- 显示所有数据库: show databases;
- 创建数据库: create database test;
- 删除数据库: drop database test;
- 连接数据库: use test;//使用数据库前,要先连接数据库
- 查看当前连接的数据库: select database();
- 当前数据库包含的表: show tables;
- 退出MySQL:quit或exit
- 删除表 drop table students;
- 插入数据 insert into students(stuno,name,gender,birthdate,major,age) values('201010001', 'zhangsan', 'm', '1992-10-01','cs',25);
- 查询表中的数据 select * from students;
- 删除表中数据->删除students表中编号为1 的记录 delete from students where id = 1;
- 常见的SQL语句主要分为两大类:查 与 增、删、改
- 查-select * from students where name='张三'
- 改-update 更新 : update student set name = '李四' where id = 1
- 增-insert 插入:insert into students(stuno,name,gender) values('201500001','李四','m');
- 删-delete 删除:delete from students where id = 1;
- JDBC编程一般步骤
- 装载驱动 //jdbc 4.0不再需要手动加载
- 与数据库建立连接(Connection)
- 向数据库发送SQL语句(statement)
- 获得和处理查询或更新语句返回的结过(注:使用查询语句可获得ResultSet)
- 关闭连接,释放资源
- JDBC的工作原理
- PreparedStatement
- PreparedStatement接口继承自Statement接口
- PreparedStatement比普通的Statement对象使用起来更加灵活,更有效率
- 在SQL字符串中,使用问号(?)作为参数,在运行时动态加载
2. 书面作业
1. MySQL数据库基本操作
建立数据库,将自己的姓名、学号作为一条记录插入。(截图,需出现自己的学号、姓名)
在自己建立的数据库上执行常见SQL语句(截图)
-参考:实验任务书-题目1
答:操作过程截图如下,其中红色的字为注释
2. 使用JDBC连接数据库与Statement
2.1 使用Statement操作数据库。(粘贴一段你认为比较有价值的代码,出现学号)
//201521123004
Connection con = null;
Statement statement = null;
ResultSet rs = null;
try {
int resultNum = 0;
String driverName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=GBK";
String userName = "root";
String password = "123456";
try {
Class.forName(driverName); //加载MySql的驱动程序,jdbc4.0不再需要
} catch (ClassNotFoundException e) {
System.out.println("无法找到驱动类");
}
//连接test数据库,userUnicode和characterEncoding是正常插入中文所需要的,用户名为root,密码为123456
con = DriverManager
.getConnection(url,userName,password);
//演示如何插入记录
String strSql = "insert into students(stuno,name,gender,birthdate,major,age) values('201010005', '周杰伦', 'm',now(),'音乐',21);";
statement = con.createStatement();
resultNum = statement.executeUpdate(strSql);
System.out.println(resultNum+"条记录已经插入");
//第一次执行Sql语句完,因为后面还要执行sql语句,所以不需要把statement和connection关闭
//下面演示如何删除记录
strSql = "delete from students where id='2'";//删除id=2的数据
resultNum = statement.executeUpdate(strSql);
System.out.println(resultNum+"条记录删除完毕");
//下面演示如何更新记录
strSql = "update students set major='中文' where id='1'";//更新id=2的数据
resultNum = statement.executeUpdate(strSql);
System.out.println(resultNum+"条记录更新完毕");
//数据库现有记录数
strSql = "select count(*) from students";//查询news表中的记录数量
rs = statement.executeQuery(strSql);
if(rs.next()){
resultNum = rs.getInt(1);//取出第一列的值,注意:返回只有一列
System.out.println("数据库存在"+resultNum+"条记录数据库");
}
//数据库中存在如下记录
//strSql = "select * from news";
strSql = "select stuno,name,birthdate,major from students";
rs = statement.executeQuery(strSql);
System.out.println("学号\t\t姓名\t出生日期\t\t专业");
while(rs.next()){
System.out.print(rs.getString("stuno")+"\t");//根据列名取值
System.out.print(rs.getString(2)+"\t");//根据列的顺序取值,如name在上述Sql语句中的第2列
System.out.print(rs.getDate("birthdate")+"\t");//根据列名取值
System.out.print(rs.getString(4)+"\t\n");//根据列的顺序取值,如major在第4列
}
} catch (SQLException sqlE) {
sqlE.printStackTrace();
} finally {
System.out.println("释放所有资源....");
try {
if (con != null)
con.close();//关闭连接
con = null; //促使GC尽快回收资源
} catch (Exception ex) {
ex.printStackTrace();
}
}
2.2 使用JDBC操作数据库主要包含哪几个步骤?
-参考:实验任务书-题目2
一般步骤:
1.装载驱动 //jdbc 4.0不再需要手动加载
2.与数据库建立连接(Connection)
3.向数据库发送SQL语句(statement)
4.获得和处理查询或更新语句返回的结果
注:使用查询语句可获得ResultSet
5.关闭连接,释放资源
-
- 在Eclipse中导入连接数据库所需要的jar文件。
- 步骤
- a. 在项目下新建lib目录
- b. 将相关jar包拷贝到lib目录
- c. 在项目的Build Path中导入该jar包
- d. 在项目中导入ConnectMySQL.java,尝试运行。
- 常见问题:
- No suitable driver found….-没有导入相应的数据库驱动jar包
- Access denied….-一般是用户名密码错误
- Table xxx doesn’t exist..-xxx表不存在,一般来说是表名写错
- unknown column xxx in ‘field list’-列名xxx不在表中,一般来说是列名写错
- 使用Statement操作数据库
-
小技巧:在java代码中编写SQL语句之前,先在MySQL命令行下调试好SQL语句。
- 编写如下方法:
- public static void displayAll(){....} //显示所有学生的学号、名字和出生时间,select
- public static int insert(Student stu){.....} //插入学生,insert
- public static void displayAllOrderByIdDesc(int id){.....} //打印出学生的ID号、姓名和出生年日期,并按id降序排列。
- public int deleteStudent(int id){....} //按id删除某个学生,返回值为删除学生的个数,delete
- public static int updateStudentAge(){...}//将每个学生的年龄+1,update语句
- 编写如下方法:
3. PreparedStatement与参数化查询
3.1 使用PreparedStatement根据用户指定的查询条件进行查询。(粘贴一段你认为比较有价值的代码,出现学号)
Connection con = null;
Statement statement = null;
ResultSet rs = null;
try {
int resultNum = 0;
String driverName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=GBK";
String userName = "root";
String password = "123456";
try {
Class.forName(driverName); //加载MySql的驱动程序,jdbc4.0不再需要
} catch (ClassNotFoundException e) {
System.out.println("无法找到驱动类");
}
//连接test数据库,userUnicode和characterEncoding是正常插入中文所需要的,用户名为root,密码为123456
con = DriverManager
.getConnection(url,userName,password);
//插入记录
String strSql = "insert into students(stuno,name,age,birthdate) values(?,?,?,?);";
statement = con.createStatement();
resultNum = statement.executeUpdate(strSql);
System.out.println(resultNum+"条记录已经插入");
//第一次执行Sql语句完,因为后面还要执行sql语句,所以不需要把statement和connection关闭
//删除记录
strSql = "delete from students where id='2'";//删除id=2的数据
resultNum = statement.executeUpdate(strSql);
System.out.println(resultNum+"条记录删除完毕");
//更新记录
strSql = "update students set major='中文' where id='1'";//更新id=2的数据
resultNum = statement.executeUpdate(strSql);
System.out.println(resultNum+"条记录更新完毕");
//数据库现有记录数
strSql = "select count(*) from students";//查询news表中的记录数量
rs = statement.executeQuery(strSql);
if(rs.next()){
resultNum = rs.getInt(1);//取出第一列的值,注意:返回只有一列
System.out.println("数据库存在"+resultNum+"条记录数据库");
}
//数据库中存在如下记录
//strSql = "select * from news";
strSql = "select stuno,name,birthdate,major from students";
rs = statement.executeQuery(strSql);
System.out.println("学号\t\t姓名\t出生日期\t\t专业");
while(rs.next()){
System.out.print(rs.getString("stuno")+"\t");//根据列名取值
System.out.print(rs.getString(2)+"\t");//根据列的顺序取值,如name在上述Sql语句中的第2列
System.out.print(rs.getDate("birthdate")+"\t");//根据列名取值
System.out.print(rs.getString(4)+"\t\n");//根据列的顺序取值,如major在第4列
}
} catch (SQLException sqlE) {
sqlE.printStackTrace();
} finally {
System.out.println("释放所有资源....");
try {
if (con != null)
con.close();//关闭连接
con = null; //促使GC尽快回收资源
} catch (Exception ex) {
ex.printStackTrace();
}
}
3.2 批量更新-批量插入1000个学生,统计整个操作所消耗的时间。(使用方法executeBatch
)
1.关键代码
2.时间统计
参考:实验任务书-题目3
4. JDBCUtil与DAO
4.1 粘贴一段你认为比较有价值的代码,出现学号
1.将数据写入表格
2.将表中数据读出
3.输出表中全部信息
4.2 使用DAO模式访问数据库有什么好处?
1.使用AO模式访问数据库就不需要关心参数是什么类型,在之后对程序的修改,只需对DAO模式中的某个方法修改即可,不需要整个项目都进行修改。
2.相对于servlet,DAO的存在大部分是为了理清思路,代码简洁易懂,将各个部分的代码分开写,思路要清更加晰些,而且方便维护
5. 使用数据库改造购物车系统
5.1 使用数据库改造以前的购物车系统(应有图形界面)。如果以前为完成购物车系统,可编写基于数据库的学生管理系统。包括对学生的增删改查,要求使用。
1.数据库Book表
2.表的创建
id int not null primary key auto_increment,
name char(12) not null,
price double not null,
num int not null);
3.数据插入
insert into Book(name,price,num) values('java',100.00,15);
3.图形界面
5.2 相比较使用文件,使用数据库存储与管理数据有何不一样?
首先,数据库存储比文件存储能更方便与程序结合;
其次,一旦数据量庞大,用文件管理对数据进行操作是十分吃力的,好比大海捞针,但是相反,数据库对于大量的数据也能很高效;
再者,数据库相对于文件会更安全。
选做:6. 批量更新测试
数据库课程上,需要测试索引对查找的加速作用。然而在几百或几千的数据量上进行操作无法直观地体验到索引的加速作用。现希望编写一个程序,批量插入1000万条数据,且该数据中的某些字段的内容可以随机生成。
6.1 截图你的代码(出现学号)、统计运行时间
6.2 计算插入的速度到底有多快?(以条/秒
、KB/秒
两种方式计算)
选做:7. 事务处理
7.1 使用代码与运行结果证明你确实实现了事务处理功能。(粘贴一段你认为比较有价值的代码,出现学号)
7.2 你觉得什么时候需要使用事务处理?
参考:实验任务书-题目4
选做 8. 数据库连接池
使用数据库连接池改写题目5
参考:实验任务书-题目4
数据连接池参考资料