ZUCC数据库原理作业5
实验5 JDBC进阶(2)
一、相关知识点
1、JDBC基本概念
2、视图、索引
3、java集合框架
二、实验目的:
理解视图和索引的概念,并通过视图设计简化程序设计,通过索引设计优化查询性能;
理解java集合框架
三、实验内容:
- 设计读者视图view_reader,并修改readerManager类中相关代码。
第一步:建立读者视图,要求视图中包含读者类别名称;
第二步:改造ReaderManager类,将其中的连接查询用视图代替。
第三步:运行图书管理系统,进行各个功能的测试(读者类别管理、读者管理)
【实验结果与分析】
- 写出视图创建代码。
CREATE VIEW view_reader as select * from beanreader
- 给出改造后ReaderManager类的各个方法的代码。
- 设计图书视图view_book,并修改BookManager类中相关代码。
第一步:建立图书视图,要求视图中包含出版社名称;
第二步:改造BookManager类,将其中的连接查询用视图代替。
第三步:运行图书管理系统,进行各个功能的测试
【实验结果与分析】
- 写出视图创建代码。
CREATE VIEW view_book as select b.barcode,b.bookname,b.pubid,b.price,p.publisherName from beanbook b left join beanpublisher p on b.pubid = p.pubid;
- 给出改造后BookManager类的各个方法的代码。
- 设计读者借阅情况统计视图view_reader_static,并在BookLendManager类中添加根据读者ID提取其借阅数量的代码。
第一步:建立读者统计视图,要求视图中包含读者ID、读者姓名、借阅数量;
第二步:在BookLendManager中添加方法 public int loadReaderLendCount(String readerid) throws DbException。并编写其代码
第三步:在BookLendManager类中添加main函数,并编写上述方法的测试代码。进行功能的测试
【实验结果与分析】
- 写出视图创建代码。
CREATE view view_reader_static as select b.readerid,b.readerName,count(*) lendcount from beanreader b,beanbooklendrecord l where b.readerid = l.readerid group by l.readerid
- 给出改造后BookLendManager类的各个方法的代码。
- 索引实验:
第一步:完成IndexTest_initData类中的代码,并测试。
第二步:完成IndexTest类中的代码,并测试,记录执行结果
第三步:通过查询分析器,在BeanBookLendRecord表的readerid上建立索引
第四步:再次执行IndexTest类,记录执行结果
- 给出两个类的代码和索引建立的代码
- package cn.edu.zucc.booklib;
import java.sql.Connection;
import java.sql.SQLException;import cn.edu.zucc.booklib.control.BookLendManager;
import cn.edu.zucc.booklib.util.DBUtil;
import cn.edu.zucc.booklib.util.DbException;public class IndexTest {
/**
* @param args
*/
public static void main(String[] args) {
Connection conn=null;
try {
conn=DBUtil.getConnection();
long begin=System.currentTimeMillis();
//编写代码,随意选择一个读者,查询该读者的借阅的图书总量,并输出
BookLendManager blm = new BookLendManager();
try {
System.out.println(blm.loadReaderLendCount("R001"));
} catch (DbException e) {
throw new RuntimeException(e);
}System.out.println("耗时:"+(System.currentTimeMillis()-begin)+"毫秒");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}
}
package cn.edu.zucc.booklib;
import java.sql.Connection;
import java.sql.SQLException;
import cn.edu.zucc.booklib.control.BookLendManager;
import cn.edu.zucc.booklib.control.BookManager;
import cn.edu.zucc.booklib.control.ReaderManager;
import cn.edu.zucc.booklib.control.SystemUserManager;
import cn.edu.zucc.booklib.model.BeanBook;
import cn.edu.zucc.booklib.model.BeanReader;
import cn.edu.zucc.booklib.model.BeanSystemUser;
import cn.edu.zucc.booklib.util.BaseException;
import cn.edu.zucc.booklib.util.DBUtil;
public class IndexTest_initData {
/**
* @param args
*/
public static void main(String[] args) throws BaseException {
Connection conn=null;
try {
SystemUserManager sum = new SystemUserManager();
BeanSystemUser admin = sum.loadUser("admin");
sum.currentUser = admin;
ReaderManager rm = new ReaderManager();
BookManager bm = new BookManager();
conn=DBUtil.getConnection();
//编写代码,在数据库中添加1000个读者,读者id为:r1-r1000,
// 读者名称为:读者1-读者1000,读者类别随意从数据库中取一个
for(int i=1;i<=1000;i++){
Integer it = i;
BeanReader br = new BeanReader();
br.setReaderTypeId(4);
br.setReaderName(it.toString());
br.setReaderid("r"+it.toString());
br.setCreatorUserId(SystemUserManager.currentUser.getUserid());
rm.createReader(br);
}
System.out.println("sussesfully created");
//编写代码,在数据库中随机添加1000本,规则自定义
for(int i=1;i<=1000;i++){
Integer it = i;
BeanBook bb = new BeanBook();
bb.setBookname("BOOK"+it.toString());
bb.setBarcode("B1"+it.toString());
bb.setPrice(100);
bm.createBook(bb);
}
System.out.println("sussesfully created");
//编写代码,给所有用户借阅所有书籍,其中returnDate也用当前时间
BookLendManager blm = new BookLendManager();
for(int i=1;i<=1000;i++){
Integer it = i;
blm.lend("B1"+it.toString(),"r"+it.toString());
}
System.out.println("success");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
if(conn!=null)
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
ALTER TABLE `BeanBookLendRecord` ADD INDEX inx_1 ( `readerid` )
- 比较IndexTest类两次执行的结果,并说明索引的作用。并思考:如果我们需要经常查询某用户近期借阅的n本图书,请问,应该如何建立索引?【提示:多列索引】
变快了
- 数据统计实验:
A、在ReaderManager中,添加函数Map<String,Integer> staticTypeReaderCount()...
要求通过读者类别名称统计其读者数量,请给出代码:
Map<String,Integer> staticTypeReaderCount() throws SQLException {
HashMap<String, Integer> map = new HashMap<>();
Connection conn = DBUtil.getConnection();
String sql = " select readerTypeName,count(*) from beanreader r left join beanreadertype t on r.readerTypeId = t.readerTypeId GROUP BY readerTypeName";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
String name = rs.getString(1);
Integer count = rs.getInt(2);
map.put(name,count);
}
conn.close();
rs.close();
return map;
}
public static void main(String[] args) throws SQLException {
BookManager bm = new BookManager();
System.out.println(bm.staticTypeReaderCount());
}
B、在BookManager中,添加函数Map<String,Double> staticPublisherBookAvgPrice()... 。要求统计各出版社名称及其图书的平均价格,请给出代码:
Map<String,Double> staticPublisherBookAvgPrice(){
HashMap<String, Double> map = new HashMap<>();
Connection conn = null;
try {
conn = DBUtil.getConnection();
String sql = "select publisherName,avg(price) from beanbook,beanpublisher where beanbook.pubid = beanpublisher.pubid group by beanbook.pubid";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
String name = rs.getString(1);
Double avg = rs.getDouble(2);
map.put(name,avg);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}finally {
if(conn!= null) {
try {
conn.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
return map;
}
public static void main(String[] args) throws SQLException {
BookManager bm = new BookManager();
System.out.println(bm.staticPublisherBookAvgPrice());
}
C、在BookLendManager中,添加函数Map<String,Integer> staticReaderBookCount()... 。要求统计读者为归还的图书数量,返回结果的key为读者ID。请给出代码:
Map<String,Integer> staticReaderBookCount(){
HashMap<String, Integer> map = new HashMap<>();
Connection conn = null;
try {
conn = DBUtil.getConnection();
String sql = "select readerid,count(*) from beanbooklendrecord where returnDate is NULL GROUP BY readerid";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
String id = rs.getString(1);
Integer count = rs.getInt(2);
map.put(id,count);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}finally {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
return map;
}
- 集合对象的遍历实验:
- 编写批量借阅读书函数: public void lendbooks(String readerId,Collection<String> barcodes) .... 。其中第二个参数为图书条码集合。
public void lendbooks(String readerId,Collection<String> barcodes){
barcodes = new ArrayList<String>();
BookLendManager blm = new BookLendManager();
Connection conn = null;
try {
conn = DBUtil.getConnection();
String sql = "select barcode from beanbook";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
String code = rs.getString(1);
barcodes.add(code);
}
Iterator<String> iterator = barcodes.iterator();
while(iterator.hasNext()){
String code = iterator.next();
try {
blm.lend(code,readerId);
} catch (BaseException e) {
throw new RuntimeException(e);
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}finally {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
B、编写批量设置罚金函数:public void setPenalSum(String readerId,Map<String,Double> penalSums) .... 。其中第二个参数的key为barcode,value为改读者尚未归还图书的罚金(注意,不要设置已经归还图书的罚金)。
public void setPenalSum(String readerId,Map<String,Double> penalSums){
Set<Map.Entry<String, Double>> es = penalSums.entrySet();
Connection conn = null;
try {
conn = DBUtil.getConnection();
String sql = "update beanbooklendrecord set penalSum = ? where readerid = ? and bookbarcode = ?";
PreparedStatement ps = conn.prepareStatement(sql);
for(Map.Entry<String, Double> entry:es){
String key = entry.getKey();
Double value = entry.getValue();
ps.setDouble(1,value);
ps.setString(2,readerId);
ps.setString(3,key);
ps.execute();
}}
catch (SQLException e) {
throw new RuntimeException(e);
}finally {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
ZUCC数据库原理作业5相关推荐
- ZUCC 数据库原理 卷面题
ZUCC 数据库原理 卷面题 1.ER设计题 考点: 1.1 基本元素: 基本元素:实体,属性,联系 实体和联系可以拥有属性 联系分为三类: 一对一 一对多 多对多 数据库系统原理------ER图转 ...
- 数据库原理作业3 — JMU
题目来自:<数据库系统概论(第5版)> P155.6.对下列两个关系模式: 学生(学号,姓名,年龄,性别,家庭住址,班级号) 班级(班级号,班级名,班主任,家长) 建立以下的表: CREA ...
- 【渝粤题库】陕西师范大学200781 数据库原理及应用 作业
<数据库原理及应用>作业 一.选择题 1.在数据管理技术的发展过程中,经历了人工管理阶段.文件系统阶段和数据库系统阶段.在这几个阶段中,数据独立性最高的是____阶段. 数据库系统 B.文 ...
- 数据库原理与技术 作业及答案 复习用
目录 第一章 绪论 作业 第二章 关系数据库 作业 第3章 关系数据库标准语言SQL 作业1 第3章 关系数据库标准语言SQL 作业2 第3章 关系数据库标准语言SQL 作业3 ⭐第4章 数据库安全性 ...
- 天津大学大作业数据库原理
数据库原理 第一组: 一. SQL 语句编写题 (一) 编写 SQL 语句 对于教学数据库的三个基本表 学生 S(S#,SNAME,AGE,SEX) 学习 SC(S#,C#,GRADE) 课程 C( ...
- 中南大学 oracle试卷,数据库原理期末复习(中南大学)数据库原理、技术及应用2.ppt...
2014 春季 信息11,12 DB P,T&A-张祖平 数据库原理.技术及应用 张祖平/Zhang Zuping 电子信息工程系 School of Information Science ...
- 【毕业设计】《数据库原理及应用技术》课程指导平台的开发
文章目录 目录 系统实现思路 源文件 目录 系统实现思路 互联网的出现改变了人类的生活方式,提高了人们的工作效率和生活质量,随着互联网的发展,网络教育应运而生,实现了人类教育的一次革命.如今网上教学已 ...
- 【数据库原理实验(openGauss)】实验报告
<数据库系统原理实验>报告 文章目录 <数据库系统原理实验>报告 一.实验课程性质和教学目标 二.实验课程教学基本要求 三.实验教学内容 实验一 认识DBMS系统 (一)实验目 ...
- 《数据库原理与应用》实验一
题目来源学校课后作业,禁商业用途,仅用于课业学习 <数据库原理与应用>实验一 一.实验目的及要求 1.掌握MySQL系统的数据库创建方式. 2.掌握MySQL系统的数据表的创建方式. 3. ...
最新文章
- python自定义库文件路径
- 常用的JVM参数,你现在就记好!
- mongodb在插入数据环节避免数据重复的方法(爬虫中的使用update)
- Mac OS 软件包管理器Homebrew
- 【2018.4.21】模拟赛之四-ssl2405 巧克力【实际上是模拟】
- mysql 事务 引擎_mysql引擎和事务
- Notification添加点击意图的学习理解
- Spark SQL将rdd转换为数据集-以编程方式指定模式(Programmatically Specifying the Schema)
- JSK-24 函数规律【基础】
- c语言代码题及答案,c语言编程题精选及答案
- Docker安装以及一些常用命令
- Linux网络服务-LAMP之Php基于Apache的模块实现
- 张家口地区某一级公路设计--河北建筑工程学院
- 阿里巴巴大数据之路-数据整合管理体系
- 毕业一年一点不平凡经历,不平常的感受,有了不平常的自信
- CSS Font-awesome字体图标库文件
- 12 张图看懂 CPU 缓存一致性与 MESI 协议,真的一致吗?
- STL — 迭代器设计思维(一)
- java利用单例模式存储参数_java单例模式使用及注意事项
- Chromium OS——下载源码4之配置repo