MyBatis自学(4):动态SQL

  前言:

    在业务比较复杂的情况下,我们通常需要去拼接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语句。

  

原文地址:https://www.cnblogs.com/yaokaizhi/p/9561197.html