day06-05-jdbc-rowmapper讲解模版模式
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讲解模版模式相关推荐
- 行为型模型 模版模式
行为型模型 模版模式 应用场景 Template Method模式一般应用在具有以下条件 的应用中: - 具有统一的操作步骤或操作过程 - 具有不同的操作细节 ...
- JDBC - 开发实例 - MVC模式
JDBC - 开发实例 - MVC模式 1. 在web.xml中配置连接数据库的信息 web.xml: <context-param> <param-name>server& ...
- java设计模式_模版模式
2019独角兽企业重金招聘Python工程师标准>>> package com.wangbiao.test;/*** 模版模式,好比一个业务的流程一样,抽象类大致的设计了流程的步骤, ...
- java 设计模式学习笔记十四 template模版模式
/** * 模版 * * @time 下午09:58:00 * @author retacn yue * @Email zhenhuayue@sina.com */ public abs ...
- 用另一种方式来讲解代理模式~
说起代理模式,我算是对他三进三出了,文章至少写的有两篇了,但是我再去看的时候,总感觉不太容易理解,今天来一个我自己的真实案例,通过暑假实习找房子的经历来进行讲解代理模式. 静态代理 代理模式的话,大致 ...
- Python设计模式之模版模式(16)
模版模式(The Template Pattern):抽象出算法公共部分从而实现代码复用. 模板模式中,我们可以把代码中重复的部分抽出来作为一个新的函数,把可变的部分作为函数参数,从而消除代码冗余.一 ...
- 设计模式 - 模版模式
文章目录 设计模式 - 模版模式 1.简述 2.创建模版 3.创建模版实现 4.使用模版运行 设计模式 - 模版模式 1.简述 模板模式属于行为型模式 一个抽象类公开定义了执行它的方法的方式/模板.它 ...
- servlet+javabean+jdbc+mysql基于MVC模式的课件管理系统,有三个表的增删改查和课件搜索、课件上传、课件下载功能, 具体功能请看界面上的导航条
源码支持在idea.eclipse.myeclipse运行,数据库采用MySQL数据库,项目采用mvc设计模式开发,页面采用jsp+html+css+js完成. servlet+javabean+jd ...
- java 设计模式之三-模版模式
新的一天,天气不错,坚持.努力.加油! 今天想说的是模版模式,其实这个模式大家都常用,只是可能不知道还有"模版模式"这么一个称呼而已,使用继承的方式来实现,父类为模版,子类根据不同 ...
最新文章
- 宜家通信- 会员管理 表结构搭建
- [python]_ELVE_pip2和pip3如何共存
- console线驱动安装_centos7安装docker
- 【学术相关】毕业论文速成指南来了!
- springboot整合mongodb增删改查入门
- http协议 php,PHP中的http协议
- 从几个角度谈谈内存的管理和划分
- 一般线性模型和混合线性模型_线性混合模型如何工作
- Bugfree安装与使用
- Hangover C语言 UVA2294
- 【BERT】源码分析(PART II)
- Spring学习笔记(四)
- 捷联惯导系统(SINS)机械编排
- 如何去除word文档目录前面的黑点和目录后有一页空白页
- MySQL安装失败的原因
- mysql 等距随机_随机起点对称等距抽样公式的简便运用
- 数学笔记13——定积分
- PTA 7-154 置点不动产——认真学习,努力工作买买房子吧
- python随机森林筛选变量_用随机森林分类器和GBDT进行特征筛选
- 这样解决浏览器不兼容问题