JDBC的DML增删改查的代码重构设计(下)
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增删改查的代码重构设计(下)相关推荐
- JDBC的DML增删改查的代码重构设计(上)
1 设计商品对象 public class Product {private Long id;private String productName;private String brand;priva ...
- JDBC+MySQL入门增删改查案例
目录 前言 案例分析 核心思路拆解 案例涉及知识点 第一关 创建数据库和项目 创建数据库 创建项目 第二关 JDBC插入和查询 预备工作 单个插入 批量插入 查询数据 JDBC修改和删除 修改数据 删 ...
- easyui增删改查前段代码
easyui增删改查前段代码 <script>var url;//添加用户窗体 function newUser(){$('#dlg').dialog('open').dialog('se ...
- 【02】Java进阶:18-MySQL基础、数据库概述、数据库的安装/卸载/启动/登录、SQL概述、DDL操作数据库、DDL操作表、DML增删改查、
day18-MySql基础 今日内容 数据库概述 数据库安装和卸载 SQL语句 DDL-----操作数据库,操作表 DML-----操作记录(增删改) DQL------操作记录(查) 学习目标 能够 ...
- jsp+Servlet+JavaBean+JDBC+MySQL项目增删改查
1简单的Mvc,分层建包. java resources src/mian/java (1)dao 包 JDBC连接类,连接数据库.增删改查方法,其他的方法. (2)model包 实体类,数据库字段, ...
- 增删改查java代码_程序员:听说你正在为天天写增删改查代码而烦恼
有相当多的一部分程序员一直都只接触业余应用的功能,天天写业务代码的程序员也被戏称为CURD程序员,CURD就是增(create).改(update).查(read).删(delete)的意思. CUR ...
- Mybatis的基本增删改查(代码)
3.CRUD增删改查 3.1.namespace namespace中的包名要和Mapper接口的包名一致 3.2.select 选择.查询语句: id就是对应的namespace中的方法名: res ...
- mysql增删改查不区分大小写吗_MySQL的增删改查语句以及数据库设计的三大范式...
数据库设计的三大范式: 1.列的原子性,即列是不可再分的 2.表里的每一列都应该与主键有关系, 3.表里的每一列都应该与主键有直接关系, 当使用自增长列不满足2.3范式,是特殊例子,只用在解决较为复杂 ...
- JDBC(实现增删改查的通用操作)
JDBC JDBC概述 创建表以及相对应的对象(ORM) 表 对象 获取连接的方式 方式一 方式二 方式三 方式四 方式五(推荐使用) 增.删.改操作 查询操作 JDBC概述 为了使Java编写的程序 ...
最新文章
- ie8加载js太慢_js ie8 慢
- 网站***是如何用脚本欺骗网友的
- spring mybatis 集成
- 蚂蚁金服对研发高要求的领域建模能力是指什么?
- 老码农冒死揭开行业黑幕:如何编写无法维护的代码
- Iframe难点备忘
- Python 包管理
- 7-2 求交错序列前N项和 (10 分)
- MySQL学习笔记.数据的导入和导出
- 用VSCode写简历表
- 量化投资学习——股指期货研究(五)
- 计算机word做课程表实验报告,word表格练习(课程表的制作)
- 盘点那些年BAT字节跳动等互联网公司的程序员、工程师一夜暴富的都市传说
- 中国微商概念及产业链分析
- CPU温度过高有什么影响
- 扣减库存,redis你值得拥有
- CentOS8下Mosquitto安装使用指南
- unittest使用详解
- TEST1笔记 200408
- 求100以内所有的素数C版(用数组标记的方式)