• 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语句。

      

  • 相关阅读:
    HTB-靶机-Lazy
    HTB-靶机-Brainfuck
    HTB-靶机-October
    java编程思想-java注解
    HMAC的JAVA实现和应用
    HMACSHA1算法的JAVA实现
    常见软件安全漏洞样例代码
    [移动应用安全]移动应用安全培训PPT
    [标准性文档]WEB应用安全验证标准
    [安全测试报告]针对某厂商的一次渗透性测试
  • 原文地址:https://www.cnblogs.com/yaokaizhi/p/9561197.html
Copyright © 2020-2023  润新知