前言:
在业务比较复杂的情况下,我们通常需要去拼接SQL语句来完成相关操作,有过这方面开发经验的同学,一定可以体会到大量的手动拼接SQL有多么痛苦,而且出错率很高。没关系,MyBatis有一个非常方便且强大的功能就是动态SQL,使用动态SQL,可以摆脱手动拼SQL的痛苦。
代码:
我们通过对user对象的操作来举例说明。
1 <select id="get" parameterType="com.yulei.mybatis.model.User" resultType="com.yulei.mybatis.model.User"> 2 select id, username, password from t_user where id = #{id} and username = #{username} 3 and password = #{password} 4 </select>
测试类如下:
1 public class Test { 2 3 @org.junit.Test 4 public void test() { 5 InputStream is = null; 6 try { 7 is = Resources.getResourceAsStream("config.xml"); 8 } catch (IOException e) { 9 e.printStackTrace(); 10 } 11 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); 12 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is); 13 SqlSession sqlSession = sqlSessionFactory.openSession(); 14 UserMapper userDAO = sqlSession.getMapper(UserMapper.class); 15 //创建参数 16 User user = new User(); 17 user.setId(1); 18 user.setUsername("yulei222"); 19 User user2 = userDAO.get(user); 20 System.out.println(user2); 21 } 22 23 }
上面的测试类运行结果为:
1 16:41:34,930 DEBUG get:159 - ==> Preparing: select id, username, password from t_user where id = ? and username = ? and password = ? 2 16:41:34,962 DEBUG get:159 - ==> Parameters: 1(Integer), yulei222(String), null 3 16:41:34,984 DEBUG get:159 - <== Total: 0 4 null
显然这条SQL语句是查询不出任何结果的。
现在针对这种情况进行优化,判断user对象,如果password属性值不为null,则SQL语句添加password的判断,如果password属性为null,则不添加。
我们可以使用动态SQL来完成上述操作。
1 <select id="get" parameterType="com.yulei.mybatis.model.User" resultType="com.yulei.mybatis.model.User"> 2 select id, username, password from t_user 3 <where> 4 <if test="username!=null"> 5 and username = #{username} 6 </if> 7 <if test="password!=null"> 8 and password = #{password} 9 </if> 10 </where> 11 </select>
加一个if控制语句,运行结果为:
1 16:44:50,113 DEBUG get:159 - ==> Preparing: select id, username, password from t_user where id = ? and username = ? 2 16:44:50,159 DEBUG get:159 - ==> Parameters: 1(Integer), yulei222(String) 3 16:44:50,173 DEBUG get:159 - <== Total: 1 4 User{id=1, username='yulei222', password='123456'}
可以看到,成功查询出数据库第一条记录。
choose,when标签
choose,when标签和if标签用法很类似。
set标签
set标签用于update操作,会自动根据参数选择生成SQL语句。
1 <update id="update" parameterType="user"> 2 update t_user 3 <set> 4 <if test="username!=null"> 5 username = #{username}, 6 </if> 7 <if test="password!=null"> 8 password = #{password}, 9 </if> 10 <if test="age!=0"> 11 age = #{age} 12 </if> 13 </set> 14 where id = #{id} 15 </update>
foreach标签
foreach标签可以迭代生成一系列值,这个标签主要用于SQL的in语句。