单个参数mybatis不会做特殊处理,#{参数名}取出数值
多个参数mybatis会将其封装成一个map
Employee findByIdAndName(@Param("id") Integer id, @Param("lastname") String lastName);
//返回map key是属性名 value就是对应的值 进行封装
Employee findByIdAndName(Map<String,Object> map);
但有多个数据,同时经常使用,编写一个VO数据传输对象,例如 PageResultBean
如果是传递的是Collection(List,Set)类型或者是数组会进行特殊处理,封装在map当中。
key: Collection(collection),如果是List类型可以使用(list),数组类型使用(array)
value: list[0],array[0]….
为了不混乱可以使用@Param注解指定的key值
{list[0]} 获取
<select id="findAll" resultType="Employee" parameterType="integer">
select * from tbl_employee
select>
<select id="findByIdReturnMap" resultType="map">
select * from tbl_employee where id=#{id}
select>
<select id="findAllEmployeeReturnMap" resultType="map">
select * from tbl_employee
select>
List
// 指定employee的那个属性作为map的key 可选择其他字段
@MapKey("id")
Map<String,Employee> findAllReturnMap();
返回多条记录的map xml配置
<select id="findAllReturnMap" resultType="map">
select * from tbl_employee
select>
1.mybatis 结果集映射
2.resultMap 自定义结果映射规则,
type自定义规则的java类型, id唯一命名方便引用。
定义主键 将指定的主键映射为javaBean属性,底层进行优化,column指定哪一个字段,property指定对应的javaBean属性
定义普通列 column数据库字段,property为javaBean属性。
3.使用resultMap的映射配置
对于没有写入标签的属性与字段会自动封装,但是为了后期检查的方便写了resultMap标签就应当全部写入 。
<resultMap id="empMap" type="Employee">
<id column="id" property="id">id>
<result column="last_name" property="lastName">result>
<result column="gender" property="gender">result>
<result column="email" property="email">result>
resultMap>
<select id="getEmpById" resultMap="empMap">
select * from tbl_employee where id=#{id}
select>
4联合查询 级联属性封装结果集
<resultMap id="EmpAndDept" type="Employee">
<id column="eid" property="id">id>
<result column="last_name" property="lastName">result>
<result column="gender" property="gender">result>
<result column="email" property="email">result>
<result column="did" property="dept.id">result>
<result column="dept_name" property="dept.departmentName">result>
resultMap>
5.association属性 级联封装结果集
在多表联查时,association属性可以指定联名的javaBean对象 关联单个对象,property指定对象中需要联名的属性, javaType指定该字段的对象。
<resultMap id="EmpAndDept2" type="Employee">
<id column="eid" property="id">id>
<result column="last_name" property="lastName">result>
<result column="gender" property="gender">result>
<result column="email" property="email">result>
<association property="dept" javaType="com.pyc.pojo.Dept">
<id column="did" property="id">id>
<result column="dept_name" property="departmentName">result>
association>
resultMap>
6.association进行分段查询
说明:1.先按照员工id查询员工信息 2.根据查询员工的d_id值去查询dept信息 3.设置到employee中
association定义关联对象的封装规则
select 表明这个属性是调用select方法查询的结果
column 指定将哪一列的值穿给这个方法
流程 使用select指定mapper中的方法 (传入column指定的这列参数的值)查出对象,并封装给properties
association内部的id标签是指联名对象数据表的主键,倘若与resultMap的id相同,则为resultMap的id。
<resultMap id="EmpAndDeptByStep" type="employee">
<id column="id" property="id">id>
<result column="last_name" property="lastName">result>
<result column="gender" property="gender">result>
<result column="email" property="email">result>
<association property="dept" select="com.pyc.mapper.DepartmentMapper.getDeptById" column="did">
association>
resultMap>
<select id="getEmpAndDeptByIdStep" resultMap="EmpAndDeptByStep">
select * from tbl_employee where id=#{id}
select>
分段查询支持延迟加载。由于每次查询时都会将所有结果全部查询出来,但希望能够在需要的时候才查询以此节约数据库资源。只需要在分段查询的基础上添加配置。
lazyLoadingEnabled :延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置 fetchType 属性来覆盖该项的开关状态。
aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载。
<setting name="lazyLoadingEnabled" value="true">setting>
<setting name="aggressiveLazyLoading" value="false">setting>
1.定义关联集合类型的属性封装规则,property指定对象的集合属性名称,ofType指定集合内部元素类型,在其内部定义其余字段的规则:
<resultMap id="getDept" type="dept">
<id column="did" property="id">id>
<result column="dept_name" property="departmentName">result>
<collection property="emps" ofType="employee">
<id column="eid" property="id">id>
<result column="last_name" property="lastName">result>
<result column="gender" property="gender">result>
<result column="email" property="email">result>
collection>
resultMap>
<select id="getDeptByIdPlus" resultMap="getDept">
SELECT *,e.id eid
FROM tbl_dept d LEFT JOIN tbl_employee e
ON d.`id`=e.`did`
WHERE d.`id`=#{id}
select>
2.可以使用collection标签完成分段查询
使用column传递多值参数将多列值封装map {k1:v1,k2:v2}
例如 column=“{key1:column1,key2:column2}”
fetchType 可以设置加载情况 优先于全局的配置lazy eager
<resultMap id="getDeptByStep" type="dept">
<id column="id" property="id">id>
<result column="dept_name" property="departmentName">result>
<collection fetchType="lazy" property="emps" select="com.pyc.mapper.EmployeeMapper.getEmpsByDeptId" column="id">
<id column="id" property="id">id>
<result column="last_name" property="lastName">result>
<result column="gender" property="gender">result>
<result column="email" property="email">result>
collection>
resultMap>
通过此标签判断某列的值,然后根据某列的值改变封装行为。例如:若从数据库中查找的logName是Tom就筛选出用户信息,否则不筛选;如果是Jerry,就把orderMess列内容赋值为sum列内容。column确认要判断的列名,javaType确认列的java类型。
discriminator标签常用的2个属性讲解:
discriminator标签可以有1个或多个case标签,case标签包含以下3个属性:
用法类似于switch case
<discriminator column="enabled" javaType="int">
<case value="1" resultMap="rolePrivilegeListMapSelect"/>
<case value="0" resultMap="roleMapExtend"/>
discriminator>