实验5  JDBC进阶(2)

一、相关知识点

1、JDBC基本概念

2、视图、索引

3、java集合框架

二、实验目的:

理解视图和索引的概念,并通过视图设计简化程序设计,通过索引设计优化查询性能;

理解java集合框架

三、实验内容:

  1. 设计读者视图view_reader,并修改readerManager类中相关代码。

第一步:建立读者视图,要求视图中包含读者类别名称;

第二步:改造ReaderManager类,将其中的连接查询用视图代替。

第三步:运行图书管理系统,进行各个功能的测试(读者类别管理、读者管理)

【实验结果与分析】

  1. 写出视图创建代码。

CREATE VIEW view_reader as select * from beanreader

  1. 给出改造后ReaderManager类的各个方法的代码。
  1. 设计图书视图view_book,并修改BookManager类中相关代码。

第一步:建立图书视图,要求视图中包含出版社名称;

第二步:改造BookManager类,将其中的连接查询用视图代替。

第三步:运行图书管理系统,进行各个功能的测试

【实验结果与分析】

  1. 写出视图创建代码。

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;

  1. 给出改造后BookManager类的各个方法的代码。
  1. 设计读者借阅情况统计视图view_reader_static,并在BookLendManager类中添加根据读者ID提取其借阅数量的代码。

第一步:建立读者统计视图,要求视图中包含读者ID、读者姓名、借阅数量;

第二步:在BookLendManager中添加方法 public int loadReaderLendCount(String readerid) throws DbException。并编写其代码

第三步:在BookLendManager类中添加main函数,并编写上述方法的测试代码。进行功能的测试

【实验结果与分析】

  1. 写出视图创建代码。

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

  1. 给出改造后BookLendManager类的各个方法的代码。
  1. 索引实验:

第一步:完成IndexTest_initData类中的代码,并测试。

第二步:完成IndexTest类中的代码,并测试,记录执行结果

第三步:通过查询分析器,在BeanBookLendRecord表的readerid上建立索引

第四步:再次执行IndexTest类,记录执行结果

    1. 给出两个类的代码和索引建立的代码
  1. 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`  )

  1. 比较IndexTest类两次执行的结果,并说明索引的作用。并思考:如果我们需要经常查询某用户近期借阅的n本图书,请问,应该如何建立索引?【提示:多列索引】

变快了

  1. 数据统计实验:

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;

}

  1. 集合对象的遍历实验:
  1. 编写批量借阅读书函数: 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相关推荐

  1. ZUCC 数据库原理 卷面题

    ZUCC 数据库原理 卷面题 1.ER设计题 考点: 1.1 基本元素: 基本元素:实体,属性,联系 实体和联系可以拥有属性 联系分为三类: 一对一 一对多 多对多 数据库系统原理------ER图转 ...

  2. 数据库原理作业3 — JMU

    题目来自:<数据库系统概论(第5版)> P155.6.对下列两个关系模式: 学生(学号,姓名,年龄,性别,家庭住址,班级号) 班级(班级号,班级名,班主任,家长) 建立以下的表: CREA ...

  3. 【渝粤题库】陕西师范大学200781 数据库原理及应用 作业

    <数据库原理及应用>作业 一.选择题 1.在数据管理技术的发展过程中,经历了人工管理阶段.文件系统阶段和数据库系统阶段.在这几个阶段中,数据独立性最高的是____阶段. 数据库系统 B.文 ...

  4. 数据库原理与技术 作业及答案 复习用

    目录 第一章 绪论 作业 第二章 关系数据库 作业 第3章 关系数据库标准语言SQL 作业1 第3章 关系数据库标准语言SQL 作业2 第3章 关系数据库标准语言SQL 作业3 ⭐第4章 数据库安全性 ...

  5. 天津大学大作业数据库原理

    数据库原理 第一组: 一. SQL 语句编写题 (一)  编写 SQL 语句 对于教学数据库的三个基本表 学生 S(S#,SNAME,AGE,SEX) 学习 SC(S#,C#,GRADE) 课程 C( ...

  6. 中南大学 oracle试卷,数据库原理期末复习(中南大学)数据库原理、技术及应用2.ppt...

    2014 春季 信息11,12 DB P,T&A-张祖平 数据库原理.技术及应用 张祖平/Zhang Zuping 电子信息工程系 School of Information Science ...

  7. 【毕业设计】《数据库原理及应用技术》课程指导平台的开发

    文章目录 目录 系统实现思路 源文件 目录 系统实现思路 互联网的出现改变了人类的生活方式,提高了人们的工作效率和生活质量,随着互联网的发展,网络教育应运而生,实现了人类教育的一次革命.如今网上教学已 ...

  8. 【数据库原理实验(openGauss)】实验报告

    <数据库系统原理实验>报告 文章目录 <数据库系统原理实验>报告 一.实验课程性质和教学目标 二.实验课程教学基本要求 三.实验教学内容 实验一 认识DBMS系统 (一)实验目 ...

  9. 《数据库原理与应用》实验一

    题目来源学校课后作业,禁商业用途,仅用于课业学习 <数据库原理与应用>实验一 一.实验目的及要求 1.掌握MySQL系统的数据库创建方式. 2.掌握MySQL系统的数据表的创建方式. 3. ...

最新文章

  1. python自定义库文件路径
  2. 常用的JVM参数,你现在就记好!
  3. mongodb在插入数据环节避免数据重复的方法(爬虫中的使用update)
  4. Mac OS 软件包管理器Homebrew
  5. 【2018.4.21】模拟赛之四-ssl2405 巧克力【实际上是模拟】
  6. mysql 事务 引擎_mysql引擎和事务
  7. Notification添加点击意图的学习理解
  8. Spark SQL将rdd转换为数据集-以编程方式指定模式(Programmatically Specifying the Schema)
  9. JSK-24 函数规律【基础】
  10. c语言代码题及答案,c语言编程题精选及答案
  11. Docker安装以及一些常用命令
  12. Linux网络服务-LAMP之Php基于Apache的模块实现
  13. 张家口地区某一级公路设计--河北建筑工程学院
  14. 阿里巴巴大数据之路-数据整合管理体系
  15. 毕业一年一点不平凡经历,不平常的感受,有了不平常的自信
  16. CSS Font-awesome字体图标库文件
  17. 12 张图看懂 CPU 缓存一致性与 MESI 协议,真的一致吗?
  18. STL — 迭代器设计思维(一)
  19. java利用单例模式存储参数_java单例模式使用及注意事项
  20. Chromium OS——下载源码4之配置repo

热门文章

  1. 专升本计算机的数学考不考正态分布,高考成绩不一定是正态分布
  2. 试题 B: 顺子日期
  3. 电源系列1:LDO 基本 原理(一)
  4. 剑灵力士卡刀ahk_剑灵召唤一键卡刀代码使用图文教程
  5. css scale()方法
  6. RISC-V应用于高性能处理器的可能性
  7. oracle中 || 代表的含义
  8. 抹掉iPhone会有怎样后果 他人还能用吗
  9. God.Game 漏洞复盘:跑路还是黑客攻击?
  10. 合同太厚骑缝章怎么盖_合同骑缝章应该怎么盖?.doc