OR-Mapping 设计改进(查询全部改进) | 学习笔记

简介: 简介:快速学习 OR-Mapping 设计改进(查询全部改进)

开发者学堂课程【DAO 开发实战业务分析:OR-Mapping 设计改进(查询全部改进)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/399/detail/5182


OR-Mapping 设计改进(查询全部改进)

 

内容介绍:

一、简要说明

二、具体内容


一、简要说明

查询全部的操作处理和根据 ID 单个查询的形式是类似的。

· 所有的查询语句通过子类进行传输;

· 有的是需要进行分页控制的;

· 有的是需要进行模糊查询控制的。

所以下面也是进行一些功能类的扩充。


二、具体内容

1、在AbstractDAO 父类之中追加有一个新的功能:

全部功能涉及到一个问题,分页查询于查询全部的区别是多了几个字段。将实现DAO的实现子类找到,找到 FindAll(),在考虑三种情况的基础上,运用可变参数进行操作,如下:

/**

* 这个方法将负责查询全部以及模糊或者是分页查询的整体控制

* @param sql 要执行的SQL语句

* @param args 表示参数

* @return

*/

public <T> list<T> findAllSupport(String sql,Class<T> cls, String column,Object …args) throws Exception {

if(args.length = = 0{   // 此处不需要设置任何的参数

this.pstmt = this.conn.preparedStatement(sql) ;

} else {   //如果有参数则需要设置参数

FindSupport support = new FindSupport() ;

for(int x = 0;x < args.length ; x++) {System.out.println(args[x].getClass().getName());    System.out.println(args[x].getClass().getName());

}

}

return ResultSetToVOUtil.convert (this,pstmt,cls)

}

如果是分页查询,则将含有两个参数,sql 中则会含有两个问号。根据参数的顺序往问号里进行追加。对于 findAll(),如果调用,SELECT 是需要的,这时将代码删掉,直接写入return super.findAllSupport(sql,args);,将 sql 传入,但没有参数,这时就要对参数进行判断,即写入System.out.println(args);,找到 List 进行执行测试。这时 if(args.length = = 0{,则此处不需要设置任何的参数。

如果有参数则需要设置参数,根据参数的内容向上传,这时要换为 convert ,变成List<T>来进行循环,跟上List<T> all = new Array List<T>() ;来负责整体操作,再将 if 改为 while,跟上 all.add(t) ;,就实现了批量转换。

2、在ResultSetToVOUtil类里面追加有一个批量转换处理,如下:

public static <T> T convert (PreparedStatement pstmt,Class<T> cls) {

ResultSetMetaData rsmd = pstmt.getMetaData ;

ResultSet rs = pstmt.executeQuery() ; // 发出查询命令

T t = cls.newInstance() ;

while(rs.next()) { // 有数据

for (int x = 1; x < rsmd.getColumnCount() ; x ++) {

Field field = cls.getDeclaredField(rsmd.getColumnLabel(x).toLowerCase());

String type = field.fetType().getSimpleName() ;

if(“String”.equals(type)) {

BeanValueUtils.setValue(t,rsmd.getColumnLabel(x).toLowerCase(),rs.getString(rsmd.getColumnLabel(x)));

}else if(“int“.equals(type) || “integer“.equals(type)) {

BeanValueUtils.setValue(t,rsmd.getColumnLabel(x).toLowerCase(),rs.getInt(rsmd.getColumnLabel(x)));

}else if(“double“.equals(type) || Double “.equals(type)) {

BeanValueUtils.setValue(t,rsmd.getColumnLabel(x).toLowerCase(),rs.getDouble(rsmd.getColumnLabel(x)));

}else if(“Date“.equals(type) || “integer“.equals(type)) {

BeanValueUtils.setValue(t,rsmd.getColumnLabel(x).toLowerCase(),rs.getDate(rsmd.getColumnLabel(x)));

all.add(t)

}

return null ;

}

}

}

3、在 FindSupport 程序类之中继续追加新的功能,以满足查询要求。

将位找到,跟上 public void setPreparedStatement

(PreparedStatement pstmt,V value),之前的操作 Object 数组,所以这也接收Object 数组,

public void setPreparedStatement(PreparedStatement pstmt,Object …arg{,后面的操作过程由for(int x = 0;x < args.length ; x++) {以及

System.out.println(args[x].getClass().getName());转化为

support.setPreparedStatement(this.pstmt,args)来进行,先进行循环,即 for(int x = 0x < args.length ; x++){,再取出位型,即String type = args[x].getClass().getSimpleName();,再跟上if(“String“.equals(type)){,

pstmt.setString(x + 1,args[x].toString());,其它的则表示为}

else if ”int”.equals(type) || ”integer”.equals(type))

{,那么内容设置为pstmt.setInt(x + 1,Integer.parseInt

(args[x].toString()));

,如果为double则表示为} else if  double”.equals(type) || ” Double”.equals(type)){,内容设置为pstmt.setDouble(x + 1, Double.parseDouble(args[x].toString()));

如果为Date,则表示为} else if  date”.equals(type) {,内容设置为

pstmt.setDate(x + 1,new java.sql.Date(date.getTime()));。

跟上Date date = (Date) args[x];,

如下:

public class FindSupport {

public <V> void 

setPreparedStatement(PreparedStatement,pstmt,V value);

String type = args[x].getClass().getSimpleName();

if (“String“.equals(type)){,

pstmt.setString(x + 1,args[x].toString());

} else if (”int”.equals(type) || ”integer”.equals(type)){

pstmt.setInt(x + 1,Integer.parseInt(args[x].toString())){

}else if(double”.equals(type) || ” Double”.equals(type)) {

pstmt.setDouble(x+1,Double.parseDouble(args[x].toString()));

} else if  date”.equals(type) {

Date date = (Date) args[x]

pstmt.setDate(x+1, newjava.sql.Date(date.getTime()));

回到抽象位中,值设置完成后要进行取出,执行后反应空指向,即没进行实例化,将其改为大于零即可,再进行执行,还有rn的问题,如果出异常则表示某个实例不存在,直接忽略就可以,再次执行表示通过。

4、在 AbstractDAO 里面添加有相应的方法支持

public <T> list<T> findAllSupport(String sql,Class<T> cls, String column,Object …args) throws Exception {

this.pstmt = this.conn.preparedStatement(sql) ;

if(args.length = = 0{   // 此处不需要设置任何的参数

FindSupport support = new FindSupport() ;

support.setPreparedStatement(this.pstmt,args)

}  

return ResultSetToVOUtil.convert (this,pstmt,cls)

}

在查询里面参数“?“和内容一定是需要匹配的。

相关文章
|
9月前
|
Java 数据库连接 mybatis
Mybatis 多级分类查询
Mybatis 多级分类查询
77 0
|
7月前
|
搜索推荐 UED Python
动态多条件查询:理解`filter_by`与`filter`提升Web应用搜索功能
通过深入理解filter_by与filter的异同,并结合使用它们,我们可以构建一个既灵活又强大的动态多条件查询系统。这不仅提升了Web应用的搜索功能,也为用户提供了更加个性化的搜索体验。希望本文能够启发你在自己项目中实现类似的功能,以满足用户多变的搜索需求。
|
存储 JSON 数据建模
Elasticsearch数据建模实战之基于nested object实现博客与评论嵌套关系
Elasticsearch数据建模实战之基于nested object实现博客与评论嵌套关系
96 0
|
存储 数据采集 架构师
谈谈数据项目中的Data mapping(数据映射)
企业数据正变得越来越分散和庞大。与此同时,对企业来说,利用数据并将其转化为可操作的见解,变得比以往任何时候都更加重要。
谈谈数据项目中的Data mapping(数据映射)
|
搜索推荐 C++
白话Elasticsearch13-深度探秘搜索技术之基于multi_match+most fields策略进行multi-field搜索
白话Elasticsearch13-深度探秘搜索技术之基于multi_match+most fields策略进行multi-field搜索
106 0
|
SQL 开发框架 Java
OR-Mapping 设计改进(ORMapping 简介)| 学习笔记
简介:快速学习 OR-Mapping 设计改进(ORMapping 简介)
270 0
OR-Mapping 设计改进(ORMapping 简介)| 学习笔记
|
SQL 开发者
OR-Mapping 设计改进(统计查询改进) | 学习笔记
简介:快速学习 OR-Mapping 设计改进(统计查询改进)
|
SQL 开发者
OR-Mapping 设计改进(数据修改改进) | 学习笔记
简介:快速学习 OR-Mapping 设计改进(数据修改改进)
123 0
|
SQL Oracle Java
OR-Mapping 设计改进(结果集元数据) | 学习笔记
简介:快速学习 OR-Mapping 设计改进(结果集元数据)
|
SQL Java 开发者
OR-Mapping 设计改进(数据删除改进) | 学习笔记
简介:快速学习 OR-Mapping 设计改进(数据删除改进)
107 0