码迷,mamicode.com
首页 > 数据库 > 详细

MyBatis的动态SQL详解

时间:2014-08-12 10:30:34      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:otherwise   关键词   content   表达式   title   

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 title = #{title}  

    

    

        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 title = #{title}  

        

        

            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   

    

        

            title = #{title}  

        

        

            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"

    

        

            title = #{title}  

        

        

            and content = #{content}  

        

        

            or owner = #{owner}  

        

    

 

 

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

Xml代码  保藏代码

 

    update t_blog  

    

        

            title = #{title},  

        

        

            content = #{content},  

        

        

            owner = #{owner}  

        

    

    where id = #{id}  

 

 上述示例代码中,假如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 id in  

    

        #{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();  

    ids.add(1);  

    ids.add(3);  

    ids.add(6);  

    Listblogs = blogMapper.dynamicForeachTest(ids);  

    for (Blog blog : blogs)  

        System.out.println(blog);  

    session.close();  

}  

 

2.单参数array数组的类型:

Xml代码  保藏代码

 

    select * from t_blog where id in  

    

        #{item}  

    

 

 上述collection为array,对应的Mapper代码:

Java代码  保藏代码

public ListdynamicForeach2Test(int[] ids);  

 对应的测验代码:

Java代码  保藏代码

@Test  

public void dynamicForeach2Test() {  

    SqlSession session = Util.getSqlSessionFactory().openSession();  

    BlogMapper blogMapper = session.getMapper(BlogMapper.class);  

    int[] ids = new int[] {1,3,6,9};  

    Listblogs = blogMapper.dynamicForeach2Test(ids);  

    for (Blog blog : blogs)  

        System.out.println(blog);  

    session.close();  

}  

 

3.自个把参数封装成Map的类型

Xml代码  保藏代码

 

    select * from t_blog where title like "%"#{title}"%" and id in  

    

        #{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();  

    ids.add(1);  

    ids.add(2);  

    ids.add(3);  

    ids.add(6);  

    ids.add(7);  

    ids.add(9);  

    Map params = new HashMap();  

    params.put("ids", ids);  

    params.put("title", "我国");  

    Listblogs = blogMapper.dynamicForeach3Test(params);  

    for (Blog blog : blogs)  

        System.out.println(blog);  

    session.close();  

}  


MyBatis的动态SQL详解,布布扣,bubuko.com

MyBatis的动态SQL详解

标签:otherwise   关键词   content   表达式   title   

原文地址:http://8917152.blog.51cto.com/8907152/1538835

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!