1、自定义某个 javabean 的封装规则:
注:可以看到,select 标签中引用了定义好的 resultMap 的值。resultMap 标签中的 type 为javabean 类型,id 为唯一标识。id 子标签定义主键(这样定义底层会有优化。)column 属性为字段名,property 属性为字段值。
注:可以看到测试结果没有出现问题,说明代码没有错误。
2、自定义某个 javabean 的级联属性封装:
a、准备工作:mysql 数据库中,在之前 tbl_employees 表的基础上(之前博文的例子),创建一个 tbl_depts 表,并在 tbl_employees 表中添加一个 d_id 字段,并建立与 tbl_depts 表的外键关联。(并在 SQLyog 软件的 sql 脚本编译器中测试 sql 语句)并且在 Employee 类中添加 Department 属性以及对应的 set/get 方法。
b、在接口中编写方法,传入参数 id。并且在 sql 映射文件中编写 resultMap 和 select 标签。(可以看到,property="dept.id",说明 mybatis 支持级联查询)
c、使用 resultMap 标签的 association 标签进行定义(需要指定 javabean 类型),也可以得到同样的效果。
3、使用 association 进行分步查询功能:
a、准备工作:添加一个 DepartmentMapper 接口 (接口中定义 getDeptById 方法)和 一个 DepartmentMapper.xml 映射文件。(映射文件中定义 select 标签,与接口方法进行映射)
b、在 EmployeeMapperPlus 接口中添加 getEmpByStep 方法,并且在 EmployeeMapper.xml 文件中添加 select 标签。(select 标签中有一个 association 子标签,标签中定义属性 select,以及 column(需要传入的字段))
注:分步查询的延迟加载的设置,在全局配置文件中(即 mybatis-config.xml 文件)设置两个属性。(settings 标签中)
4、collection 定义关联对象封装规则:
a、在 Departmnet 类中添加元素为 Employee 的 List 属性,并且在 DepartmentMapper 接口中添加一个 getDeptByIdPlus 方法。
b、下图可以看到,在 DepartmentMapper.xml sql 映射文件中添加 select 标签,标签中的 sql 使用左外连接使 tbl_employees 和 tbl_depts 两张表关联起来。并且在 resultMap 标签中使用 collection 标签来封装集合属性。(ofType 表示集合中的元素类型)
c、下图所示,测试结果没有问题,显示出预计的结果
5、使用 collection 标签进行分步查询功能:
a、在 EmployeeMapperPlus 接口中添加 getEmpByDeptId 方法,并且在 EmployeeMapperPlus.xml sql 映射文件中添加 select 标签取出符合条件的记录。
b、在 DepartmentMapper 接口中添加一个 getDeptById 接口,后在 DepartmentMapper.xml sql 映射文件中添加一个 collection 标签,标签中添加 select 属性,与 EmployeeMapperPlus.getEmpByDeptId 相关联,column="id",表示传入参数 id。
c、测试输出结果,结果没有问题。
注:使用 column 进行多列的值传递
多列的值传递可以封装 map 传递 ---> column="{key1=column1, key2=column2}",如下图:
附:鉴别器的使用
mybatis 可以使用 discriminator 判断某列的值,然后根据某列的值改变封装行为。如下图所示:
a、使用鉴别器,将 gender=1 的结果进行不同的封装。(当属性 gender 值为0时,级联查询出部门信息;当属性 gender 值为1时,属性 email 的值为列 last_name 值 )
b、可以看到,查询 btl_employees 表,gender 值为0,级联查询出结果;查询 btl_employees 表,gender 值为1,将 属性值 email 修改成了 last_name 后,封装结果。
本文出自 “12392717” 博客,请务必保留此出处http://12402717.blog.51cto.com/12392717/1931980