MyBatis的官方文档中是这样介绍的?java
动态 SQL 是 MyBatis 的强大特性之一。若是你使用过 JDBC 或其它相似的框架,你应该能理解根据不一样条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,能够完全摆脱这种痛苦。sql
使用动态 SQL 并不是一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提高了这一特性的易用性。apache
若是你以前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感受似曾相识。在 MyBatis 以前的版本中,须要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了以前的大部分元素,大大精简了元素种类,如今要学习的元素种类比原来的一半还要少。数组
换句话说,咱们能够根据传入参数的不一样,来执行不一样的查询条件。session
咱们首先建立一个Mapper接口,起名为:UserMapper
,并增长一个方法mybatis
public interface UserMapper { public List<User> findByCondition(User user); }
同时建立一个xml文件,起名为UserMapper.xml
而后编写SQLapp
<mapper namespace="com.dxh.dao.UserMapper"> <select id="findByCondition" parameterType="com.dxh.pojo.User" resultType="com.dxh.pojo.User"> SELECT * FROM user where 1=1 <where> <if test="id != null"> id = #{id} </if> </where> </select> </mapper>
这个SQL的意思是:框架
SELECT * FROM user where id = #{id}
SELECT * FROM user where 1=1
很明显咱们能够看到where 1=1
是多余的,所以咱们能够这样写:学习
<select id="findByCondition" parameterType="com.dxh.pojo.User" resultType="com.dxh.pojo.User"> SELECT * FROM user where 1=1 <where> <if test="id != null"> id = #{id} </if> </where> </select>
编写一个测试类:测试
package com.dxh.test; import com.dxh.dao.UserMapper; import com.dxh.pojo.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.List; public class TestMain { @Test public void test1() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = build.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(); user.setId(1); List<User> byCondition = mapper.findByCondition(user); for (User user1 : byCondition) { System.out.println(user1); } System.out.println("======"); User user2 = new User(); List<User> byCondition2 = mapper.findByCondition(user2); for (User user3 : byCondition2) { System.out.println(user3); } } }
咱们执行两次mapper.findByCondition()
,分别传入user和user2,一个的id有被赋值,一个没有,最后的结果为:
User{id=1, username='lucy'} ====== User{id=1, username='lucy'} User{id=2, username='李四'} User{id=3, username='zhaowu'}
当咱们须要查询出 id为一、二、3时应该怎么作? SQL应该这样写:SELECT * FROM user where id in (1,2,3)
。那么使用mybatis的foreach标签应该如何使用?
在UserMapper
接口中增长一个方法: List<User> findByIds(int[] arr);
public List<User> findByIds(int[] arr);
在UserMapper.xml
中编写:
<select id="findByIds" parameterType="list" resultType="com.dxh.pojo.User"> SELECT * FROM user <where> <foreach collection="array" open="id in (" close=")" item="id" separator=","> #{id} </foreach> </where> </select>
咱们能够看到,foreach中咱们使用到了5个值:
array
,若是是集合就是list
SELECT * FROM user where id in (1,2,3)
正确的SQL应该这样写,那么open就是填写咱们须要拼接的前半部分......where id in (1,2,3)
1,2,3之间用,
分割。@Test public void test2() throws IOException { InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml"); SqlSessionFactory build = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = build.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); int[] arr={1,3}; List<User> byCondition = mapper.findByIds(arr); for (User user1 : byCondition) { System.out.println(user1); } }
输出结果:
User{id=1, username='lucy'} User{id=3, username='zhaowu'}
正确~
这里只是介绍了两个常常使用的标签,mybatis中还有不少标签,好比choose、when、otherwise、trim、set
等等
值得一说的是Mybatis的官方网站中已经支持中文了,母语看着更舒服~