脚本sql

XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现。适用于xml配置转换到注解配置
@Select("<script>select * from user <if test=\"id !=null \">where id = #{id} </if></script>")
public List<User> findUserById(User user);  

很明显,在java中写xml可读性和维护性太差,尤其当SQL很长时,这样写是很痛苦的。

在方法中构建sql

dao接口中是不能写实现的,所以这里借用内部类来生成动态SQL。增改删也有对应的@InsertProvider、@UpdateProvider、@DeleteProvider
@Mapper
public interface MybatisDao {  //使用UserDaoProvider类的findUserById方法来生成sql  @SelectProvider(type = UserDaoProvider.class, method = "findUserById")  public List<User> findUserById(User user);  class UserDaoProvider {  public String findUserById(User user) {  String sql = "SELECT * FROM user";  if(user.getId()!=null){  sql += " where id = #{id}";  }  return sql;  }  }  

这比<script>更加清晰,适用于查询语句不是很长、条件不多的场景,SQL很直观。但是在写很长的SQL时,这样拼接SQL同样会很痛苦

结构化SQL

public String findUserById(User user) {      return new SQL(){{      SELECT("id,name");      SELECT("other");      FROM("user");      if(user.getId()!=null){      WHERE("id = #{id}");      }      if(user.getName()!=null){      WHERE("name = #{name}");      }      //从这个toString可以看出,其内部使用高效的StringBuilder实现SQL拼接
            }}.toString();      } 

这是把前面的内部类改造一下
SELECT:表示要查询的字段,如果一行写不完,可以在第二行再写一个SELECT,这两个SELECT会智能的进行合并而不会重复
FROM和WHERE:跟SELECT一样,可以写多个参数,也可以在多行重复使用,最终会智能合并而不会报错
这样语句适用于写很长的SQL时,能够保证SQL结构清楚。便于维护,可读性高。但是这种自动生成的SQL和HIBERNATE一样,在实现一些复杂语句的SQL时会束手无策。所以需要根据现实场景,来考虑使用哪一种动态SQL
上面的例子只是最基本的用法:更多详细用法,可以参考mybatis中文网的专门介绍
http://www.mybatis.org/mybatis-3/zh/statement-builders.html

List传值错误

动态SQL中,有时要对批量数据进行处理,难免会使用list做为参数
@SelectProvider(type = UserDaoProvider.class, method = "find")  public List<Map> find(List list);      class UserDaoProvider {  public String find(List list) {  

这是一个最简单的list传参,但是在运行时会报传参错误。这是mybatis内部机制造成的,其参数需要是key/value结构,当遇到这里不是key/value结构的list时,mybatis会自己把它转换成key/value结构,key就是他的名字"list",value就是他的值List,要正确传参需要使用key/value结构的map,如下

@SelectProvider(type = UserDaoProvider.class, method = "find")  public List<Map> find(List list);      class UserDaoProvider {  public String find(Map map) {  List list = (List) map.get("list");  

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangb_java/article/details/73657958

转载于:https://www.cnblogs.com/guoyafenghome/p/9123442.html

mybatis的注解开发之三种动态sql相关推荐

  1. SSM—mybatis框架-注解开发-动态sql(where,set,trim,choose,when,foreach)-模糊查询写法-特殊符号处理-缓存

    文章目录 2.0.注解 2.1.动态sql 2.1.1.where 2.1.2.set 2.1.3.trim 2.1.3.1.trim的where 2.1.3.2.trim的set 2.1.4.1.c ...

  2. mybatis使用注解开发

    mybatis使用注解开发 面向接口编程 在之前我们是通过面向对象编程,但是在真正开发的时候我们会选择面向接口编程. 根本原因 : 解耦 , 可拓展 , 提高复用 , 分层开发中 , 上层不用管具体的 ...

  3. Mybatis学习日记(四)——动态SQL第一部分

    Mybatis的强大特性之一是它的动态SQL,在进行项目开发的时候,我们对数据库的操作不可能全部是定式的,当对数据库的操作根据不同情况发生变化时,就可以用到Mybatis的动态SQL.而Mybatis ...

  4. Mybatis整体学习笔记-CRUD-配置解析-结果集映射-日志-注解开发-复杂环境-动态SQL-缓存

    MyBatis 要多对官方文档进行学习 https://mybatis.org/mybatis-3/zh/index.html 简介 MyBatis 持久层框架 Dao Access Objects ...

  5. mybatis入门(四)之动态SQL

    转载自  mybatis 动态SQL 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦. ...

  6. Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql

    mybatis核心:对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. mybatis提供各种标签方法实现动态拼接sql. 1. if&where 1.2 需求 用户信 ...

  7. mybatis之注解开发与逆向工程

    注解开发 MyBatis 最初是一个 XML 驱动的框架.配置信息是基于 XML 的,而且映射语句也是定义在 XML 中的.随着技术的更新发展,对于开发效率要求也原来越高,特别是一些小型项目;越来越多 ...

  8. MyBatis之注解开发

    mybatis常用注解: @Insert:实现新增 @Update:实现更新 @Delete:实现删除 @Select:实现查询 @Result:实现结果集封装 @Results:可以与@Result ...

  9. 【Mybatis 之应用篇】 4_动态SQL、缓存

    文章目录 Mybatis 十二.动态SQL 1.IF 2.choose(when,otherwise) 3.where,set 4.SQL片段 5.Foreach 十三.缓存 (了解) 1.简介 2. ...

最新文章

  1. w ndows7启动后没有图标,Windows7下双击桌面图标无法打开怎么解决?
  2. pandas使用pd.concat纵向合并多个dataframe实战:纵向合并(ignore_index参数)、为纵向合并的多个dataframe设置标识符指定数据来源(通过字典方式设置数据来源键)
  3. 城市大脑全球标准研究3:如何理解城市大脑中的“大脑”?
  4. linux手机刷机包制作工具_刷GitHub提交记录工具制作
  5. java Runtime.getRuntime().exec 获取反弹shell
  6. 磐石云服务器_磐石云爆款高防云服务器3年仅699元 限量100台 BGP线路 1核2G
  7. linux学习笔记-9.查找
  8. 论调用约定__stdcall,__cdecl,__fastcall,thiscall,naked call
  9. kafka集群为什么需要三个节点_大白话带你认识 Kafka
  10. 以links方式安装eclipse插件
  11. 再学C++ Primer(9)-类
  12. mysql数据库逻辑备份与恢复_Mysqldump逻辑备份与恢复
  13. 从 1 加到 55 的值
  14. IDM最强大的多线程下载器 Internet Download Manager v2021 中文版+超多皮肤
  15. python中装饰函数的使用:
  16. PLSQL官方下载、安装和使用完全指南
  17. 计算机类普刊有哪些,计算机类普刊期刊发表推荐
  18. EXCEL如何快速拆分合并单元格数据
  19. 论文投稿指南——准研究生们建议早点发小论文
  20. sublime package control 速度很慢_可怜的ACRH17,它的USB3.0速度被华硕压制了!

热门文章

  1. (转)layoutSubviews总结
  2. hdu 1116 Play on Words
  3. 让弹出窗口变得“体贴”一些
  4. StringTokenizer(字符串标记)
  5. linux 使cpu使用率升高_Linux系统中CPU占用率较高问题排查思路与解决方法
  6. 现代浏览器博物馆_云旅游!Tableau 为你揭秘纽约现代艺术博物馆的珍贵馆藏
  7. 全球科技大会鸿蒙,华为开发者大会:全球瞩目的“鸿蒙”面子和里子大格局
  8. java.lang.arr_jxl操作java.lang.ArrayIndexOutOfBoundsException: 441 错误的解决
  9. bigdicmal除法精度设置_Java BigDecimal浮点数运算--如何保证运算精度不溢出
  10. 如何在 Kubernetes 中对无状态应用进行分批发布