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)

}

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

相关文章
|
存储 网络协议 Unix
如何使用创建的套接字收发数据
【4月更文挑战第2天】发送成功仅表明数据进入发送缓冲区,实际传输和接收端接收是后续过程。
|
7月前
|
存储 索引 Python
[oeasy]python093_find方法_指数为负数_index_实际效果
本文介绍了Python中`find`方法与索引(index)的使用,包括负数索引的实际效果。回顾了`eval`函数的应用,并强调类名如`str`、`int`、`list`不可用作变量名以避免覆盖。通过示例解析了负数索引在字符串和列表中的作用,以及`index`方法的三个参数(value、start、stop)的用法。同时对比了`index`和`find`方法的区别:`index`找不到子串时抛出`ValueError`,而`find`返回-1。最后总结了正负索引的使用场景及两者的特性,提供了相关学习资源链接。
437 8
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
通义千问Qwen3,开源!
Qwen3正式发布并全部开源啦!
3713 50
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp微信小程序的图书管理系统的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的图书管理系统的详细设计和实现
204 2
|
消息中间件 SQL 负载均衡
RocketMQ快速入门 2
RocketMQ快速入门
379 0
R语言对回归模型进行协方差分析
R语言对回归模型进行协方差分析
|
C++ 容器
C++语言中for语句循环和作用类型
C++语言中for语句循环和作用类型
276 0
|
关系型数据库 MySQL Linux
MySQL的各种安装方式都给你(上)
MySQL的各种安装方式都给你(上)
449 0
MySQL的各种安装方式都给你(上)