zoukankan      html  css  js  c++  java
  • 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语句。

      

  • 相关阅读:
    使用pickle进行存储变量
    tensorflow的save和restore
    使用tf.print()打印tensor内容
    用python对txt中文件读取,然后按顺序标号存入excel中
    cv2对图像进行旋转和放缩变换
    spring security 允许 iframe 嵌套
    Java+protobuf 实例
    Java处理文件小例子--获取全国所有城市的坐标
    Java 多线程并发 Future+callable 实例
    Java 执行jar linux 实例
  • 原文地址:https://www.cnblogs.com/yaokaizhi/p/9561197.html
Copyright © 2011-2022 走看看