MyBatis教程大全


 MyBatis SQL 映射

     MyBatis select 标签

     MyBatis 多数据库支持

     MyBatis selectKey 标签作用

     MyBatis @SelectKey注解用法介绍

     MyBatis @SelectKey注解用法详细介绍

     MyBatis keyProperty 属性介绍

     MyBatis insert、update 和 delete 元素

     MyBatis sql 元素

 MyBatis SQL 参数映射

     MyBatis SQL 参数映射

 MyBatis 动态SQL

     MyBatis 动态SQL与数据准备

     MyBatis if 标签

     MyBatis if else 用法

     MyBatis choose、when、otherwise 标签

     MyBatis where 标签

     MyBatis set 标签

     MyBatis foreach 标签

     MyBatis bind 标签

     MyBatis trim 标签

 MyBatis SQL 结果映射

 MyBatis SQL 结果之关系映射

 MyBatis 使用介绍

     MyBatis typeAliases 类型别名

     MyBatis typeHandlers 类型处理器

     MyBatis Transaction 事务接口

     MyBatis transactionManager 事务管理

     SqlSessionFactory 介绍

     MyBatis 核心对象 SqlSession

     MyBatis 初始化 创建 Session 实例

     MyBatis ObjectFactory 对象工厂

     MyBatis缓存机制:一级缓存和二级缓存

     MyBatis 常用注解

 MyBatis 配置文件

     MyBatis 配置文件

 MyBatis 映射

     MyBatis 映射简介

     MyBatis ResultMap 映射

     MyBatis 自动映射

     MyBatis 高级映射

     MyBatis 集合映射

     MyBatis 关联映射

     MyBatis 一对一关联映射

     MyBatis 一对多关联映射

     MyBatis 多对多关联映射

     MyBatis 一对一(注解形式)

     MyBatis 一对多(注解形式)

     MyBatis 多对多(注解形式)

     MyBatis resultMap 元素

 MyBatis 面试题库

     #{}和${}的区别是什么?

     数据库链接中断如何处理?

     数据库插入重复如何处理?

     事务执行过程中宕机的应对处理方式

     Java客户端中的一个Connection问题

MyBatis choose、when、otherwise 标签

MyBatis choose、when、otherwise 标签

有些时候,我们不想使用所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis提供了choose标签,它有点像Java中的switch语句。

还是上面的例子,但是这次变为:如果客户端提供了 id 就按 id 查找,提供了 loginname 和 password 就按 loginnam 和password 查找,若两者都没有提供,就返回所有sex = '男'的 Employee。

<select id="selectEmployeeChoose" parameterType="hashmap" resultType="my.mybatis.domain.Employee">
SELECT * FROM tb employee WHERE state = 'ACTIVE'
<!--- 如果传入了id,就根据id查询,没有传入id就根据loginname和password查询,否则查询sex等于男的数据-->
    <choose>
      <when test="id != null">
        and id= #{id}
      </when>
      <when test="loginname != null and password != null">
        and loginname = #{loginname} and password = #{password}
      </when>
      <otherwise>
        and sex = '男'
      </otherwise>
    </choose>
</select>
List<Employee> selectEmployeeChoose(HashMap<String,Object> params);

public void testSelectEployeeChoose(SqlSession session)
{
    EmployeeMapper em = session.getMapper(EmployeeMapper.class);
    HashMap<String, Object> params = new HashMap<String, object>();
    // 设置id属性
    params.put("id", 1);
    params.put("loginnamc", "jack");
    params.put("password", "123456");
    List<employee> list = em.selectEmployeechoose(params);
    list.forEach(employee -> Systen.out.printIn(employee));
}

运行main 方法,尝试selectEmployeeChoose()方法,控制台显示如下:

DEBUG [main]==> Preparing: STTR.CT FROM tb_employee WHERE state = 'ACTIVE' and loginname = ? and password = ?
DEBUG [main]==> Parameters: jack(String),123456(String)

DEBUG [main]==> Total :1
[Employee [id=1,loginname=jack,passwiord=123456,name=马云,sex=男,age=26,phone=13902019999,sal=9800.0,state=ACTIVE] ]

可以看到,HashMap里面传递的参数包括了id、loginname和password,执行的sql语句中因为使用了choose标签,所以sql语句执行的是按照id查询,查询返回的Emplyee对象就是id为1的对象。

接下来注释以下代码:

// params.put("id",1) ;

再次执行main方法,控制台显示如下:

DEBUG [main]==> Prcparing: SEIECT * FROM tb_employee WHERE state = 'ACTIVE' and login name= ? and password = ?
DEBUG [main]==> Parameters: jack(String) ,123456(String)
DEBUG [main]<== Total :1
Employee [id=1,loginname=jack,passwiord=123456,name=马云,sex=男,age=26,phone=13902019999,sal=9800.0,state=ACTIVE]

可以看到,HashMap里面传递的参数只包括loginname和password,所以sql语句是按照loginname和password查找,查询返回的Emplyee对象就是loginname,即jack,并且password是123456的对象。

接下来注释以下代码:

// params.put("id",1);
// params.put("loginname","jack");
// params.put("password","123456");

再次执行main 方法,控制台显示如下:

DEBUG [main]==> Preparing: SELECT * FROM tb_employee WHERE state = 'ACTIVE' and sex = '男'
DEBUG [main]==> Parameters:
DEBUG [main]==> Total :2
Employee [id=l,name= 杰克,sex=男,age=26,password=123456,loginname=jack,phone=13902019999,sal=9800.0,state=ACTIVE]
Employee [id=3,name=汤姆,sex=男,age=25,loginname=tom,password=123456,phone=13902017777,sal=8800.0,state=ACTIVE]

可以看到,由于没有传递任何参数,故sql语句执行的是<otherwise>元素里面的查询条"sex='男'"的对象。