Mybatis-动态SQL

小技巧

<!--设置经典数据库命名(CURRENT_TIME)为驼峰命名(currentTime)-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>

动态SQL

1.定义:增加了逻辑判断进行拼接的SQL语句
UserMapperTest.class

public class UserMapperTest {
   SqlSession sqlSession;
   UserMapper userMapper;
   StudentMapper studentMapper;
   TeacherMapper teacherMapper;
   public UserMapperTest() throws IOException {
      this.sqlSession = MybatisUtil.getSQLSession();
      this.userMapper = sqlSession.getMapper(UserMapper.class);
      this.studentMapper = sqlSession.getMapper(StudentMapper.class);
      this.teacherMapper = sqlSession.getMapper(TeacherMapper.class);
   }

   //动态SLQ之if
   @Test
   public void getUserByid(){
      UserPojo userPojo = new UserPojo(9000,"2000","500");
      List<UserPojo> userByid = userMapper.getUserByid(userPojo);
      for (UserPojo user:userByid){
         System.out.println(user);
      }
   }

   @Test
   public void updateUserByid2(){
      UserPojo userPojo = new UserPojo(500,"9000000","500");
      int i = userMapper.updateUserByid2(userPojo);
      System.out.println(i);
   }

   @Test
   public void getListUser2(){
      ArrayList<Integer> list = new ArrayList<Integer>();
      list.add(1000);
      list.add(500);
      list.add(5);
      list.add(4);
      list.add(3);
      list.add(2);
      List<UserPojo> listUser = userMapper.getListUser(list);
      for (UserPojo user:listUser) {
         System.out.println(user);
      }
   }
}

UserMapper.class

public interface UserMapper {
    //查询所有用户
    @Select("select id,name,password pwd from user")
    List<UserPojo> getListUser();

    //添加用户
    @Insert("insert into user values(#{id},#{name},#{pwd})")
    int addUser(UserPojo userPojo);

    //更新用户
    @Update("update user set name=#{name},password=#{pwd} where id=#{id}")
    int updateUser(UserPojo userPojo);

    //查询id为500 and 如果password有值,也作为一个条件
    List<UserPojo> getUserByid(UserPojo userPojo);

    int updateUserByid2(UserPojo userPojo);

    //forEach
    List<UserPojo> getListUser(ArrayList<Integer> list);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace相当于(UserMapperImpl)实现dao层接口-->
<mapper namespace="com.test.mapper.UserMapper">
    <!--动态SQL之if-->
    <!--<select id="getUserByid" resultType="UserAliasesType">
        select id,name,password pwd from user
        where id=#{id}
        <if test="pwd!=null">
            and password=#{pwd}
        </if>
    </select>-->
    <!--含有多个if的情况
    1.null不等于""
    2.test中的条件可以自定义(可以添加逻辑and or)
    3.if满足之后下一个if继续判断,并不会满足前面的后面的就停止
    -->
    <!--<select id="getUserByid" resultType="UserAliasesType">
        select id,name,password pwd from user
        where id=#{id}
        <if test="pwd!=''">
            and password=#{pwd}
        </if>
        <if test="name!=null">
            and name=#{name}
        </if>
    </select>-->
    <!--动态SQL之choose,when,otherwise
    有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
    1.满足when中的一个条件就返回
    2.所有都不满足就返回otherwise中的值
    如同(if elseif else)
    -->
    <!--<select id="getUserByid" resultType="UserAliasesType">
        select id,name,password pwd from user
        where 1=1
        <choose>
            <when test="id==1000">
                and id=#{id}
            </when>
            <when test="id==500">
                and id=#{id}
            </when>
            <otherwise>
                and id=1
            </otherwise>
        </choose>
    </select>-->
    <!--动态SQL之While,trim,set
    where 元素只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。
    如果 where 元素与你期望的不太一样,你也可以通过自定义 trim 元素来定制 where 元素的功能。
    1.where不用手写了变成了自动拼接的标签
    2.and可以直接全部加上mybatis会自动去掉,但是不能不写
    -->
    <!--<select id="getUserByid" resultType="UserAliasesType">
        select id,name,password pwd from user
        <where>
            <if test="id!=null">
                and id=#{id}
            </if>
            <if test="name!=null">
                and name=#{name}
            </if>
        </where>
    </select>-->

    <!--trim标签
    prefixOverrides 属性会忽略通过管道符分隔的文本序列(注意此例中的空格是必要的)。上述例子会移除所有 prefixOverrides 属性中指定的内容,并且插入 prefix 属性中指定的内容。
    prefix:前缀
    prefixOverrides:前缀重写
    suffix:后缀
    suffixOverrides:后缀重写
    -->
    <!--<select id="getUserByid" resultType="UserAliasesType">
        select id,name,password pwd from user
        <trim prefix="where" prefixOverrides="and">
            <if test="id!=null">
                and id=#{id}
            </if>
            <if test="name!=null">
                and name=#{name}
            </if>
        </trim>
    </select>-->
    <!--set 元素可以用于动态包含需要更新的列,忽略其它不更新的列。
    1.同样这里的,不能不写,可以多写-->
    <!--<update id="updateUserByid2">
        update user
        <set>
            <if test="id!=null">
                id=#{id},
            </if>
            <if test="name!=null">
                name=#{name},
            </if>
        </set>
        where id=#{id}
    </update>-->
    <!--trim 自定义set-->
    <!--<update id="updateUserByid2">
        update user
        <trim prefix="set" suffixOverrides=",">
            <if test="id!=null">
                id=#{id},
            </if>
            <if test="name!=null">
                name=#{name},
            </if>
        </trim>
        where id=#{id}
    </update>-->

    <!--foreach
    动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)-->
    <select id="getListUser" resultType="UserAliasesType">
        select * from USER
        where id in
        <foreach collection="ArrayList" item="id" index="item" open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>
</mapper>

script和bind(有待练习)

Mybatis-动态SQL

学习【bilibili狂神说Java】

上一篇:Linux之locate命令


下一篇:Java使用JDBC的PreparedStatement对象查询数据库示例