java多表查询实体类_自己设计一个JAVA+MyBatis解析实体类多表通用查询
先来处理一下查询的字段和用到的表吧
//虽然我们使用的时候是实体,但最终还是要解析成sql的,那么我们需要想好解析成sql 时候所用到的东东,提前准备好
class TableEntity {
String tableName; //表的真正名称肯定是要的
String nickName; //表名的重命名也是要的, 去掉真名的表的下划线的全英文字母
String idName; //表的主键名称肯定是要的
String logicName; //上面定义了逻辑删除功能,所以这个逻辑删除也要
List entityColumns; //实体的字段
List tableColumns; //与实体字段一对一的数据表的字段
Object entity; //与之相关的实体
}
//现在用到数据表实体已经定义好了,是不是要写个工具将传入的实体参数解析成 TableEntity 了呢
class TableUtil {
TableEntity toTableEntity(Object entity); //将实体解析成TableEntity
//...
}
//已经有了数据表的描述,那么我们将selectColumns 解析成 sql 的 select 字段完全没有问题了吧
//将 "user.UserId, user.userName, address.detail, orders" 解析
// ',' 分割去空格, '.' 前后的替换为 nickName,'.' 后面替换为数据表的字段,单独的 orders 替换为 nickName.[every tableColumn]
class TableUtil {
TableEntity toTableEntity(Object entity); //将实体解析成TableEntity
//添加一个工具来实现吧
String toNativeSelectColumns(String SelectColumns);
}
那么我们再来看看如何实现表的连接吧
/**
传过来是这样的参数: new User(), new Address(), new Orders()
简单的约束弄: 找到 User 表的主键(@TableId) 字段的Field名, 匹配 Address中的 Filed名,找到了那么说明用此字段关联,同样的方式, 循环向后寻找即可找到所有关联。但是这样的简单的定义约束。user表的主键需要为user_id, address表的与user表关联的字段 必需也要叫user_id,关联的字段名必须取一样的名称,如果想不一样,可以使用注解,这里先不作介绍。
*/
//那么工具类又新增方法, 这里只作Left Join
class TableUtil {
TableEntity toTableEntity(Object entity); //将实体解析成TableEntity
//添加一个工具来实现吧
String toNativeSelectColumns(String SelectColumns);
//添加left join 方法
List toLeftJoin(Object ...entities);
}
现在已经解决了查找的字段与自动关联的问题,那么接下来是如何条件查询了, 前面我们已经定义了 WhereCustomSegment 类了,完善一个思路吧
class WhereCustomSegment {
public WhereCustomSegment(TableEntity ...tableEntities); //构造,我们需要关于数据表的全部信息
WhereCustomSegment where(String tableName);
}
//那么如何实现一个like 方法呢? 如: like("userName", "whoareyou")
//了解 myBatis 这段应该了 user.user_name like #{userName}, 按此救命我们将现在有信息解析为此就相当容易了
stringBuffer
.append(" ")
.append(tableEntity.getNickName()) // 表的nick name
.append(".")
.append(tableEntity.getTableColumns().get(tableEntity.getEntityColumns().indexOf(fieldName))) //通过field名称找到数据表中的字段
.append(" ")
.append("like ")//opreaction 操作
.append("#{parameter.")
.append(key) // 不重复的key 如 userName
.append("}");
parameter.put(key, value); //将对应的key 和 value 存储起来,用于调xml时候作为参数传递过去
//简易的思路就完成了
现在已经准备好解析完成的sqlSegment了,那么我们要把他放在myBatis的Xml里,我们定义个MulSelectMapper.java && MulSelectMapper.xml
//MulSelectMapper.java
public interface MulSelectMapper {
public List> multiSelect(MulSelect param);
//分页统计总数
public Integer countMulSelect(MulSelect param);
}
//MulSelectMapper.xml
select distinct ${selectColumns} from ${masterTable}
left join ${item}
${sqlSegment}
group by ${groupBy}
order by ${orderBy}
limit #{start}, #{end}
现在就差一个通用的service 来调用了 MultipleService.java
public class MultipleService {
MultipleResult multipleSelect(MulSelect param);
}
//调用通用查询将
java多表查询实体类_自己设计一个JAVA+MyBatis解析实体类多表通用查询相关推荐
- MySQL查询多表定义实体类_自己设计一个 JAVA + MyBatis 解析实体类多表通用查询
先来处理一下查询的字段和用到的表吧 //虽然我们使用的时候是实体,但最终还是要解析成sql的,那么我们需要想好解析成sql 时候所用到的东东,提前准备好 class TableEntity { Str ...
- java输入字符串异常_设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”。。。...
设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为"XYZ",则抛出一个异常信息"This is a XYZ",如果从命令 ...
- java开发环境及数据类型实验_实验项目1 Java开发环境与语言基础
<实验项目1 Java开发环境与语言基础>由会员分享,可在线阅读,更多相关<实验项目1 Java开发环境与语言基础(14页珍藏版)>请在人人文库网上搜索. 1.实验项目1 Ja ...
- Java黑皮书课后题第11章:11.2(Person Student Employee Faculty Staff类)设计一个名为Person的类及其两个名为Student和Employee的子类
Java黑皮书课后题第11章:11.2(Person Student Employee Faculty Staff类) 题目 缺陷 UML图 代码 Test02_MyDate.java:用于参考的My ...
- Java黑皮书课后题第10章:*10.10(Queue类)10.6节给出一个Stock类。设计一个名为Queue的类用于存储整数。像栈一样,队列保存元素。在栈中,元素后进先出。队列中元素先进先出
10.10(Queue类)10.6节给出一个Stock类,设计一个名为Queue的类用于存储整数 题目 程序 破题 代码 Test10.java Test10_Queue.java UML 题目 程序 ...
- Java黑皮书课后题第10章:10.4(MyPoint类)设计一个名为MyPoint的类,代表一个以x坐标和y坐标表示的点
10.4(MyPoint类)设计一个名为MyPoint的类,代表一个以x坐标和y坐标表示的点 题目 程序 代码 Test4.java Test4_MyPoint.java 运行实例 UML 题目 程序 ...
- Java黑皮书课后题第10章:10.3(MyInteger类)设计一个名为MyInteger的类
10.3(MyInteger类)设计一个名为MyInteger的类 题目 程序说明 代码 Test3.java Test3_MyInteger.java 运行实例 UML 题目 程序说明 测试程序:T ...
- Java黑皮书课后题第10章:*10.1(Time类)设计一个名为Time的类。编写一个测试程序,创建两个Time对象(使用new Time()和new Time(555550000))
Java黑皮书课后题第10章:*10.1设计一个名为Time的类.编写一个测试程序,创建两个Time对象 题目 程序 代码 Test1.java Test1_Time.java 运行结果 UML 题目 ...
- Java黑皮书课后题第9章:**9.13(Location类)设计一个名为Location的类,定位二维数组中的最大值及其位置。
Java黑皮书课后题第9章:**9.13(Location类)设计一个名为Location的类,定位二维数组中的最大值及其位置 题目 破题 代码 Test13 Test13_Location 运行结果 ...
- Java黑皮书课后题第9章:*9.11(代数:2*2的线性方程)为一个2*2的线性方程设计一个名为LinearEquation的类
Java黑皮书课后题第9章:*9.11(代数:2*2的线性方程)为一个2*2的线性方程设计一个名为LinearEquation的类 题目 破题 代码 Test10 Test11_LinearEquat ...
最新文章
- 高斯计磁场测试仪磁力检测仪磁场测磁仪手持磁通计特斯拉计TD8620
- 台式电脑配置单_5000元最强组组装电脑,游戏配置,组装电脑配置2020年11月更新...
- 小师妹学JavaIO之:文件编码和字符集Unicode
- Flexible 弹性盒子模型之CSS align-items 属性
- ORACLE HANDBOOK系列之十一:分区(Partition)
- 3测试图片显示置信度_云上的移动性能测试平台
- Oracle注册表修改 乱码编码
- 信息学奥赛一本通 1967:【14NOIP普及组】螺旋矩阵 | 洛谷 P2239 [NOIP2014 普及组] 螺旋矩阵
- e0266 cout 不明确_荐书 | 不正义的时代,识别不正义的多重面孔
- [轉]Windows下Subversion配置管理员指南
- php markdown 电子书_PHP Markdown转PDF解决方案
- 20200128每日一句
- 马尔科夫决策过程(MDP) : BlackJack问题(MC-ES)
- deepin驱动精灵_深度Linux Deepin系统安装教程使用体验
- Python 相异性矩阵计算
- 《图像处理、分析与机器视觉 第四版》 摄像机 相机概述——学习笔记
- 这两款好用的识别图片文字的软件app值得你们收藏
- 关于案例式C语言上机指导与习题解答中实验4_15题的解答
- 什么是java线程?java线程模型的组成
- CTFHUB http协议题目 学习笔记 详细步骤 请求方式 302跳转 cookie 基础认证 响应源代码
热门文章
- Atitit 深入理解软件的本质 attilax总结 软件三原则三次原则是DRY原则和YAGNI原则的折
- atitit.身份认证解决方案attilax总结
- atitit.atiHtmlUi web组件化方案与规范v1
- atitit.eclipse有多少api 扩展点,以及扩展点的设计
- paip.语义相关是否可在 哈米 的语义分析中应用
- paip.chrome使用ACTIVX 的总结
- paip.程序模块间的通讯方式大总结
- 中国期货交易技术的逆袭之路
- 亚马逊:贝佐斯没有闹钟
- 和10位CIO,聊了聊他们今年的OKR