当前位置: 首页 > news >正文

Mybatis分页多表多条件查询

个人总结三种方式:

Xml、queryWrapper、PageHelper第三方组件这三种方式进行查询;

方式一:
xml中联表查询,在mapper中传参IPage<T>和条件Map(这里用map装参数)。

代码示例:
Mapper层
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {

IPage<UserInfo>findUserInfoByConditions(IPage<UserInfo>page,@Param("map")Map<String,Object> map);

}

Xml文件
表关系:user表id和user_scope表中user_id是主外键关系,通过这两字段关联两张表查询

<select id="findUserInfoByConditions" resultMap="UserInfoMap">
   SELECT psi.* FROM user_info ui ,user_scope us
   where ui.id=us.user_id
   <if test="map.userName != null and map.userName !='' ">
      and ui.user_name like concat('%',#{map.userName},'%')
   </if>
   <if test="map.userCoding !=null and map.userCoding!='' ">
      and ui.user_coding like concat('%',#{map.userCoding},'%')
   </if>
   <if test="map.userType != null and map.userType!='' ">
      and us.user_type like concat('%',#{map.userType},'%')
   </if>
</select>

Service层

Map map = new HashMap<>();

map.put(“userName”,”james”);

map.put(“userCoding”,”123456”);

map.put(“userType”,”普通用户”);

userInfoMapper.findUserInfoByConditions(page, map));

方式二:

PageHelper第三方组件分页查询,最后new分页对象PageInfo返回,需要注意设置分页参数和查询语句的顺序问题。
依赖引入:
<dependency>
   <groupId>com.github.pagehelper</groupId>
   <artifactId>pagehelper-spring-boot-starter</artifactId>
   <version>1.4.6</version>
</dependency>
代码示例:
Mapper
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {

List<UserInfo> findUserInfoList(@Param("map") Map<String,Object> map);

}

Xml

<select id="findUserInfoList" resultMap="UserInfoMap">
   SELECT psi.* FROM user_info ui ,user_scope us
   where ui.id=us.user_id
   <if test="map.userName != null and map.userName !='' ">
      and ui.user_name like concat('%',#{map.userName},'%')
   </if>
   <if test="map.userCoding !=null and map.userCoding!='' ">
      and ui.user_coding like concat('%',#{map.userCoding},'%')
   </if>
   <if test="map.userType != null and map.userType!='' ">
      and us.user_type like concat('%',#{map.userType},'%')
   </if>
</select>

Service层
int pageNumber=1;

int pageSize=10;

Map map = new HashMap<>();

map.put(“userName”,”james”);

map.put(“userCoding”,”123456”);

map.put(“userType”,”普通用户”);

PageHelper.startPage(pageNumber, pageSize);//这里顺序不能颠倒,改行必须放在查询语句前面,AOP切面编程,即动态代理模式

List<UserInfo> userInfoList = userInfoMapper.findUserInfoList(map));

PageInfo pageInfo = new PageInfo(userInfoList );//该行返回分页对象

方式三:

QueryWrapper查询方式,这里得注意联合查询时,传参的语法问题,具体见代码标记的红色部分

代码示例:

Map层
@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {

IPage<UserInfo> findUserInfo(IPage<UserInfo> page,@Param(Constants.WRAPPER) QueryWrapper<UserInfo> wrappers);

}

Xml

<select id="findUserInfo" resultMap="userInfoMap">
   SELECT ui.* FROM `user_info` ui left join user_scope us
   on ui.id=us.user_id
   ${ew.customSqlSegment}//不能在此处前后加where
</select>

Service层

Int current=1;

Int size=10;

QueryWrapper<UserInfo> wrapper = new QueryWrapper<>();

//这里注意区分是哪张表的字段,根xml里面别名对应,不然如果两张表里面有相同字段,//且出现在查询条件里面时,会分不清是具体哪张表的字段,所以一定得注明别名。

wrapper.like("ui.user_coding", “123455”);

wrapper.like("ui.user_name", “james”);

wrapper.like("us.user_type", “普通用户”)

Page<?> page = new Page<>(current, size);

userInfoMapper.findUserInfo(page, wrapper)

分析上述三种方式,就开发效率而言,方式三最快且好用,当然如果遇到业务逻辑复杂的,则可以通过xml中sql的方式来查。其实就方式三而言,如果不用QueryWrapper联表方式查询,只想用QueryWrapper的单表方式查询,可以将逻辑分层,分成两部分查询,上述三种方式,其sql都是一样的,即:
SELECT ui.* FROM `user_info` ui , user_scope us

where ui.id=us.user_id and us.user_type like '%钢%' and ui.user_name like ‘%james%’ and ui.user_coding like ‘%123%’

将该sql分成两部分:
select * from user_info where id in
(select user_id from user_scope where user_type like ‘%钢%’ )
对应QueryWrapper代码是:
wrapper.like(“user_type”,”普通用户”)
List<Object> idList = userScopeService.list(wrapper);

Wrapper.like(“user_name”,”james”);

Wrapper.like(“user_coding”,”123”);

IPage page = userInfoService.page(page,wrapper);

这样也可以达到效果,当然具体业务得具体调整拆分。如果有其他方式,你分享我整理。

http://www.lryc.cn/news/423386.html

相关文章:

  • SpringBoot快速入门(手动创建)
  • C 408—《数据结构》算法题基础篇—数组(通俗易懂)
  • AI秘境-墨小黑奇遇记 - 初体验(一)
  • 文件IO813
  • STP(生成树)的概述和工作原理
  • 从AGV到立库,物流自动化的更迭与未来
  • 阴阳脚数码管
  • 【Vue3-Typescript】<script setup lang=“ts“> 使用 ref标签 怎么获取 refs子组件呢
  • npm 超详细使用教程
  • TypeScript函数
  • 中海油某海上平台轨道巡检机器人解决方案
  • 【NXP-MCXA153】SPI驱动移植
  • Python if 编程题|Python一对一辅导教学
  • 机器学习——第十一章 特征选择与稀疏学习
  • 花式表演无人机技术详解
  • 服务器那点事--防火墙
  • C:每日一题:单身狗
  • SQL之使用存储过程循环插入数据
  • 智慧楼宇公厕系统小程序,提高卫生间管理使用效率
  • 深度剖析:云数据库与传统数据库的显著差异
  • # 利刃出鞘_Tomcat 核心原理解析(六)
  • 双亲委派模型
  • Linux下ETCD安装、配置、命令
  • 【QT】静态库与动态库
  • R的行和列命名和类型的转换
  • 某通用系统0day审计过程
  • windows C++-高级并发和异步(一)
  • Java FX 学习
  • 【走迷宫】
  • linux(debian)迁移var数据到已分配逻辑卷的物理盘