MyBatis在注解上使用动态SQL方式(@select使用if)


Posted in Java/Android onJuly 07, 2022

MyBatis在注解上使用动态SQL

1、用script标签包围

然后像xml语法一样书写

@Select({"<script>",
                "SELECT * FROM tbl_order",
                "WHERE 1=1",
                "<when test='title!=null'>",
                "AND mydate = #{mydate}",
                "</when>",
                "</script>"})

2、用Provider去实现SQL拼接

例如:

public class OrderProvider {
    private final String TBL_ORDER = "tbl_order"; 
    public String queryOrderByParam(OrderPara param) {
        SQL sql = new SQL().SELECT("*").FROM(TBL_ORDER);
        String room = param.getRoom();
        if (StringUtils.hasText(room)) {
            sql.WHERE("room LIKE #{room}");
        }
        Date myDate = param.getMyDate();
        if (myDate != null) {
            sql.WHERE("mydate LIKE #{mydate}");
        }
        return sql.toString();
    }
}
 
public interface OrderDAO {    
    @SelectProvider(type = OrderProvider.class, method = "queryOrderByParam")
    List<Order> queryOrderByParam(OrderParam param); 
}

注意:方式1有个隐患就是当传入参数为空的时候,可能会造成全表查询。

复杂SQL用方式2会比较灵活(当然,并不建议写复杂SQL),而且可以抽象成通用的基类,使每个DAO都可以通过这个基类实现基本的通用查询,原理类似Spring JDBC Template。

3、说明

如果XML元素嵌入在<script>XML元素中,则可以在注释值中为动态SQL使用XML元素:

@Select("<script>SELECT ...</script>")

但是使用<include>元素会触发SQL Mapper配置解析异常,由以下原因引起:

org.apache.ibatis.builder.BuilderException: Unknown element in SQL statement. at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.parseDynamicTags

如果nodeHandlers在课堂中检查方法org.apache.ibatis.builder.BuilderException,将注意到支持的元素有:

  • trim
  • where
  • set
  • foreach
  • if
  • choose
  • when
  • otherwise
  • bind

然而,包括基于注释的查询中的片段是不可能的。

MyBatis xml注释SQL的注意事项

说明:在mybatis 的sql里不是不能写注释,而是注释不能有#{},mybatis仍旧会把#{}算成一个带注入的参数

如代码段2所示,mysql数据库更换为oracle数据库时,#{date}需要明确jdbcType,而该代码段中仅将适用于mysql的sql注释,依旧会报同样的错,最好是将注释的sql删除。

 <select id="slectSlagsteelRatioByDate" resultType="java.lang.Double">
 
--         select slagsteel_ratio FROM process_history WHERE r furnace_num = #{furnaceNum}
--         ORDER BY real_time DESC limit 0,1
 
select slagsteel_ratio FROM(
 select slagsteel_ratio FROM process_history WHERE real_time &lt;= #{date,jdbcType=TIMESTAMP}
 ORDER BY real_time DESC ) WHERE ROWNUM = 1
</select>

注意事项

1、where语句等用到大于小于等符号时候,需要使用 <![CDATA[ > ]]>或者 <![CDATA[ < ]]>进行识别。

2、如果sql文中有动态sql文标签,比如sql文,此时wwww为传递的参数,不需用#{wwww }取值,直接使用即可。

3、如果超过一个参数,需要在接口方法的每个参数定义时候使用@Param注解。

4、order by语句可以使用动态sql

ORDER BY eeee ORDER BY rrrrrr

5、SELECT

           CASE
           WHEN  条件1 THEN 字段1

WHEN 条件2 THEN 字段2

           ELSE    字段3
           END
  FROM.....

只要满足一个WHEN,后面的WHEN就不会执行了,跳出CASE WHEN 语句

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。


Tags in this post...

Java/Android 相关文章推荐
Java实现斗地主之洗牌发牌
Jun 14 Java/Android
java解析XML详解
Jul 09 Java/Android
SpringBoot整合Mybatis Generator自动生成代码
Aug 23 Java/Android
Java 实现限流器处理Rest接口请求详解流程
Nov 02 Java/Android
Java如何实现通过键盘输入一个数组
Feb 15 Java/Android
Java实现学生管理系统(IO版)
Feb 24 Java/Android
Java并发编程之原子性-Atomic的使用
Mar 16 Java/Android
Java异常体系非正常停止和分类
Jun 14 Java/Android
Spring Cloud OpenFeign模版化客户端
Jun 25 Java/Android
Java+swing实现抖音上的表白程序详解
Jun 25 Java/Android
阿里面试Nacos配置中心交互模型是push还是pull原理解析
Jul 23 Java/Android
Android移动应用开发指南之六种布局详解
Sep 23 Java/Android
一文了解Java动态代理的原理及实现
Jul 07 #Java/Android
Java实现字符串转为驼峰格式的方法详解
Jul 07 #Java/Android
Spring中bean集合注入的方法详解
java中如何截取字符串最后一位
Jul 07 #Java/Android
Java 中的 Lambda List 转 Map 的多种方法详解
Jul 07 #Java/Android
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
Jul 07 #Java/Android
利用Java连接Hadoop进行编程
Jun 28 #Java/Android
You might like
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
php技术实现加载字体并保存成图片
2015/07/27 PHP
Yii2针对指定url的生成及图片等的引入方法小结
2016/07/18 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
2016/11/14 PHP
phpMyAdmin通过密码漏洞留后门文件
2018/11/20 PHP
php面向对象程序设计入门教程
2019/06/22 PHP
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
jQuery中index()的用法分析
2014/09/05 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
2016/12/02 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
JS实现的系统调色板完整实例
2016/12/21 Javascript
Vue 过渡实现轮播图效果
2017/03/27 Javascript
JS实现的四级密码强度检测功能示例
2017/05/11 Javascript
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
微信小程序request出现400的问题解决办法
2017/05/23 Javascript
Vue的移动端多图上传插件vue-easy-uploader的示例代码
2017/11/27 Javascript
JS 数组随机洗牌的实例代码
2018/09/12 Javascript
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
javascript实现日历效果
2019/06/17 Javascript
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
Python实现测试磁盘性能的方法
2015/03/12 Python
python模块smtplib实现纯文本邮件发送功能
2018/05/22 Python
Python面向对象类继承和组合实例分析
2018/05/28 Python
Appium+Python自动化测试之运行App程序示例
2019/01/23 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
新闻专业个人自我评价
2013/09/21 职场文书
大学生职业生涯规划范文
2014/01/22 职场文书
出纳员的岗位职责
2014/02/22 职场文书
反腐倡廉标语
2014/06/24 职场文书
学雷锋标兵事迹材料
2014/08/18 职场文书
党员倡议书
2015/01/19 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
阳光体育运动标语口号
2015/12/26 职场文书