MyBatis框架:第九章:动态SQL语句

简介: MyBatis框架:第九章:动态SQL语句

准备工作:

public class User {

private int id;

private String lastName;

private int sex;

14.1、if 语句

说明: if语句,可以动态的根据你的值来决定,是否需要动态的添加查询条件。

UserMapper类中的方法

public interface UserMapper {
  public List<User> queryUsersByNameAndSex(User user);
}

UserMapper配置文件中的配置

<!-- 
  if语句
 -->
<select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.bean.User">
  select id,last_name lastName,sex  from t_user where 
  <!-- 我们希望动态的创建这个条件语句 -->
  <if test="lastName != null">
    last_name like concat('%',#{ lastName },'%')
  </if>
  <if test="sex == 0 or sex == 1">
    and sex = #{sex}
  </if>
</select>

测试代码:

@Test
public void testQueryUsersByNameAndSex() {
  SqlSession session = sqlSessionFactory.openSession();
  try {
    UserMapper userMapper = session.getMapper(UserMapper.class);        
    List<User> users = userMapper.queryUsersByNameAndSex(new User(0, "dmi", 1));      
    System.out.println(users);      
  } finally {
    session.close();
  }
}

执行的结果:

14.2、where 语句

说明: where语句,可以帮我们在多个动态语句中,有效的去掉前面的多余的and 或 or 之类的多余关键字

UserMapper配置文件

<!-- 
  where - if语句
 -->
<select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.atguigu.bean.User">
  select id,last_name lastName,sex  from t_user  
  <where>
    <!-- 我们希望动态的创建这个条件语句 -->
    <if test="lastName != null">
      last_name like concat('%',#{ lastName },'%')
    </if>
    <if test="sex == 0 or sex == 1">
      and sex = #{sex}
    </if>
  </where>
</select>

测试的代码是:

@Test
public void testQueryUsersByNameAndSex() {
  SqlSession session = sqlSessionFactory.openSession();
  try {
    UserMapper userMapper = session.getMapper(UserMapper.class);        
    List<User> users = userMapper.queryUsersByNameAndSex(new User(0, null, 1));     
    System.out.println(users);      
  } finally {
    session.close();
  }
}

测试的结果:

14.3、trim语句

说明: trim 可以动态在包含的语句前面和后面添加内容。也可以去掉前面或者后面给定的内容

prefix 前面添加内容

suffix 后面添加内容

suffixOverrides 去掉的后面内容

prefixOverrides 去掉的前面内容

UserMapper配置文件中的内容

<!-- 
  trim - if 语句
 -->
<select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.bean.User">
  select id,last_name lastName,sex  from t_user  
  <!-- 
    trim 可以动态在包含的语句前面和后面添加内容。也可以去掉前面或者后面给定的内容
      prefix 前面添加内容
      suffix 后面添加内容
      suffixOverrides 去掉的后面内容
      prefixOverrides 去掉的前面内容
   -->
  <trim prefix="where" suffixOverrides="and" prefixOverrides="">
    <!-- 我们希望动态的创建这个条件语句 -->
    <if test="lastName != null">
      last_name like concat('%',#{ lastName },'%') and
    </if>
    <if test="sex == 0 or sex == 1">
      sex = #{sex}
    </if>
  </trim>
</select>

测试代码:

@Test
public void testQueryUsersByNameAndSex() {
  SqlSession session = sqlSessionFactory.openSession();
  try {
    UserMapper userMapper = session.getMapper(UserMapper.class);        
    List<User> users = userMapper.queryUsersByNameAndSex(new User(0, "dmi", 5));      
    System.out.println(users);      
  } finally {
    session.close();
  }
}

测试的结果:

14.4、choose( when , otherwise )语句

说明:choose when otherwise 可以执行多路选择判断,但是只会有一个分支会被执行。类似switch case 语句

UserMapper接口中添加的方法:

public List<User> queryUsersByNameAndSexForChoose(User user);

UserMapper配置文件的内容:

<!-- 
  choose when otherwise 语句
  有点类似于switch case 多路判断。只执行一路。
 -->
<select id="queryUsersByNameAndSexForChoose" parameterType="com.bean.User" 
  resultType="com.bean.User">
  select id,last_name lastName,sex  from t_user  
  <where>
    <choose>
      <when test="id > 0">
        id = #{ id }
      </when>
      <when test="lastName != null">
        last_name = #{lastName}
      </when>
      <otherwise>
        1 = 1
      </otherwise>
    </choose>
  </where>    
</select>

测试的代码:

@Test
public void testQueryUsersByNameAndSexForChoose() {
  SqlSession session = sqlSessionFactory.openSession();
  try {
    UserMapper userMapper = session.getMapper(UserMapper.class);
    List<User> users = userMapper.queryUsersByNameAndSexForChoose(new User(1, "admin", 0));
    System.out.println(users);
  } finally {
    session.close();
  }
}

测试的结果:

14.4、set语句

说明: set语句可以去掉,更新时候,set更新的多个列,由于动态生成的sql语句,而导致多出来的逗号

UserMapper中添加的方法

public int updateUserForSet(User user);

UserMapper配置文件中的内容:

<!-- 
  update语句
  set标签,可以去掉,多个列中的逗号
 -->
<update id="updateUserForSet" parameterType="com.bean.User">
  update t_user 
  <set>
    <if test="lastName != null">
      last_name = #{lastName},
    </if>
    <if test="sex == 0 or sex == 1">
      sex = #{sex}
    </if>
  </set>
  where id = #{id}
</update>

测试代码:

@Test
public void testUpdateUserForSet() {
  SqlSession session = sqlSessionFactory.openSession();
  try {
    UserMapper userMapper = session.getMapper(UserMapper.class);
    userMapper.updateUserForSet(new User(3, "xxxx", 10));
    session.commit();
  } finally {
    session.close();
  }
}

测试结果:

14.5、foreach语句

说明: foreach语句,可以遍历输出一个集合的数据

在UserMapper中添加的方法

public List<User> queryUserByidsForIn(@Param("ids")List<Integer> ids);

UserMapper配置文件中的内容

<!-- 
  foreach语句可以遍历输出数据
    collection属性设置遍历的集合
    open 属性设置遍历输出前的内容
    close 属性设置遍历输出后的内容
    separator 属性设置每输出一个元素中间的间隔内容
    item 属性 当前正在遍历到的数据名
 -->
<select id="queryUserByidsForIn" resultType="com.bean.User">
  select id,last_name,sex from t_user
  where 
    id in 
  <foreach collection="ids" open="(" close=")" separator="," item="item_id">
    #{item_id}
  </foreach>
</select>

测试代码:

@Test
public void testQueryUserByidsForIn() {
  SqlSession session = sqlSessionFactory.openSession();
  try {
    UserMapper userMapper = session.getMapper(UserMapper.class);
    List<Integer> ids = new ArrayList<>();
    ids.add(3);
    ids.add(6);
    ids.add(7);     
    List<User> users = userMapper.queryUserByidsForIn( ids );
    System.out.println(users);
  } finally {
    session.close();
  }
}

测试结果:

相关文章
|
SQL Java 数据库连接
MyBatis 优秀的持久层框架(一)
MyBatis 优秀的持久层框架
64 0
|
30天前
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
20 1
|
30天前
|
Java 关系型数据库 数据库连接
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
24 1
|
30天前
Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
15 1
|
30天前
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
21 1
|
30天前
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
22 2
|
30天前
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
15 1
|
21小时前
|
SQL Java 关系型数据库
mybatis-plus启动时自动执行sql脚本
mybatis-plus启动时自动执行sql脚本
5 1
|
11天前
|
SQL Java 数据库连接
什么是MyBatis持久层框架?
MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs (Plain Old Java Objects, 普通的 Java 对象) 映射成数据库中的记录。
22 5
|
26天前
|
SQL XML Java
这样使用MyBatis框架,被攻击了
这样使用MyBatis框架,被攻击了
11 0