设为首页 收藏本站
查看: 841|回复: 0

[经验分享] MyBatis的动态SQL详解

[复制链接]

尚未签到

发表于 2018-10-24 08:22:52 | 显示全部楼层 |阅读模式
  MyBatis的动态SQL是根据OGNL表达式的,号码大全它能够协助咱们方便的在SQL句子关键词挖掘工具中完成某些逻辑。
  MyBatis中用于完成动态SQL的元素首要有:
  if
  choose(when,otherwise)
  trim
  where
  set
  foreach
  if即是简略的条件判别,运用if句子咱们能够完成某些简略的条件挑选。先来看如下一个比如:
  Xml代码  保藏代码
  select * from t_blog where 11 = 1

  and>  and content = #{content}
  and owner = #{owner}
  这条句子的意思十分简略,假如你供给了title参数,那么就要满意title=#{title},相同假如你供给了Content和Owner的时分,它们也需求满意相应的条件,以后即是回来满意这些条件的一切Blog,这是十分有用的一个功用,以往咱们运用其他类型结构或者直接运用JDBC的时分, 假如咱们要到达相同的挑选效果的时分,咱们就需求拼SQL句子,这是极其费事的,比起来,上述的动态SQL就要简略多了。
  choose元素的效果就相当于JAVA中的switch句子,基本上跟JSTL中的choose的效果和用法是相同的,一般都是与when和otherwise调配的。看如下一个比如:
  Xml代码  保藏代码
  select * from t_blog where 11 = 1

  and>  and content = #{content}
  and owner = "owner1"
  when元素表明当when中的条件满意的时分就输出其间的内容,跟JAVA中的switch效果差不多的是依照条件的次序,当when中有条件满意的时分,就会跳出choose,即一切的when和otherwise条件中,只要一个会输出,当一切的我很条件都不满意的时分就输出otherwise中的内容。所以上述句子的意思十分简略, 当title!=null的时分就输出and titlte = #{title},不再往下判别条件,当title为空且content!=null的时分就输出and content = #{content},当一切条件都不满意的时分就输出otherwise中的内容。
  where句子的效果首要是简化SQL句子中where中的条件判别的,先看一个比如,再解释一下where的优点。
  Xml代码  保藏代码
  select * from t_blog

  >  and content = #{content}
  and owner = #{owner}
  where元素的效果是会在写入where元素的当地输出一个where,别的一个优点是你不需求思考where元素里边的条件输出是啥姿态的,MyBatis会智能的帮你处置,假如一切的条件都不满意那么MyBatis就会查出一切的记载,假如输出后是and 最初的,MyBatis会把第一个and疏忽,当然假如是or最初的,MyBatis也会把它疏忽;此外,在where元素中你不需求思考空格的疑问,MyBatis会智能的帮你加上。像上述比如中,假如title=null, 而content != null,那么输出的全部句子会是select * from t_blog where content = #{content},而不是select * from t_blog where and content = #{content},由于MyBatis会智能的把首个and 或 or 给疏忽。
  trim元素的首要功用是能够在自个包括的内容前加上某些前缀,也能够在这以后加上某些后缀,与之对应的特点是prefix和suffix;能够把包括内容的首部某些内容掩盖,即疏忽,也能够把尾部的某些内容掩盖,对应的特点是prefixOverrides和suffixOverrides;正由于trim有这样的功用,所以咱们也能够十分简略的运用trim来替代where元素的功用,示例代码如下:
  Xml代码  保藏代码
  select * from t_blog
  -        indexRead arguments from command-line "http://www.shoudashou.com"
  -        indexRead arguments from command-line "http://www.4lunwen.cn"
  -        indexRead arguments from command-line "http://www.zx1234.cn"
  -        indexRead arguments from command-line "http://www.penbar.cn"
  -        indexRead arguments from command-line "http://www.whathappy.cn"
  -        indexRead arguments from command-line "http://www.lunjin.net"
  -        indexRead arguments from command-line "http://www.ssstyle.cn"
  -        indexRead arguments from command-line "http://www.91fish.cn"
  -        indexRead arguments from command-line "http://www.fanselang.com"

  >  and content = #{content}
  or owner = #{owner}
  set元素首要是用在更新操作的时分,它的首要功用和where元素其实是差不多的,首要是在包括的句子前输出一个set,然后假如包括的句子是以逗号完毕的话将会把该逗号疏忽,假如set包括的内容为空的话则会犯错。有了set元素咱们就能够动态的更新那些修改了的字段。下面是一段示例代码:
  Xml代码  保藏代码
  update t_blog

  >  content = #{content},
  owner = #{owner}

  where>  上述示例代码中,假如set中一个条件都不满意,即set中包括的内容为空的时分就会报错。
  foreach的首要用在构建in条件中,它能够在SQL句子中进行迭代一个调集。foreach元素的特点首要有item,index,collection,open,separator,close。item表明调集中每一个元素进行迭代时的别名,index指定一个姓名,用于表明在迭代过程中,每次迭代到的方位,open表明该句子以啥开端,separator表明在每次进行迭代之间以啥符号作为分隔符,close表明以啥完毕,在运用foreach的时分最关键的也是最简单犯错的即是collection特点,该特点是有必要指定的,但是在不同状况下,该特点的值是不相同的,首要有一下3种状况:
  假如传入的是单参数且参数类型是一个List的时分,collection特点值为list
  假如传入的是单参数且参数类型是一个array数组的时分,collection的特点值为array
  假如传入的参数是多个的时分,咱们就需求把它们封装成一个Map了,当然单参数也能够封装成map,实际上假如你在传入参数的时分,在MyBatis里边也是会把它封装成一个Map的,map的key即是参数名,所以这个时分collection特点值即是传入的List或array目标在自个封装的map里边的key
  下面别离来看看上述三种状况的示例代码:
  1.单参数List的类型:
  Xml代码  保藏代码

  select * from t_blog where>  #{item}
  上述collection的值为list,对应的Mapper是这样的
  Java代码  保藏代码
  public ListdynamicForeachTest(Listids);
  测验代码:
  Java代码  保藏代码
  @Test
  public void dynamicForeachTest() {
  SqlSession session = Util.getSqlSessionFactory().openSession();
  BlogMapper blogMapper = session.getMapper(BlogMapper.class);
  Listids = new ArrayList();

  >
  >
  >  Listblogs = blogMapper.dynamicForeachTest(ids);
  for (Blog blog : blogs)
  System.out.println(blog);
  session.close();
  }
  2.单参数array数组的类型:
  Xml代码  保藏代码

  select * from t_blog where>  #{item}
  上述collection为array,对应的Mapper代码:
  Java代码  保藏代码

  public ListdynamicForeach2Test(int[]>  对应的测验代码:
  Java代码  保藏代码
  @Test
  public void dynamicForeach2Test() {
  SqlSession session = Util.getSqlSessionFactory().openSession();
  BlogMapper blogMapper = session.getMapper(BlogMapper.class);

  int[]>  Listblogs = blogMapper.dynamicForeach2Test(ids);
  for (Blog blog : blogs)
  System.out.println(blog);
  session.close();
  }
  3.自个把参数封装成Map的类型
  Xml代码  保藏代码

  select * from t_blog where>  #{item}
  上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码:
  Java代码  保藏代码
  public ListdynamicForeach3Test(Map params);
  对应测验代码:
  Java代码  保藏代码
  @Test
  public void dynamicForeach3Test() {
  SqlSession session = Util.getSqlSessionFactory().openSession();
  BlogMapper blogMapper = session.getMapper(BlogMapper.class);
  final Listids = new ArrayList();

  >
  >
  >
  >
  >
  >  Map params = new HashMap();

  params.put("ids",>  params.put("title", "我国");
  Listblogs = blogMapper.dynamicForeach3Test(params);
  for (Blog blog : blogs)
  System.out.println(blog);
  session.close();
  }


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-625678-1-1.html 上篇帖子: Informix 11.5 SQL 语句性能监控方法及实现 下篇帖子: vCenter Server中的存储筛选器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表