1.返回一个对象
public interface EmployeeMapper { public Employee getEmpByMap(Mapmap);}
对应的EmployeeMapper.xml
语句
返回值为该对象的类型
2.返回一个集合
public ListgetEmpsByLastNameLike(String lastName);
对应的xml
语句
返回值为集合中元素的类型
3.返回一个map集合
//返回一条记录的map;key就是列名,值就是对应的值 public MapgetEmpByIdReturnMap(Integer id);
对应的xml
语句
这里查找到tbl_employee
中的一条记录,可以直接返回一个Employee
对象,也可以直接返回一个map集合
此时map
中的键就是列名,如id
、last_name
,值则就是该行记录中对应的值。
4.返回一个定制的map
//多条记录封装一个map:Map:键是这条记录的主键,值是记录封装后的javaBean //@MapKey:告诉mybatis封装这个map的时候使用哪个属性作为map的key @MapKey("lastName") public Map getEmpByLastNameLikeReturnMap(String lastName);
对应的xml
语句
该sql查找到多条记录,其实也就对应着多个Employee,那如何封装成一个map集合,使其值为Employee,键为我们定制的值呢?
可以在查询语句中加上@MapKey("lastName")
,当然你也可以替换成主键id
以上这些其实都是resultType的用法
思考:表中的 一条记录通过restultType=“Employee”将结果与javaBean
自动对应了起来,达到了自动映射的效果
当自动映射查询结果时,MyBatis 会获取结果中返回的列名并在 Java 类中查找相同名字的属性(忽略大小写)。 这意味着如果发现了 ID 列和 id 属性,MyBatis 会将列 ID 的值赋给 id 属性。
通常数据库列使用大写字母组成的单词命名,单词间用下划线分隔;而 Java 属性一般遵循驼峰命名法约定。为了在这两种命名方式之间启用自动映射,需要将 mapUnderscoreToCamelCase
设置为 true。
那如果返回的数据与javaBean不一致呢,比如我们关联查询了多张表,返回了各表中的部分字段,难道我们要往javaBean
添加一些属性么?
那这里或许resultMap
就能派上用场了,这是一种手动映射。
现在我们来看resultMap
自定义结果集映射规则
// mapper接口与mapper.xml进行绑定public interface EmployeeMapperPlus { public Employee getEmpById(Integer id); public Employee getEmpAndDept(Integer id); public Employee getEmpByIdStep(Integer id); public ListgetEmpsByDeptId(Integer deptId);}
以下为其基本用法:
场景一:
查询Employee的同时查询员工对应的部门 Employee===Department 一个员工有与之对应的部门信息;属性: id last_name gender d_id did dept_name (private Department dept;)
public class Employee { private Integer id; private String lastName; private String email; private String gender; private Department dept; //一个部门属性}
public class Department { private Integer id; private String departmentName; private Listemps;}
以下是sql
那如何封装resultMap
?
可见resultMap
支持:级联封装
还可以这么封装