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 相关文章推荐
SpringBoot生成License的实现示例
Jun 16 Java/Android
实体类或对象序列化时,忽略为空属性的操作
Jun 30 Java/Android
解决Swagger2返回map复杂结构不能解析的问题
Jul 02 Java/Android
新手初学Java List 接口
Jul 07 Java/Android
gateway与spring-boot-starter-web冲突问题的解决
Jul 16 Java/Android
Java后台生成图片的完整步骤
Aug 04 Java/Android
SpringBoot整合Mybatis Generator自动生成代码
Aug 23 Java/Android
Java基础——Map集合
Apr 01 Java/Android
springboot用户数据修改的详细实现
Apr 06 Java/Android
Spring Security动态权限的实现方法详解
Jun 16 Java/Android
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
Jul 07 Java/Android
springboot+rabbitmq实现智能家居实例详解
Jul 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 数组遍历顺序理解
2009/09/09 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
2013/10/29 PHP
php遍历删除整个目录及文件的方法
2015/03/13 PHP
javascript 写的一个简单的timer
2009/07/30 Javascript
IFrame跨域高度自适应实现代码
2012/08/16 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
ie浏览器使用js导出网页到excel并打印
2014/03/11 Javascript
jquery常用操作小结
2014/07/21 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
基于Jquery制作图片文字排版预览效果附源码下载
2015/11/18 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
jQuery控制input只能输入数字和两位小数的方法
2019/05/16 jQuery
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
JavaScript实现轮播图片完整代码
2020/03/07 Javascript
Vue elementui字体图标显示问题解决方案
2020/08/18 Javascript
[00:14]护身甲盾
2019/03/06 DOTA
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
Python实现分割文件及合并文件的方法
2015/07/10 Python
python实现中文转换url编码的方法
2016/06/14 Python
Python编程实现正则删除命令功能
2017/08/30 Python
Pandas GroupBy对象 索引与迭代方法
2018/11/16 Python
python实现祝福弹窗效果
2019/04/07 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
CSS3实现类似翻书效果的过渡动画的示例代码
2019/09/06 HTML / CSS
我们是伦敦女孩:WalG
2018/01/08 全球购物
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
十月份红领巾广播稿
2014/01/22 职场文书
淘宝客服自我总结鉴定
2014/01/25 职场文书
酒店管理毕业生自我鉴定
2014/03/02 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
2015年化妆品销售工作总结
2015/05/11 职场文书
2015年社区科普工作总结
2015/05/13 职场文书
2015年教研员工作总结
2015/05/26 职场文书
使用pipenv管理python虚拟环境的全过程
2021/09/25 Python