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

19.Mybatis映射文件mapper.xml之结果字段重命名、根据日期范围筛选、多表连接查询动态排序

目录

1.查询结果段代码

(1)字段起别名

(2)字段为null,则结果为false,否则为true

2.查询条件段代码

(1)查询日期范围与条件参数日期范围有交集的数据

(2)根据条件动态排序

(3)根据字段拼音排序


1.查询结果段代码

<!--多张表连接查询,字段起别名--><sql id="resultList">SELECTa.id AS id,c.id AS unitId,c.name AS unitName,b.title AS title,isnull(a.price)!=1 as hasPrice,a.modifier AS modifier,a.modify_time AS modifyTimeFROMtable_a aLEFT JOIN table_b b ON a.info_id = b.idLEFT JOIN table_c c ON b.unit_id = c.id</sql>
  • (1)字段起别名

如上段代码,三张表做关联查询,给c表的name字段起别名为unitName;给a表的modify_time字段起别名为modifyTime;  给isnull(a.price)!=1的结果命名为hasPrice。

  • (2)字段为null,则结果为false,否则为true

如上段代码,其中isnull(a.price)!=1 as hasPrice 表示如果a表的price字段有数据则结果为1,如果a表的price字段为null则结果为0。结果映射到java的布尔类型属性上,1就为true,0就为false

代码执行逻辑分析:isnull(a.price)只有两种结果。结果为1,表示a表的price为空,结果为0,表示a表的price不为空。再判断isnull(a.price)的结果是否不等于1,相当于给isnull(a.price)的结果取反,即得到预期的结果。

2.查询条件段代码

 <include refid="resultList"/><where>1=1<if test="startDate != null and endDate != null">and ((start_date BETWEEN #{startDate} AND #{endDate})OR (end_date BETWEEN #{startDate} AND #{endDate})OR (start_date &lt; #{startDate} AND end_date &gt; #{endDate}))</if><if test="unitId != null and unitId !=''">and c.id=#{unitId}</if><if test="title != null and title !=''">and b.title like concat('%', #{title}, '%')</if>/*默认排序:未配置价格的显示在前,已配置显示在后;再根据更新时间倒序排序;最后根据交易单元排序;*/<if test="sortParam == null or sortParam.sortName == null">order by isnull(a.price)  desc,a.modify_time desc,c.sort asc</if><if test="sortParam != null"><if test="sortParam.sortName == 'unitName'">/*根据拼音排序*/order by CONVERT(c.abbreviation USING gbk)</if><if test="sortParam.sortName == 'title'">order by b.title</if><if test="sortParam.sortName == 'hasPrice'">order by isnull(a.price)!=1</if><if test="sortParam.sortName == 'modifier'">order by a.modifier</if><if test="sortParam.sortName == 'modifyTime'">order by a.modify_time</if><if test="sortParam.orderType == 1">asc</if><if test="sortParam.orderType == 2">desc</if></if></where>

查询条件段完整段代码如上。

  • (1)查询日期范围与条件参数日期范围有交集的数据

需求:查询数据库表字段start_date和end_date日期范围内有落在条件参数[startDate,endDate]之间的日期的数据;

 <if test="startDate != null and endDate != null">and ((start_date BETWEEN #{startDate} AND #{endDate})OR (end_date BETWEEN #{startDate} AND #{endDate})OR (start_date &lt; #{startDate} AND end_date &gt; #{endDate}))</if>

代码分析:查询出[start_date,end_date]和[startDate,endDate]有交集的数据;其中&lt;表示小于号<,&gt;表示大于号;

  • (2)根据条件动态排序

需求:如果排序条件参数为空,则自定义默认的排序;否则,根据条件参数名来指定对应的表对应的字段做排序。代码如下:

 /*默认排序:未配置价格的显示在前,已配置显示在后;再根据更新时间倒序排序;最后根据交易单元排序;*/<if test="sortParam == null or sortParam.sortName == null">order by isnull(a.price)  desc,a.modify_time desc,c.sort asc</if><if test="sortParam != null"><if test="sortParam.sortName == 'unitName'">/*根据拼音排序*/order by CONVERT(c.abbreviation USING gbk)</if><if test="sortParam.sortName == 'title'">order by b.title</if><if test="sortParam.sortName == 'hasPrice'">order by isnull(a.price)!=1</if><if test="sortParam.sortName == 'modifier'">order by a.modifier</if><if test="sortParam.sortName == 'modifyTime'">order by a.modify_time</if><if test="sortParam.orderType == 1">asc</if><if test="sortParam.orderType == 2">desc</if></if>
  • (3)根据字段拼音排序

<if test="sortParam.sortName == 'unitName'">/*根据拼音排序*/order by CONVERT(c.abbreviation USING gbk)
</if>

在MySQL数据库中,使用UTF-8编码时,默认的排序规则(如utf8_general_ci)并不支持按拼音顺序排序中文字符。常规做法是利用CONVERT函数将字符集转换为GBK,从而实现拼音排序。


http://www.mrgr.cn/news/46946.html

相关文章:

  • Vue实现滚动条三角样式和自定义样式
  • npm : 无法加载文件 D:\phpdev\nodejs\npm.ps1
  • 【数据可视化-12】数据分析岗位招聘分析
  • Android 15应用适配指南:所有应用的行为变更
  • java开发
  • 慧集通(DataLinkX)iPaaS集成平台-业务建模之业务对象(二)
  • HivisionIDPhotos:一键生成完美证件照的AI神器【AIStarter:AI证件照、AI绘画、AI办公...】
  • 安装虚拟机
  • 27Kstar项目:无GPU也能轻松构建本地智能知识库
  • 【Java_EE】Day05 MyBatis注解开发
  • Python | Leetcode Python题解之第467题环绕字符串中唯一的子字符串
  • Dockerfile搭建环境案例
  • npm install报错一堆sass gyp ERR!
  • 解决html2canvas图片模糊不清,超出一页长截图问题
  • python爬虫 - 数据提取
  • 【无人水面艇路径跟随控制10】(Matlab)USV代码阅读:testUSV仿真无人水面艇在一定时间内的运动,使用欧拉法对状态进行积分,并绘制仿真结果
  • Day2 IDEA
  • C#中,虚方法(virtual) 和 抽象方法(abstract)的应用说明
  • Elasticsearch 索引备份
  • python xml的读取和写入
  • 【centos 虚拟机】kvm权限报错解决 gid:107
  • Unity3D 动画回调函数详解
  • 怎么把mov格式的视频转换mp4?视频格式转换就看这5招!(值得收藏)
  • 喜讯!华秋电子宣布完成新一轮3.1亿元融资
  • 引领数字化转型新潮流:The Open Group 2024生态系统架构·可持续发展年度大会邀您共襄盛举
  • 从零开始搭建一个node.js后端服务项目