package day06;
/*
crud 增删改查*/import day05.jdbc.MysqlUtil;
import day05.jdbc.TbUser;import java.lang.reflect.Field;
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 DaoDemo01 {public static void main(String[] args) throws Exception {String sql ="select * from auth_group";List<TbUser> tbUsers = testDao(sql, null, TbUser.class);System.out.println(tbUsers);// RowMapper思想// 区别:反射的方法,实现对象的赋值,在我们写的统一方法里,统一处理供别人调用// 区别:RowMapper方法,谁调用我们,谁就要实现接口里面对象赋值的方法(匿名内部类)// 抽象:接口+抽象类// 第三个参数,传rowMapper接口,// rowMapper接口,这里使用匿名内部类// new RowMapper<TbUser>() {....});这里是一行代码(这里用的匿名内部类)// 匿名内部类,new RowMapper<TbUser>(),这里不是new的RowMapper<TbUser>这个接口,//而是new的这个(),没有名字的类,括号中没有名字的类,它继承类RowMapper,但是自己没有类名List<TbUser> tbUsers1 = testRowMapper(sql, null, new RowMapper<TbUser>() {// 重写map@Overridepublic TbUser map(ResultSet rs) throws SQLException {TbUser tbUser = new TbUser();// 给tbUser赋值tbUser.setId(rs.getLong(1));tbUser.setName(rs.getString(2));return tbUser;}});System.out.println("tbUsers1 = " + tbUsers1);}/*** 根据Sql语句,获取对象集合 《泛型+反射》,技术手段* @param sql* @param params sql语句的参数,参数的顺序需要使用方自己控制* @param cls 对象的class* @param <T> 对象的类型* @return List<T>* @throws Exception*/public static <T> List<T> testDao(String sql,List<Object> params,Class<T> cls) throws Exception {// 静态方法的泛型// 传参,sql和sql里面的变量//Class<T> cls,拿到一个类的Class,通过反射然后构建对象//拿到对象的属性字段,然后给属性设置值//1、建立连接Connection conn = MysqlUtil.getConn();//2、预编译PreparedStatement ps = conn.prepareStatement(sql);if (params!=null){// 给sql语句设置参数,参数的顺序使用方自己控制for (int i=0;i< params.size();i++){// jdbc 参数从1开始数,所以是i+1ps.setObject(i+1,params.get(i));}}// 3、运行sql,得到结果集ResultSet rs = ps.executeQuery();// 集合List<T> list =new ArrayList<>();while (rs.next()){// 通过class,利用反射,构建一个T对象// 注意,这个T类,一定要有无参构造器T t = cls.newInstance();// 通过反射,得到T这个类所有的属性/字段Field[] fields = cls.getDeclaredFields();// 遍历属性,给t的属性赋值for (Field field:fields){// 得到属性field的名字,根据field的名字作为列名,在结果集rs中取对应的值// 注意:String fieldName =field.getName();//属性/字段的名称field.setAccessible(true);//设置字段可访问的权限//在结果集中,通过列名fileName,来或者对应的值// 我们不知道具体是什么类,所以我们用Object// 根据列名在结果集中取值,使用属性名作为列名// 注意:类T的属性名要与数据库列的字段名称保持一致Object object = rs.getObject(fieldName);//给对象的当前属性设置值//这里涉及到3个数据,field.set(t,object),里面第一个参数传的是实例,// 第二个参数是给当前的属性设置的值// 当前是什么属性?我们就在遍历for (Field field:fields)属性的循环里,取的当前的属性field.set(t,object);}// 给存放结果集的集合,添加对象list.add(t);}MysqlUtil.close(conn);//关闭数据库连接return list;}//---------------------rowMapper--模版设计模式-------------//定义一个接口// 泛型 T// 内部接口,类似于内部类interface RowMapper<T>{/*** 这个接口就一个方法,实现将ResultSet 转成T对象* 具体如何实现转成T对象,用户调用的时候去实现* @param rs* @return* @throws SQLException*/T map(ResultSet rs) throws SQLException;}/*** 《泛型+抽象》设计手段,抽象的概念,封装* @param sql* @param params* @param rowMapper 传入接口的实现类,该接口提供了一个将结果集ResultSet转成T的方法,该方法的实现,需要用户自定义去实现(调用的时候,匿名内部类实现)* @param <T>* @return* @throws SQLException*/// 泛型// 这里不用class反射,用RowMapper<T>接口public static <T> List<T> testRowMapper(String sql,List<Object> params,RowMapper<T> rowMapper) throws SQLException{// 建立连接Connection conn = MysqlUtil.getConn();// 预编译PreparedStatement ps = conn.prepareStatement(sql);if (params!=null){// 给sql语句设置参数,参数的顺序使用方自己控制for (int i=0;i< params.size();i++){// jdbc 参数从1开始数,所以是i+1ps.setObject(i+1,params.get(i));}}//结果集ResultSet rs = ps.executeQuery();// 创建一个集合,来接收执行sql后的结果集List<T> list = new ArrayList<>();while (rs.next()){// 调用rowMapper的map方法,传rs,得到一个t// rowMapper里面没有具体实现转换的方法,没关系,这个谁调用谁实现T t = rowMapper.map(rs);list.add(t);}return list;}
}

day06-05-jdbc-rowmapper讲解模版模式相关推荐

  1. 行为型模型 模版模式

    行为型模型 模版模式 应用场景 Template Method模式一般应用在具有以下条件 的应用中:         - 具有统一的操作步骤或操作过程         - 具有不同的操作细节     ...

  2. JDBC - 开发实例 - MVC模式

    JDBC - 开发实例 - MVC模式  1. 在web.xml中配置连接数据库的信息 web.xml: <context-param> <param-name>server& ...

  3. java设计模式_模版模式

    2019独角兽企业重金招聘Python工程师标准>>> package com.wangbiao.test;/*** 模版模式,好比一个业务的流程一样,抽象类大致的设计了流程的步骤, ...

  4. java 设计模式学习笔记十四 template模版模式

    /**  * 模版  *   * @time 下午09:58:00  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public abs ...

  5. 用另一种方式来讲解代理模式~

    说起代理模式,我算是对他三进三出了,文章至少写的有两篇了,但是我再去看的时候,总感觉不太容易理解,今天来一个我自己的真实案例,通过暑假实习找房子的经历来进行讲解代理模式. 静态代理 代理模式的话,大致 ...

  6. Python设计模式之模版模式(16)

    模版模式(The Template Pattern):抽象出算法公共部分从而实现代码复用. 模板模式中,我们可以把代码中重复的部分抽出来作为一个新的函数,把可变的部分作为函数参数,从而消除代码冗余.一 ...

  7. 设计模式 - 模版模式

    文章目录 设计模式 - 模版模式 1.简述 2.创建模版 3.创建模版实现 4.使用模版运行 设计模式 - 模版模式 1.简述 模板模式属于行为型模式 一个抽象类公开定义了执行它的方法的方式/模板.它 ...

  8. servlet+javabean+jdbc+mysql基于MVC模式的课件管理系统,有三个表的增删改查和课件搜索、课件上传、课件下载功能, 具体功能请看界面上的导航条

    源码支持在idea.eclipse.myeclipse运行,数据库采用MySQL数据库,项目采用mvc设计模式开发,页面采用jsp+html+css+js完成. servlet+javabean+jd ...

  9. java 设计模式之三-模版模式

    新的一天,天气不错,坚持.努力.加油! 今天想说的是模版模式,其实这个模式大家都常用,只是可能不知道还有"模版模式"这么一个称呼而已,使用继承的方式来实现,父类为模版,子类根据不同 ...

最新文章

  1. 宜家通信- 会员管理 表结构搭建
  2. [python]_ELVE_pip2和pip3如何共存
  3. console线驱动安装_centos7安装docker
  4. 【学术相关】毕业论文速成指南来了!
  5. springboot整合mongodb增删改查入门
  6. http协议 php,PHP中的http协议
  7. 从几个角度谈谈内存的管理和划分
  8. 一般线性模型和混合线性模型_线性混合模型如何工作
  9. Bugfree安装与使用
  10. Hangover C语言 UVA2294
  11. 【BERT】源码分析(PART II)
  12. Spring学习笔记(四)
  13. 捷联惯导系统(SINS)机械编排
  14. 如何去除word文档目录前面的黑点和目录后有一页空白页
  15. MySQL安装失败的原因
  16. mysql 等距随机_随机起点对称等距抽样公式的简便运用
  17. 数学笔记13——定积分
  18. PTA 7-154 置点不动产——认真学习,努力工作买买房子吧
  19. python随机森林筛选变量_用随机森林分类器和GBDT进行特征筛选
  20. 这样解决浏览器不兼容问题

热门文章

  1. RK 3568 调试配置以太网流程记录
  2. 从list随机取出数据
  3. appium api 文档
  4. WLAN组网AC间漫游
  5. 还在借口美工差不会logo?一个方法教你快速设计logo,初学者必看
  6. 普乐蛙VR科普教育体验馆VR航天模拟体验设备厂家
  7. ILRuntime学习
  8. 云服务器备份好怎么用,云服务器快照备份和完全备份介绍
  9. 填坑之路 DirectX11(一)error LNK2019:无法解析的外部符号D3D11CreateDeviceAndSwapChain
  10. vue 踩坑--父组件调用子组件方法,报错