mybatis 您所在的位置:网站首页 多表count mybatis

mybatis

#mybatis| 来源: 网络整理| 查看: 265

说明

这只是一个简单联合查询实现,可以用于个人项目或自由玩耍,只是图个快(乐)。 多年前在 mybatisplus2 版本时做的,用了很多年,分享一下设计思路交流一下,代码简陋还请见谅。 如果觉得有点意思可以自由扩展或放弃

简介

实现项目中比较基本的多表通用查询,小功能,不是mvn方式,只能自己拷贝到项目中,窝囊吧。

​实现简单的实体类操作多表, 首先你的项目是使用了mybatis-plus 才可以使用(其实只是用了里面几个注解,自己定义几个和其名称一样的也可以使用),由于写这个的时候mybatisplus

版本还比较低,引用的注解包也比较低,如果你使用的是高版本的话,换成新版本包名即可,不影响功能。

不做任何更改,也不会对项目产生任何影响,与手写 XML 功能一样。

通过解析实体,调用通用的XML来实现多表查询, 提供一个设计多表查询的思路,复杂的Sql嵌套等并不支持哈哈。

目前支持:

left join方式,能关联的两张表的实体中关联字段名称必须一样,数据库字段可以不一样可以通@TableField注解来解决,right join 换个位置喽 其它方式对不起——没有)

where 基本查询条件, sql函数,分页查询,order排序,group by等

可以用来三两句搞定一些简单关联查询业务,解决不需要写的代码

设计说明

如何关联表?

找第一张表注解为 TableId (mybatis-plus 注解)的属性名, 到每二张表找同样的属性名, 如果没找到,反过来找,如果还没找到,挨个属性找。以此类推,实现关联的前提条件是 主从表的实体关联列名必须是一样(不一样可以通过注解)的

// user 表 @TableId private Integer userId // address 表 @TableId private Integer addressId private Integer userId //那么自动条件为 user.user_id = address.user_id //也可以是 @TableId(value="id") private Integer userId // address 表 @TableId(value="id") private Integer addressId @TableField(value="test_user_id") private Integer userId //目前只有left join //那么自动条件为 user.id = address.test_user_id //如果符合这设计条件,你就往里扔就完事了 复制代码 使用说明 将 com.freedomen.multipselect 包放到你的项目中 使 com.freedomen.multipselect.mapper里的xml 要被扫描到,或手动配置 com.freedomen.multipselect.service也要被发现 //引入service @Autowired private MultipleService multipleService; //表关联, 关联用户表和地址表,查找 用户表的所有字段和地址表的所有字段,主表默认字段都给 MultipleSelect multipleSelect = MultipleSelect.newInstance("${1}", new User(), new Address()); multipleSelect .where("${0}") .like("userName", "张三"); multipleService.mulSelect(multipleSelect); 复制代码 查找字段 //MultipleSelect.newInstance 的第一个参数是所要查找的字段 //${0} 或 ${user} 表是第一张表的所有字段 ${0}.userName或${user}.userName表示userName字段, 默认第一张表的字段全部都返回的。 ${}中间的参数可以是后面实体的下标,也可以是表名 如user、user_address //字段中有@TableField(exist=false)注解也是被跳过的 //下面是要订单表的所有信息 和用户的姓名与号码 和地址 //修改字段名,空格加新名称 "${1}.userName newUserName" MultipleSelect.newInstance("${1}.userName,${1}.userPhone,${2}", new Orders(), new User(), new Address()); 复制代码 查找条件 eq: = notEq: != like: LIKE (前置已经加了 '%') between: between and: 改变接下来的连接方式为 AND练级(默认) andOnce: 改变接下来一个的连接方式为 AND or: 改变接下来的连接方式为 OR orOnce 改变接下来一个的连接方式为 OR division:括号 ,不支持括号嵌套括号 in: IN notIn: NOT IN notLike: NOT LIKE isNull: IS NULL isNotNull: IS NOT NULL sql: 简易自定义带sql代码片段 ... //实例好 查找实体后可以操作实体 //注意: 如何实体内属性有值 将会以 eq方式and连接做为where 条件 /* 可以关联的必要条件 Orders: @TableId //或者数据库字段为其它@TableId(value="id") private Long ordersId; private Long userId; ... User: @TableId private Long userId; ... Address: @TableId private Long addressId; private Long userId; ... */ MultipleSelect multipleSelect = MultipleSelect.newInstance("${1}.userName,${1}.userPhone,${2}", new Orders(), new User(), new Address()); multipleSelect .where("${0}") //哪张表 .eq("ordersId", 1) //并且 订单id = 1 .like("ordersName", "cmcc") //并且 订单名称 like ''%cmcc' .or() //改变后续操作关系为 OR, 默认为AND .notEq("orderSno", "123"); //或者 orderSno 不等于 '123' multipleSelect .where("${1}") //哪张表接着用户表 默认and连接 可以 .or()改为 OR .in("userId", [1, 2, 3]); // 并且userId in [1, 2, 3] multipleSelect .where("${2}") .or() .like("adressDetails", "江苏"); //或者 地址 like '江苏' multipleService.mulSelect(multipleSelect); //查询 //括号 multipleSelect.where("${0}") .eq("componyId", 1) .division() .like("userName", "abcd") .or() .like("userPhone", "abcd"); // 部分sql: compony_id = 1 and (user_name = 'abcd' or user_phone = 'abcd') 复制代码 排序 //MultipleSelect.setOrderBy(...columns) MultipleSelect.setOrderBy("${0}.createTime", "${1}.ordersName desc", "${2}.userId asc", ...) 复制代码 分组 //分组一般都要结合聚集函数使用,可以使用的:AVG, COUNT, MAX, MIN, SUM /**统计用户订单总额*/ // 聚集函数使用 函数名:${表名/下标}.属性名; 不可以重命名哦, 下面的sum 字段仍然是 price MultipleSelect.newInstance("${1}, sum:${0}.price", new Orders(), new User()); //(...columns) MultipleSelect.setGoupBy("${0}.userId", ...); 复制代码 SQL 方法使用 //如 查找创建日期为 2019年10月 的订单; //两个问号对应两个参数, 其中使用的仍然是实体的Filed名,不是数据表的字段名 multipleSelect.where("${orders}").sql("year(createTime)=? and month(createTime)=?", new Object[]{2019, 10}); 复制代码 分页 //MultipleSelect.setPage(pageNo, pageSize); MultipleSelect.setPage(1, 15); //第一页 每页 15条 复制代码 multipleService.mulSelect返回结果 //MultipleResult /* 原型 private List data; //结果数据 private Integer pageNo; //如果设置了分页 会有 private Integer pageSize; //如果设置了分页 会有 private Integer total; //如果设置了分页 会有 */ 复制代码 逻辑删除 //默认是读取 mybatis-plus 的 TableLogic 注解 0 未删除, //如果不是用 0 表示未删除, 可以修改 MultipleSelect 的 setCustomWhere 方法中的下面这段中的 0 if (logic != null) sb.append(" AND ") .append(te.getNickName()) .append(".") .append(logic) .append(" = ") .append("0"); 复制代码 对不起,广告时间

做为一名服务端开发同学,如果有后台管理需要自己做却又不想写,那么可以试一下我做的这个中后台低代码平台 简单高效,已经完成并上线很多系统,平均一小时就可以完成一个,而且还有全程开发的视频,只要是个后台就可以免费使用,源码实时生成! 而且还可以用于接口的测试,可视化的方式测试接口可比数据复制来复制去舒服 小到酒店管理系统,大到 erp 都可以使用哦,如下这样小系统

1.gif

2.gif

3.gif

4.gif

5.gif

light2f中后台低代码平台链接入口

多表联合查询仓库



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有