Mybatis xml mapper 特殊写法总结
项目告一段落,业务代码也写得差不多了,框架仍然用的是 ssm ,为了省去单表数据库操作的代码编写,继续用 mybatis generator 生成单表对应的实体类、dao层映射关联及配置文件,私下还尝试了几个实现批量插入,翻页查询及实体类序列化的插件,还是很奏效的。下面着重介绍一下近期开发中常见的 mybatis xml 中的特殊写法。
1. 关于 >,< 比较运算符的使用
一种写法是直接将 > 换成 > 把 < 换成 <
<if test="start != null">
AND call_time >= #{start}
</if>
<if test="end != null">
AND call_time <= #{end}
</if>
另一种写法是用 <![CDATA[ *** ]]> 将 sql 包起来:
<![CDATA[
and create_time >= #{start}
]]>
2. 实现模糊查询 like
一种是比较规矩一点的写法,用 <bind name=" *** " value = " *** " /> 实现 like 子句的绑定:
<if test="secretId != null and secretId != ''">
<bind name="pattern" value="'%' + secretId + '%'" />
and secret_id like #{pattern}
</if>
注意将 <bind .../> 写在条件判断里面,否则当 secretId 为 null 的时候是会出异常的。
另一种比较简单粗暴,直接写为 '%${like_clause}%' 放到语句中:
<if test="batchNo != null and batchNo != ''">
WHERE batch_no LIKE '%${batchNo}%'
</if>
3. IF(***,***,***) 这样的 mysql 函数在 mybatis 中无效:
<select id="getCallerItems" parameterType="java.lang.String">
SELECT a.account AS name,
IF(tmp1.calledNum IS NULL,0,tmp1.calledNum),
IF(tmp2.ownedCallNum IS NULL,0,tmp2.ownedCallNum)
FROM account a LEFT JOIN (
SELECT COUNT(*) AS calledNum,`owner`
FROM secret_pool
WHERE `status` = 0
<if test="batchNo !=null">
and batch_no = #{batchNo}
</if>
AND call_round > 0
GROUP BY `owner`
)tmp1 ON a.account = tmp1.`owner` LEFT JOIN (
SELECT COUNT(*) AS ownedCallNum,`owner`
FROM secret_pool
WHERE `status` = 0
<if test="batchNo !=null">
and batch_no = #{batchNo}
</if>
GROUP BY `owner`
)tmp2 ON a.account = tmp2.`owner`
</select>
这里我是想用将外连接中因匹配不到对应结果而产生的 null 替换成 0 ,结果非但没有替换成功还查不出正确的结果,心塞。
4. <where>,<choose>,<foreach> 标签的应用:
<where></where> 广泛用于非必传参数的条件查询;
mybatis 中没有表示 else if 的标签,可用<choose> 配合 <otherwise> 来代替;
<foreach> 在传入参数包含集合的时候可用到;
<select id="selectByPagination" resultMap="BaseResultMap" parameterType="bz.sunlight.dto.UserSearchDTO">
SELECT u.* FROM `user` u
LEFT JOIN user_role ur ON u.Id = ur.User_Id
LEFT JOIN role r ON ur.Role_Id = r.Id
<where>
<if test="name != null and name != ''">
u.`Name` LIKE '%${name}%'
</if>
<if test="status != null">
AND u.Status = #{status}
</if>
<if test="roleId != null">
AND r.Id IN
<foreach item="item" collection="roleIds" separator="," open="(" close=")" index="">
#{item, jdbcType=VARCHAR}
</foreach>
</if>
</where>
<if test="sortField != null and sortField != ''">
ORDER BY
<choose>
<when test="isDesc != null and isDesc"> ${sortField} DESC </when>
<otherwise> ${sortField} </otherwise>
</choose>
</if>
<if test="pageSize != null">
<if test="offset != null">
limit ${offset}, ${pageSize}
</if>
<if test="offset == null">
limit ${pageSize}
</if>
</if>
</select>
其实说到底,不管哪种写法都是为了实现一条 sql 语句,后台开发核心还是 sql ,即使框架用得再熟,如果对理解不透数据模型不能高效地查出准确的结果,什么高大上的实现方式都是花架子,至于到底选择哪种写法,个人觉得越简单越好。我虽然在上面列举了不同的实现方式都因为在对的时间遇到了不一定对的它,记下来缅怀那段邂逅。
Mybatis xml mapper 特殊写法总结的更多相关文章
- mybatis xml mapper 文件中 if-else 写法
mybaits 中没有else要用chose when otherwise 代替 范例一 <!--批量插入用户--> <insert id="insertBusinessU ...
- mybatis xml动态语句写法
mapper.java: /** * @Description: 根据摄像机Id查询出入记录 * @Param: * name 姓名 * monitorId 布控ID * starttime 开始时间 ...
- 关于Mybatis中Mapper是使用XML还是注解的一些思考
XML 据说可以灵活的进行注解,但是修改以后还是要重新发布程序.当然,你可以说,在Tomcat中改了,然后热加载了,不就可以了.可是一般情况下都是几台,十几台服务器.都是用发布系统,持续集成的方式部署 ...
- mybatis从mapper接口跳转到相应的xml文件的eclipse插件
mybatis从mapper接口跳转到相应的xml文件的eclipse插件 前提条件 开发软件 eclipse 使用框架 mybatis 为了方便阅读源码,项目使用mybatis的时候,方便从mapp ...
- mybatis.xml和mapper.xml的配置
mybatis.xml和mapper.xml的配置 1.创建一个Source Folder 2.完成分包mapper和mybatis 3.创建mybatis.xml文档 4xml文档名 5.名字规范 ...
- mybatis xml和dao扫描写法
第一种:接口和xml不在同一个目录,需要在sqlSessionFactoryBean中额外 指定xml的路径: <!-- myBatis文件 --> <bean id="s ...
- 【mybatis】idea中 mybatis的mapper类去找对应的mapper.xml中的方法,使用插件mybatis-plugin
idea中 mybatis的mapper类去找对应的mapper.xml中的方法,使用插件mybatis-plugin,名字可能叫Free mybatis-plugin 安装上之后,可能需要重启ide ...
- 5.7 Liquibase:与具体数据库独立的追踪、管理和应用数据库Scheme变化的工具。-mybatis-generator将数据库表反向生成对应的实体类及基于mybatis的mapper接口和xml映射文件(类似代码生成器)
一. liquibase 使用说明 功能概述:通过xml文件规范化维护数据库表结构及初始化数据. 1.配置不同环境下的数据库信息 (1)创建不同环境的数据库. (2)在resource/liquiba ...
- (转)解决mybatis的mapper.xml查询不出数据,结果一直为null问题
背景:记录mybatis使用过程中遇到的相关问题. 解决mybatis的mapper.xml查询不出数据,结果一直为null问题 解决方案: 1 修改实体类与数据库字段名相同 2 修改sql查询语句, ...
随机推荐
- Linux文件(夹)属性
ll 或者 ls -lh 查看文件属性:
- 【Linux】修改CentOS7启动方式
## 查看当前系统的默认启动方式: systemctl get-default ## 查看如下文件 cat /etc/inittab 可以看到 此文件中提示了如何进行修改默认的启动方式 ## 命令行启 ...
- c# List<Object>和List<实体>相互转化
开发的过程中总会遇到各种转化的问题,现在我做的开发接口中就遇到需要将List<Object> 中的Object又含有List<实体>归为一个list中,就是要list中没有Li ...
- Linux下相关性能指标数据采集
1)如何查看某个服务进程所占本机物理内存及百分比情况?可以使用Linux命令行查看,也可以使用脚本实现.如下以查看本机kube-nginx服务进程为例: [root@kevin ~]# pidof k ...
- ES6 正则扩展
一.新增 flags 属性 ES6 为正则表达式新增了flags属性,会返回正则表达式的修饰符. // ES5 的 source 属性 // 返回正则表达式的正文 /abc/ig.source // ...
- MaxPlus WStr Python 中的字符串传递给 MaxPlus
MaxPlus WStr Python 中的字符串传递给 MaxPlus 在 MaxPlus 中,很多方法的参数使用的字符串的类是 WStr,所以在 Python 中,我们传递字符串的时候,就要把 P ...
- Python 'takes exactly 1 argument (2 given)' Python error
Python,定义urlConfig 接收参数,正常传递参数时,出现,多给了一个参数的错误问题, 定义class的函数之后,在调用的时候出现“'takes exactly 1 argument (2 ...
- Wide & Deep Learning for Recommender Systems
Wide & Deep Learning for Recommender Systems
- AOP(execution表达式)
作者:门罗的魔术师 推荐:y-yg 在使用spring框架配置AOP的时候,不管是通过XML配置文件还是注解的方式都需要定义pointcut"切入点" 例如定义切入点表达式 ex ...
- Selenium常用API的使用java语言之6-WebDriver常用方法
前面我们已经学习了定位元素, 定位只是第一步, 定位之后需要对这个元素进行操作, 或单击(按钮) 或 输入(输入框) , 下面就来认识这些最常用的方法. 1.WebDriver 常用方法 下面先来认识 ...