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();
}