JDBC的操作模板:

流程:1.创建ProductResultSetHandler对象:2.作为参数传递给query方法3.在query方法中:rsh.handler,其实调用的是ProductResultSetHanlder方法

结果集处理规范:

//定义一个专门的约束处理结果集的接口:ResultSetHandler:结果集处理器
public interface ResultSetHandler<T> {//同意规定,必须有一个处理结果集的方法:handle,处理之后返回结果T handle(ResultSet rs) throws SQLException;
}

调用的模板方法:

public class JdbcTemplate {private JdbcTemplate() {}/*** *@param sql   DML各自的SQL,由调用者决定*@param params      DML操作需要的参数,由调用者决定*@return     受影响的行数*/public static int update(String sql, Object... params) {Connection conn = null;PreparedStatement ps = null;try {conn = JdbcUtil.INSTANCE.getConn();ps = conn.prepareStatement(sql);for (int i = 0; i < params.length; i++) {ps.setObject(i + 1, params[i]);}return ps.executeUpdate();} catch (SQLException e) {e.printStackTrace();} finally {JdbcUtil.INSTANCE.close(conn, ps, null);}return 0;}public static <T>T query(String sql, ResultSetHandler<T> rsh ,Object... params) {Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {conn = JdbcUtil.INSTANCE.getConn();ps = conn.prepareStatement(sql);for (int i = 0; i < params.length; i++) {ps.setObject(i + 1, params[i]);}rs = ps.executeQuery();return rsh.handle(rs);} catch (Exception e) {e.printStackTrace();} finally {JdbcUtil.INSTANCE.close(conn, ps, rs);}return null;}

实现类的操作代码:

public class ProductDAOImpl implements IProductDAO {public void save(Product pro) {/*String sql = "insert into product (productName,brand,supplier,salePrice,costPrice,cutoff,dir_id ) values (?,?,?,?,?,?,?)";Object[] params = { pro.getProductName(), pro.getBrand(), pro.getSupplier(), pro.getSalePrice(),pro.getCostPrice(), pro.getCutoff(), pro.getDir_id() };JdbcTemplate.update(sql, params);*///拓展Hibernate的save操作:HibernateMock.save(pro); }public void delete(Long id) {String sql = "delete from product where id =  ? ";JdbcTemplate.update(sql, id);}public void update(Product pro) {String sql = "UPDATE product SET productName = ?, brand = ?, supplier = ?, salePrice = ?, costPrice = ?, cutoff = ?, dir_id = ?  WHERE id = ?";Object[] params = { pro.getProductName(), pro.getBrand(), pro.getSupplier(), pro.getSalePrice(),pro.getCostPrice(), pro.getCutoff(), pro.getDir_id(), pro.getId() };JdbcTemplate.update(sql, params);}public Product get(Long id) {String sql = "select * from product where id = ?";List<Product> list = JdbcTemplate.query(sql, new ProductResultHandler(),id);return list.size()==1? list.get(0):null;}public List<Product> list() {String sql = "SELECT * FROM product";return JdbcTemplate.query(sql,new ProductResultHandler());}//定义处理商品对象的结果集处理器class ProductResultHandler implements ResultSetHandler<List<Product>>{@Overridepublic List<Product> handle(ResultSet rs) throws SQLException {List<Product> list = new ArrayList<>();while (rs.next()) {Product pro = new Product();list.add(pro);pro.setId(rs.getLong("id"));pro.setProductName(rs.getString("productName"));pro.setBrand(rs.getString("brand"));pro.setSupplier(rs.getString("supplier"));pro.setSalePrice(rs.getBigDecimal("salePrice"));pro.setCostPrice(rs.getBigDecimal("costPrice"));pro.setCutoff(rs.getDouble("cutoff"));pro.setDir_id(rs.getLong("dir_id"));}return list;}}

拓展Hibernate的save操作:

public class HibernateMock {/*** 保存操作* @param obj* 1.拼SQL* 2.设置封装参数*///约定优于配置://要求:表中的列和对象的属性相同public static void save(Object obj){//使用内省机制获取JivaBean对象的属性try {BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass(),Object.class);PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();StringBuilder sqlBuilder = new StringBuilder();//拼接SQLList<Object> params = new ArrayList<>();//封装属性的值/参数值String tableName = obj.getClass().getSimpleName();sqlBuilder.append("INSERT INTO ").append(tableName).append("(");StringBuilder sign = new StringBuilder();//拼接占位符for (PropertyDescriptor pd : pds) {String propertyName = pd.getName();//属性名/表中的列名sqlBuilder.append(propertyName).append(",");//拼接列名sign.append("?").append(",");Object value = pd.getReadMethod().invoke(obj);//获取每个属性的值params.add(value);}sqlBuilder.deleteCharAt(sqlBuilder.length()-1);sign.deleteCharAt(sign.length()-1);sqlBuilder.append(")VALUES(").append(sign);sqlBuilder.append(")");//封装参数,执行SQL//调用之前编写的MDL操作模板JdbcTemplate.update(sqlBuilder.toString(),params.toArray());} catch (Exception e) {e.printStackTrace();}}

测试类

public class ProductDAOTest {private IProductDAO dao = new ProductDAOImpl();@Testpublic void testSave() {Product pro = new Product();pro.setProductName("iphone8s");pro.setBrand("apple");pro.setSupplier("苹果公司");pro.setSalePrice(new BigDecimal("7000"));pro.setCostPrice(new BigDecimal("2000"));pro.setCutoff(0.9);pro.setDir_id(3L);//pro.setId(12L);dao.save(pro);}@Testpublic void testDelete() {dao.delete(26L);}@Testpublic void testUpdate() {Product pro = new Product();pro.setProductName("iphone6s");pro.setBrand("apple9s");pro.setSupplier("苹果公司2");pro.setSalePrice(new BigDecimal("6000"));pro.setCostPrice(new BigDecimal("1000"));pro.setCutoff(0.8);pro.setDir_id(5L);pro.setId(8L);dao.update(pro);}@Testpublic void testGet() {Product pro = dao.get(6L);System.out.println(pro);}@Testpublic void testList() {List<Product> list = dao.list();for (Product p : list) {System.out.println(p);}}
}

JdbcUtil工具类

public enum JdbcUtil {INSTANCE;private static Properties p = new Properties();//只需要注册一次驱动即可,没必要每次都注册,放到jdbcutil类的静态代码块中(当字节码被加载进jvm,就会执行)static {try {//从classpath的根路径去加载db.properties文件InputStream inStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");p.load(inStream);Class.forName(p.getProperty("driverClassName"));} catch (Exception e) {e.printStackTrace();}}/*** 创建connection对象* @return*/public Connection getConn() {try {return DriverManager.getConnection(p.getProperty("url"), p.getProperty("usename"),p.getProperty("password"));} catch (Exception e) {e.printStackTrace();}return null;}public void close(Connection conn, Statement st, ResultSet rs) {try {if (rs != null) {rs.close();}} catch (Exception e) {e.printStackTrace();} finally {try {if (st != null) {st.close();}} catch (Exception e) {e.printStackTrace();} finally {try {if (conn != null) {conn.close();}} catch (Exception e) {e.printStackTrace();}}}}
}

db.properties文件

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdemo?useSSL=false
usename=root
password=111111

商品对象

public class Product {private Long id;private String productName;private String brand;private String supplier;private BigDecimal salePrice;private BigDecimal costPrice;private Double cutoff;private Long dir_id;//分类编号public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getProductName() {return productName;}public void setProductName(String productName) {this.productName = productName;}public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public String getSupplier() {return supplier;}public void setSupplier(String supplier) {this.supplier = supplier;}public BigDecimal getSalePrice() {return salePrice;}public void setSalePrice(BigDecimal salePrice) {this.salePrice = salePrice;}public BigDecimal getCostPrice() {return costPrice;}public void setCostPrice(BigDecimal costPrice) {this.costPrice = costPrice;}public Double getCutoff() {return cutoff;}public void setCutoff(Double cutoff) {this.cutoff = cutoff;}public Long getDir_id() {return dir_id;}public void setDir_id(Long dir_id) {this.dir_id = dir_id;}@Overridepublic String toString() {return "Product [id=" + id + ", productName=" + productName + ", brand=" + brand + ", supplier=" + supplier+ ", salePrice=" + salePrice + ", costPrice=" + costPrice + ", cutoff=" + cutoff + ", dir_id=" + dir_id+ "]";}
}

JDBC的DML增删改查的代码重构设计(下)相关推荐

  1. JDBC的DML增删改查的代码重构设计(上)

    1 设计商品对象 public class Product {private Long id;private String productName;private String brand;priva ...

  2. JDBC+MySQL入门增删改查案例

    目录 前言 案例分析 核心思路拆解 案例涉及知识点 第一关 创建数据库和项目 创建数据库 创建项目 第二关 JDBC插入和查询 预备工作 单个插入 批量插入 查询数据 JDBC修改和删除 修改数据 删 ...

  3. easyui增删改查前段代码

    easyui增删改查前段代码 <script>var url;//添加用户窗体 function newUser(){$('#dlg').dialog('open').dialog('se ...

  4. 【02】Java进阶:18-MySQL基础、数据库概述、数据库的安装/卸载/启动/登录、SQL概述、DDL操作数据库、DDL操作表、DML增删改查、

    day18-MySql基础 今日内容 数据库概述 数据库安装和卸载 SQL语句 DDL-----操作数据库,操作表 DML-----操作记录(增删改) DQL------操作记录(查) 学习目标 能够 ...

  5. jsp+Servlet+JavaBean+JDBC+MySQL项目增删改查

    1简单的Mvc,分层建包. java resources src/mian/java (1)dao 包 JDBC连接类,连接数据库.增删改查方法,其他的方法. (2)model包 实体类,数据库字段, ...

  6. 增删改查java代码_程序员:听说你正在为天天写增删改查代码而烦恼

    有相当多的一部分程序员一直都只接触业余应用的功能,天天写业务代码的程序员也被戏称为CURD程序员,CURD就是增(create).改(update).查(read).删(delete)的意思. CUR ...

  7. Mybatis的基本增删改查(代码)

    3.CRUD增删改查 3.1.namespace namespace中的包名要和Mapper接口的包名一致 3.2.select 选择.查询语句: id就是对应的namespace中的方法名: res ...

  8. mysql增删改查不区分大小写吗_MySQL的增删改查语句以及数据库设计的三大范式...

    数据库设计的三大范式: 1.列的原子性,即列是不可再分的 2.表里的每一列都应该与主键有关系, 3.表里的每一列都应该与主键有直接关系, 当使用自增长列不满足2.3范式,是特殊例子,只用在解决较为复杂 ...

  9. JDBC(实现增删改查的通用操作)

    JDBC JDBC概述 创建表以及相对应的对象(ORM) 表 对象 获取连接的方式 方式一 方式二 方式三 方式四 方式五(推荐使用) 增.删.改操作 查询操作 JDBC概述 为了使Java编写的程序 ...

最新文章

  1. ie8加载js太慢_js ie8 慢
  2. 网站***是如何用脚本欺骗网友的
  3. spring mybatis 集成
  4. 蚂蚁金服对研发高要求的领域建模能力是指什么?
  5. 老码农冒死揭开行业黑幕:如何编写无法维护的代码
  6. Iframe难点备忘
  7. Python 包管理
  8. 7-2 求交错序列前N项和 (10 分)
  9. MySQL学习笔记.数据的导入和导出
  10. 用VSCode写简历表
  11. 量化投资学习——股指期货研究(五)
  12. 计算机word做课程表实验报告,word表格练习(课程表的制作)
  13. 盘点那些年BAT字节跳动等互联网公司的程序员、工程师一夜暴富的都市传说
  14. 中国微商概念及产业链分析
  15. CPU温度过高有什么影响
  16. 扣减库存,redis你值得拥有
  17. CentOS8下Mosquitto安装使用指南
  18. unittest使用详解
  19. TEST1笔记 200408
  20. 求100以内所有的素数C版(用数组标记的方式)

热门文章

  1. Java中七个潜在的内存泄露风险,你知道几个?
  2. Java并发编程:面试必备之线程池
  3. spring框架中Bean的基本属性及调用外部properties等配置文件的方法介绍
  4. Java多线程学习二十六:原子类是如何利用 CAS 保证线程安全的?
  5. Java 根据枚举的名字得到枚举的实例
  6. CentOS 搭建简单svn服务器【转】
  7. javascript this的意思
  8. lambda表达式对比
  9. oracle中的数据读取与查找
  10. Razor视图引擎 语法学习(一)