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 相关文章推荐
分析Netty直接内存原理及应用
Jun 14 Java/Android
详解SpringBoot异常处理流程及原理
Jun 21 Java/Android
深入理解以DEBUG方式线程的底层运行原理
Jun 21 Java/Android
Java基础-封装和继承
Jul 02 Java/Android
SpringBoot整合RabbitMQ的5种模式实战
Aug 02 Java/Android
Java后台生成图片的完整步骤
Aug 04 Java/Android
Java面试题冲刺第十九天--数据库(4)
Aug 07 Java/Android
Java实现给Word文件添加文字水印
Feb 15 Java/Android
Java设计模式之享元模式示例详解
Mar 03 Java/Android
Android超详细讲解组件ScrollView的使用
Mar 31 Java/Android
Java基础——Map集合
Apr 01 Java/Android
JAVA 线程池(池化技术)的实现原理
Apr 28 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
77A一级收信机修理记
2021/03/02 无线电
php中的时间处理
2006/10/09 PHP
VB中的RasEnumConnections函数返回632错误解决方法
2014/07/29 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
微信 getAccessToken方法详解及实例
2016/11/23 PHP
PHP中TP5 上传文件的实例详解
2017/07/31 PHP
Laravel框架下的Contracts契约详解
2020/03/17 PHP
js继承 Base类的源码解析
2008/12/30 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
jQuery简单实现banner图片切换
2014/01/02 Javascript
jquery 无限级下拉菜单的简单实现代码
2014/02/21 Javascript
jquery选择器使用详解
2014/04/08 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
JavaScript实现iframe自动高度调整和不同主域名跨域
2016/02/27 Javascript
jQuery Ajax页面局部加载方法汇总
2016/06/02 Javascript
AngularJS入门教程之Helloworld示例
2016/12/25 Javascript
JavaScript计时器用法分析【setTimeout和clearTimeout】
2017/01/18 Javascript
js原生代码实现轮播图的实例讲解
2017/07/28 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
javascript执行上下文、变量对象实例分析
2020/04/25 Javascript
JQuery绑定事件四种实现方法解析
2020/12/02 jQuery
python中stdout输出不缓存的设置方法
2014/05/29 Python
Python 关于反射和类的特殊成员方法
2017/09/14 Python
python 不以科学计数法输出的方法
2018/07/16 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
python中四舍五入的正确打开方式
2021/01/18 Python
实习自荐信
2013/10/13 职场文书
办公室前台岗位职责
2014/01/04 职场文书
民族团结先进个人事迹材料
2014/06/02 职场文书
节能环保口号
2014/06/12 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
2021/04/01 PHP
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js