实验6

课程名称 数据库系统概论实验
实验项目名称 JDBC进阶(3)

相关知识点

  1. JDBC基本概念
  2. 批处理
  3. DAO和OR映射

实验目的:

​ 掌握批量SQL语句执行的方法,理解DAO和ORM的基本概念

实验内容:

利用批量SQL语句执行的方法实现实验5中的最后两个方法:

编写批量借阅读书函数: public void lendbooks(String readerId,Collection barcodes) … 。其中第二个参数为图书条码集合。

public void lendbooks(String readerId,Collection<String> barcodes) throws BaseException {Object[] objects = barcodes.toArray();for (int i = 0; i < objects.length; i++) {lend((String) objects[i],readerId);}
}

编写批量设置罚金函数:public void setPenalSum(String readerId,Map<String,Double> penalSums) … 。其中第二个参数的key为barcode,value为改读者尚未归还图书的罚金(注意,不要设置已经归还图书的罚金)。

public void setPenalSum(String readerId,Map<String,Double> penalSums) throws Exception {Connection conn = null;PreparedStatement ps = null;try {conn = DBUtil.getConnection();String sql = "update beanbooklendrecord set penalSum = ? where readerid = ? and bookBarcode = ? and returnDate is null";ps = conn.prepareStatement(sql);ps.setObject(2,readerId);for (Map.Entry<String,Double> x : penalSums.entrySet()) {String barcode = x.getKey();double penal = x.getValue();ps.setObject(1,penal);ps.setObject(3,barcode);ps.execute();}} catch (SQLException e) {e.printStackTrace();} finally {DBUtil.closeResorce(conn,ps);}
}

模仿SystemUserDAO类,实现BookDAO类,并改造BookManager类,使之通过BookDAO操作数据库。

给出BookDAO类代码。

package cn.edu.zucc.booklib.dao;import cn.edu.zucc.booklib.model.BeanBook;
import cn.edu.zucc.booklib.util.BaseException;
import cn.edu.zucc.booklib.util.BusinessException;
import cn.edu.zucc.booklib.util.DBUtil;
import cn.edu.zucc.booklib.util.DbException;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public class BookDAO {public List<BeanBook> searchBook(String keyword, String bookState) throws BaseException {List<BeanBook> result = new ArrayList<BeanBook>();Connection conn = null;try {conn = DBUtil.getConnection();String sql = "select * from view_book" + " where state='" + bookState + "' ";if (keyword != null && !"".equals(keyword))sql += " and (bookname like ? or barcode like ?)";sql += " order by barcode";java.sql.PreparedStatement pst = conn.prepareStatement(sql);if (keyword != null && !"".equals(keyword)) {pst.setString(1, "%" + keyword + "%");pst.setString(2, "%" + keyword + "%");}java.sql.ResultSet rs = pst.executeQuery();while (rs.next()) {BeanBook b = new BeanBook();b.setBarcode(rs.getString(1));b.setBookname(rs.getString(2));b.setPubid(rs.getString(3));b.setPrice(rs.getDouble(4));b.setState(rs.getString(5));b.setPubName(rs.getString(6));result.add(b);}} catch (SQLException e) {e.printStackTrace();throw new DbException(e);} finally {if (conn != null)try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return result;}public void createBook(BeanBook b) throws BaseException {if (b.getBarcode() == null || "".equals(b.getBarcode()) || b.getBarcode().length() > 20) {throw new BusinessException("条码必须是1-20个字");}if (b.getBookname() == null || "".equals(b.getBookname()) || b.getBookname().length() > 50) {throw new BusinessException("图书名称必须是1-50个字");}Connection conn = null;try {conn = DBUtil.getConnection();String sql = "select * from BeanBook where barcode=?";PreparedStatement pst = conn.prepareStatement(sql);pst.setString(1, b.getBarcode());ResultSet rs = pst.executeQuery();if (rs.next()) throw new BusinessException("条码已经被占用");rs.close();pst.close();sql = "insert into BeanBook(barcode,bookname,pubid,price,state) values(?,?,?,?,'在库')";PreparedStatement ps = conn.prepareStatement(sql);ps.setObject(1, b.getBarcode());ps.setObject(2, b.getBookname());ps.setString(3, b.getPubid());ps.setDouble(4, b.getPrice());ps.execute();pst.close();} catch (SQLException e) {e.printStackTrace();throw new DbException(e);} finally {if (conn != null)try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public void modifyBook(BeanBook b) throws BaseException {if (b.getBookname() == null || "".equals(b.getBookname()) || b.getBookname().length() > 50) {throw new BusinessException("图书名称必须是1-50个字");}Connection conn = null;try {conn = DBUtil.getConnection();String sql = "select * from BeanBook where barcode=?";java.sql.PreparedStatement pst = conn.prepareStatement(sql);pst.setString(1, b.getBarcode());java.sql.ResultSet rs = pst.executeQuery();if (!rs.next()) throw new BusinessException("图书不存在");rs.close();pst.close();sql = "update BeanBook set bookname=?,pubid=?,price=?,state=? where barcode=?";pst = conn.prepareStatement(sql);pst.setString(1, b.getBookname());pst.setString(2, b.getPubid());pst.setDouble(3, b.getPrice());pst.setString(4, b.getState());pst.setString(5, b.getBarcode());pst.execute();pst.close();} catch (SQLException e) {e.printStackTrace();throw new DbException(e);} finally {if (conn != null)try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public BeanBook loadBook(String barcode) throws DbException {Connection conn = null;try {conn = DBUtil.getConnection();String sql = "select * from view_book " + " where barcode=? ";java.sql.PreparedStatement pst = conn.prepareStatement(sql);pst.setString(1, barcode);java.sql.ResultSet rs = pst.executeQuery();if (rs.next()) {BeanBook b = new BeanBook();b.setBarcode(rs.getString(1));b.setBookname(rs.getString(2));b.setPubid(rs.getString(3));b.setPrice(rs.getDouble(4));b.setState(rs.getString(5));b.setPubName(rs.getString(6));return b;}} catch (SQLException e) {e.printStackTrace();throw new DbException(e);} finally {if (conn != null)try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return null;}
}

给出改造后BookManager类的各个方法的代码。

public List<BeanBook> searchBook(String keyword, String bookState) throws BaseException, SQLException {Connection conn = null;try {conn = DBUtil.getConnection();return dao.searchBook(keyword, bookState);} catch (SQLException e) {e.printStackTrace();} catch (BaseException e) {e.printStackTrace();} finally {if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}return null;
}public void createBook(BeanBook b) throws BaseException, SQLException {Connection conn = null;try {conn = DBUtil.getConnection();dao.createBook(b);} catch (SQLException e) {e.printStackTrace();} catch (BaseException e) {e.printStackTrace();} finally {if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}public void modifyBook(BeanBook b) throws BaseException, SQLException {Connection conn = null;try {conn = DBUtil.getConnection();dao.modifyBook(b);} catch (SQLException e) {e.printStackTrace();} catch (BaseException e) {e.printStackTrace();} finally {if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}public BeanBook loadBook(String barcode) throws DbException, SQLException {Connection conn = null;try {conn = DBUtil.getConnection();dao.loadBook(barcode);} catch (SQLException e) {e.printStackTrace();} catch (DbException e) {e.printStackTrace();} finally {if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}return null;
}

在BaseDAO中,增加方法,实现根据主码提取对象的方法load。

写出函数代码

ublic T load(Connection conn, Class<T> clazz, Map<String,Object> primaryKey) {PreparedStatement ps = null;ResultSet rs = null;try {//primayKey的key为主码的各个属性名称,value为主码值//假设对象的类名和表名一致,属性名和字段名一致String tableName = clazz.getSimpleName();String sql = "select * from "+tableName+" where"; //动态构建sqlfor (Map.Entry mp : primaryKey.entrySet()) {sql += " " + mp.getKey().toString() + " = ? and";}sql = sql.substring(0,sql.length()-3);Object[] parmas = new Object[primaryKey.size()];//从map中获取参数值,并写入paramsint pos = 0;for (Map.Entry<String, Object> mp : primaryKey.entrySet()) {parmas[pos++] = mp.getValue();}ps = conn.prepareStatement(sql);for (int i = 0; i < parmas.length; i++) {ps.setObject(i+1,parmas[i]);}rs = ps.executeQuery();ResultSetMetaData rsmd = rs.getMetaData();if (rs.next()) {T t = clazz.getDeclaredConstructor().newInstance();for (int i = 0; i < rsmd.getColumnCount(); i++) {//获取当前rs指针的i+1字段的值Object value = rs.getObject(i+1);//获取当前rs指针的i+1字段的列名String columnLable = rsmd.getColumnLabel(i+1);//将value赋值给对应属性,反射Field field = clazz.getDeclaredField(columnLable);field.setAccessible(true);field.set(t, value);}return t;}} catch (Exception e) {e.printStackTrace();} finally {DBUtil.closeResorce(null,ps,rs);}return null;
}

ZUCC_数据库系统概论实验_实验六 JDBC进阶 3相关推荐

  1. (数据库系统概论|王珊)第六章关系数据理论-第一节:为什么要研究关系数据理论

    文章目录 一:概念回顾:关系模式 二:数据依赖 三:一个例子:不遵循关系数据理论导致的问题 一句话,研究关系数据库理论就是为了设计出合适的关系模式,也即合适.高效的表 一:概念回顾:关系模式 相关文章 ...

  2. java基本语句回文数实验_实验二 java基本数据类型与把持语句.doc

    实验二 java基本数据类型与把持语句.doc 还剩 4页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 5System.out.println(num ...

  3. ZUCC_计算机网络实验_实验04 VLAN配置

    浙江大学城市学院实验报告 文件下载 1.CSDN 2.百度网盘,提取码: vrvq 一.实验目的 掌握交换机VLAN的配置. 二.实验内容 用Packet Tracer模拟器建立网络,进行单交换机VL ...

  4. python第六周实验_第六周实验四

    二.实验的内容 (1)根据下面的要求实现圆类Circle. 1.圆类Circle的成员变量:radius表示圆的半径. 2.圆类Circle的方法成员: Circle():构造方法,将半径置0 Cir ...

  5. 中国大学MOOC数据库系统概论中国人民大学实验三 触发器

    实验题基于学生选课数据库,其包含三个关系模式: (1)学生关系模式Student(Sno, Sname, Ssex, Sage,Sdept) (2)课程关系模式Course(Cno, Cname, C ...

  6. ZUCC_计算机网络实验_实验01 实验一RJ45原理与制作

    浙江大学城市学院实验报告 一.实验目的 掌握网线制作和测试方法,了解标准568A与568B网线的线序,掌握直通双绞线和交叉双绞线的做法. 二.实验内容 1.直通双绞线的制作 2.交叉双绞线的制作 3. ...

  7. ZUCC_计算机网络实验_实验03 交换机基本配置

    浙江大学城市学院实验报告 文件下载: 1.CSDN 2.百度网盘,提取码: c8f7 一.实验目的 熟悉交换机的工模式 在Packet Tracer模拟器中练习交换机CLI基本配置 区分交换机与集线器 ...

  8. ZUCC_大数据计算技术_实验三 HDFS编程实践

    实验三 HDFS编程实践 课程名称 大数据计算技术 实验项目名称 实验三 HDFS编程实践 启动hadoop 一.利用Shell命令与HDFS进行交互 1. 目录操作 新建家目录 可以看到新建目录内无 ...

  9. ZUCC_操作系统原理实验_实验九 消息队列

    操作系统原理实验报告 课程名称 操作系统原理实验 实验项目名称 实验九 消息队列 实验目的 了解 Linux 系统的进程间通信机构 (IPC): 理解Linux 关于消息队列的概念: 掌握 Linux ...

最新文章

  1. 剑指offer:面试题26. 树的子结构
  2. Unity完全学习教程-从初学者到C#中的RPG游戏开发
  3. pcf8574c语言测试程序,PCF8563驱动程序(C语言版)
  4. android视频拷到iphone6s,爱思助手怎么把电脑视频导入iphone6s
  5. ABAP 在被访问的程序中获取访问程序的全局变量
  6. SAP系统工具栏中Back Exit 按钮差别?
  7. win7开机提示服务器正在运行,科技常识:win7电脑启动ie浏览器提示服务器正在运行的处理方法...
  8. 某项目的双代号网络图如下所示_2019一级建造师项目管理知识点大全3
  9. 6.04 从字符串中删除不需要的字符
  10. 车牌分割python_车牌字符分割python打开
  11. Matlab程序接口应用总结
  12. lua脚本的加密和解密(GG游戏脚本)
  13. linux可以用tab键,linux下tab键在命令行情况下的强大
  14. 人生如游戏,容错性很关键
  15. iPhone/iPad各机型如何进入恢复模式 苹果进入恢复模式的方法
  16. 张成分析(spanning test):portfolio_analysis.Spanning_test
  17. autojs发微信通知
  18. 常见广告收费模式大全
  19. /kylin/bin/set-java-home.sh: 第 32 行:[: : 期待整数表达式 kylin/bin/find-hadoop-conf-dir.sh:行33: hbase: 未找到命令
  20. Python对json数据的提取

热门文章

  1. OCH1661全极超低功耗1.9ua霍尔开关
  2. 嘉立创EDA专业版--从AD导入图纸定位尺寸
  3. 软考-法律法规和标准化
  4. 网站的seo以及它和站长工具之间的秘密
  5. python中weekday_Python calendar.weekday方法代码示例
  6. 如果你了解我的过去,你就会理解我的现在
  7. 转载 一个小时学会MySQL数据库(3)
  8. OpenCV+反色处理
  9. 老李的博客在这里安家了
  10. 10分钟解读《财富自由之路》