先来处理一下查询的字段和用到的表吧

//虽然我们使用的时候是实体,但最终还是要解析成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解析实体类多表通用查询相关推荐

  1. MySQL查询多表定义实体类_自己设计一个 JAVA + MyBatis 解析实体类多表通用查询

    先来处理一下查询的字段和用到的表吧 //虽然我们使用的时候是实体,但最终还是要解析成sql的,那么我们需要想好解析成sql 时候所用到的东东,提前准备好 class TableEntity { Str ...

  2. java输入字符串异常_设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”。。。...

    设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为"XYZ",则抛出一个异常信息"This is a XYZ",如果从命令 ...

  3. java开发环境及数据类型实验_实验项目1 Java开发环境与语言基础

    <实验项目1 Java开发环境与语言基础>由会员分享,可在线阅读,更多相关<实验项目1 Java开发环境与语言基础(14页珍藏版)>请在人人文库网上搜索. 1.实验项目1 Ja ...

  4. 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 ...

  5. Java黑皮书课后题第10章:*10.10(Queue类)10.6节给出一个Stock类。设计一个名为Queue的类用于存储整数。像栈一样,队列保存元素。在栈中,元素后进先出。队列中元素先进先出

    10.10(Queue类)10.6节给出一个Stock类,设计一个名为Queue的类用于存储整数 题目 程序 破题 代码 Test10.java Test10_Queue.java UML 题目 程序 ...

  6. Java黑皮书课后题第10章:10.4(MyPoint类)设计一个名为MyPoint的类,代表一个以x坐标和y坐标表示的点

    10.4(MyPoint类)设计一个名为MyPoint的类,代表一个以x坐标和y坐标表示的点 题目 程序 代码 Test4.java Test4_MyPoint.java 运行实例 UML 题目 程序 ...

  7. Java黑皮书课后题第10章:10.3(MyInteger类)设计一个名为MyInteger的类

    10.3(MyInteger类)设计一个名为MyInteger的类 题目 程序说明 代码 Test3.java Test3_MyInteger.java 运行实例 UML 题目 程序说明 测试程序:T ...

  8. Java黑皮书课后题第10章:*10.1(Time类)设计一个名为Time的类。编写一个测试程序,创建两个Time对象(使用new Time()和new Time(555550000))

    Java黑皮书课后题第10章:*10.1设计一个名为Time的类.编写一个测试程序,创建两个Time对象 题目 程序 代码 Test1.java Test1_Time.java 运行结果 UML 题目 ...

  9. Java黑皮书课后题第9章:**9.13(Location类)设计一个名为Location的类,定位二维数组中的最大值及其位置。

    Java黑皮书课后题第9章:**9.13(Location类)设计一个名为Location的类,定位二维数组中的最大值及其位置 题目 破题 代码 Test13 Test13_Location 运行结果 ...

  10. Java黑皮书课后题第9章:*9.11(代数:2*2的线性方程)为一个2*2的线性方程设计一个名为LinearEquation的类

    Java黑皮书课后题第9章:*9.11(代数:2*2的线性方程)为一个2*2的线性方程设计一个名为LinearEquation的类 题目 破题 代码 Test10 Test11_LinearEquat ...

最新文章

  1. 高斯计磁场测试仪磁力检测仪磁场测磁仪手持磁通计特斯拉计TD8620
  2. 台式电脑配置单_5000元最强组组装电脑,游戏配置,组装电脑配置2020年11月更新...
  3. 小师妹学JavaIO之:文件编码和字符集Unicode
  4. Flexible 弹性盒子模型之CSS align-items 属性
  5. ORACLE HANDBOOK系列之十一:分区(Partition)
  6. 3测试图片显示置信度_云上的移动性能测试平台
  7. Oracle注册表修改 乱码编码
  8. 信息学奥赛一本通 1967:【14NOIP普及组】螺旋矩阵 | 洛谷 P2239 [NOIP2014 普及组] 螺旋矩阵
  9. e0266 cout 不明确_荐书 | 不正义的时代,识别不正义的多重面孔
  10. [轉]Windows下Subversion配置管理员指南
  11. php markdown 电子书_PHP Markdown转PDF解决方案
  12. 20200128每日一句
  13. 马尔科夫决策过程(MDP) : BlackJack问题(MC-ES)
  14. deepin驱动精灵_深度Linux Deepin系统安装教程使用体验
  15. Python 相异性矩阵计算
  16. 《图像处理、分析与机器视觉 第四版》 摄像机 相机概述——学习笔记
  17. 这两款好用的识别图片文字的软件app值得你们收藏
  18. 关于案例式C语言上机指导与习题解答中实验4_15题的解答
  19. 什么是java线程?java线程模型的组成
  20. CTFHUB http协议题目 学习笔记 详细步骤 请求方式 302跳转 cookie 基础认证 响应源代码

热门文章

  1. Atitit 深入理解软件的本质 attilax总结 软件三原则三次原则是DRY原则和YAGNI原则的折
  2. atitit.身份认证解决方案attilax总结
  3. atitit.atiHtmlUi web组件化方案与规范v1
  4. atitit.eclipse有多少api  扩展点,以及扩展点的设计
  5. paip.语义相关是否可在 哈米 的语义分析中应用
  6. paip.chrome使用ACTIVX 的总结
  7. paip.程序模块间的通讯方式大总结
  8. 中国期货交易技术的逆袭之路
  9. 亚马逊:贝佐斯没有闹钟
  10. 和10位CIO,聊了聊他们今年的OKR