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 23 Java/Android
浅谈Python魔法方法
Jun 28 Java/Android
Java并发编程必备之Future机制
Jun 30 Java/Android
JavaWeb 入门:Hello Servlet
Jul 16 Java/Android
浅谈spring boot使用thymeleaf版本的问题
Aug 04 Java/Android
Java spring定时任务详解
Oct 05 Java/Android
SpringCloud项目如何解决log4j2漏洞
Apr 10 Java/Android
springboot读取nacos配置文件
May 20 Java/Android
Android中的Launch Mode详情
Jun 05 Java/Android
Springboot中如何自动转JSON输出
Jun 16 Java/Android
Spring Cloud OAuth2实现自定义token返回格式
Jun 25 Java/Android
volatile保证可见性及重排序方法
Aug 05 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线程的内存回收问题
2016/07/08 PHP
php下载文件超时时间的设置方法
2016/10/06 PHP
JavaScript Date对象 日期获取函数
2010/12/19 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
2013/05/07 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
js实现点小图看大图效果的思路及示例代码
2013/10/28 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
2014/10/17 Javascript
jQuery搜索同辈元素方法
2015/02/10 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
AngularJs动态加载模块和依赖注入详解
2016/01/11 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
浅谈jquery的map()和each()方法
2016/06/12 Javascript
javascript如何创建对象
2016/08/29 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
Vue工程模板文件 webpack打包配置方法
2017/12/26 Javascript
JS实现简单的星期格式转换功能示例
2018/07/23 Javascript
代码整洁之道(重构)
2018/10/25 Javascript
js实现橱窗展示效果
2020/01/11 Javascript
vue+echarts实现动态折线图的方法与注意
2020/09/01 Javascript
小程序实现录音功能
2020/09/22 Javascript
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
python构造icmp echo请求和实现网络探测器功能代码分享
2014/01/10 Python
下载给定网页上图片的方法
2014/02/18 Python
pyspark 读取csv文件创建DataFrame的两种方法
2018/06/07 Python
python 实现A*算法的示例代码
2018/08/13 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
英国百安居装饰建材网上超市:B&Q
2016/09/13 全球购物
美国专业级皮肤病和spa品质护肤品的高级零售网站:SkinCareRx
2017/02/06 全球购物
西班牙鞋子和箱包在线销售网站:zapatos.es
2020/02/17 全球购物
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
平面网站制作专科生的自我评价分享
2013/12/11 职场文书
毕业生的自我评价分享
2013/12/18 职场文书
产品质量承诺范本
2014/03/31 职场文书
法制工作总结2015
2015/07/23 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书