1、关联查询-联级属性封装结果
如果在Employee类中添加一个Department属性。mybatis要怎么传参和查询数据
示例:
a.首先在创建tbl_dept表b.在tbl_employee表中添加列,并将tbl_dept表的id设为外键
c、创建部门表的javabean,并在Employee类中添加Department属性
d.在接口EmployeeMapperPlus中编写联合查询的方法
e.在EmployeeMapperPlus映射文件中绑定接口方法和编写sql语句
注意:
联机查询中tbl_dept表中的属性,我们使用级联属性进行封装,即dept.id
f.编写测试代码
2、使用association定义单个对象的封装规则
我们也可以使用association标签代替联级属性封装
注意:
association可以指定联合的javaBean对象
property=“dept”:指定哪个属性是联合的对象
javaType:指定这个属性对象的类型[不能省略]
3、使用association进行分步查询
在使用association定义单个对象的封装时sql语句十分繁琐,所以我们可以使用分步查询
select * from tbl_employee where id = #{id}
select * from tbl_dept where id=#{id}
实例:
a.创建DepartmentMapper接口中根据id返回Department对象,然后在DepartmentMapper映射文件中绑定接口方法和编写sql语句
b.在EmployeeMapperPlus接口中创建一个简单的按id查询员工信息
c.在EmployeeMapperPlus映射文件中绑定接口方法和编写sql语句
注意:
association定义关联对象的封装规则
1、property:employee类中需要额外封装的属性
2、select:表明当前属性是调用了select指定的方法查出的结果
3、column:指定将哪一列的值传给这个方法
4、分步查询的延迟加载
有时候我们只想要查询员工表的信息,不需要查询部门表,使用了分步查询两张表的信息都会打印出来。我们可以在mybatis-config文件中添加lazyLoadingEnabled和aggressiveLazyloading标签来配置。
测试:当使用分布查询,在测试类中只打印Employee的lastName属性
最终只会执行一条sql语句,不会执行select * from tbl_dept where id=#{id}
5、collection标签定义关联结合类型的属性的封装规则
一个部门有多个员工,我们把多个员工用一个集合封装。在mybatis中该如何实现对集合的查询和封装
示例:
a.在Department类中添加Employee类型的集合属性,然后在DepartmentMapper接口中定义放回部门信息的方法
b.在DepartmentMapper映射文件中,绑定接口方法和编写sql语句
c.查询出关联表的各个字段
d.在resultMap标签中将查询出的sql字段和javabean属性名进行映射,并使用collection标签封装Employee对象
注意:
1.property:Department类中的需要封装的集合属性
2.ofType:指定集合属性的类型
e.编写测试类
6、使用collection标签进行分步查询
由于上个例子的代码过于繁琐,所以我们可以使用分步查询
select * from tbl_department where id=1;
select * from tbl_employee where d_id=1;
示例:
a.在DepartmentMapper接口编写select * from tbl_department where id=1;的方法,并绑定到DepartmentMapper映射文件中。
b.在EmployeeMapper接口编写select * from tbl_employee where d_id=1;的方法,并绑定到EmployeeMapper映射文件中。
7、discriminator鉴别器的使用
鉴别器:mybatis可以使用discriminate判断某列的值,然后根据某列的值改变封装行为
案例:
封装Employee
如果查出的是女生,就把部门信息查询出来,否则不查询
如果查出的是男生,就把last_name这一列的值赋给email
a.先创建一个resultMap
b.在resultMap中添加discriminator标签
c.编写测试