MyBatis resultMap id标签的错误使用方式
目录
- MyBatis resultMap id标签的错误使用
- 本节的问题主要是我对mybatis id标签的错误使用
- resultMap标签的使用规则
- 自定义结果映射规则
- association联合查询
- 使用association进行分布查询
- collection分步查询
MyBatis resultMap id标签的错误使用
我们在编写VO对象,如果业务场景稍微复杂一点,就会用到集合属性。例如用户查看个人订单列表,每个订单又包含多种或者多个规格的商品。
本节的问题主要是我对mybatis id标签的错误使用
id是resultMap以及Collection的子标签,标记出作为 ID 的结果可以帮助提高整体性能。特别注意的是,id是当前命名空间中的一个唯一标识,用于标识一个结果映射。
如下图,itemId(商品id)字段值在数据库中不唯一,错误使用会导致只返回该订单某商品的一条记录。因为对于某个商品,麻辣味和五香味只是商品规格,其商品id是相同的。
改用普通result标签后,返回正确结果。
EOF
resultMap标签的使用规则
自定义结果映射规则
<!-- resultMap自定义某个javabean的封装规则 type:自定义规则的java类型 id:唯一id方便引用 --> <resultMap type="entity.Employee" id="getEmpByIdMap"> <!-- id指定主键列的封装规则 column:指定哪一列 property:指定对应的javabean属性 --> <id column="id" property="id"/> <!-- result定义普通列封装规则,若属性名与数据库对应表的列名相同可不写, mybatis会自动封装,但建议将所有的映射规则都写上 --> <result column="name" property="name"/> <result column="sex" property="sex"/> <result column="email" property="email"/> </resultMap> <!-- public Employee getEmpById(Integer id) --> <select id="getEmpById" resultMap="getEmpByIdMap"> select * from employee where id=#{id} </select>
association联合查询
association
可以指定联合的javabean对象property="dept"
:指定哪个属性是联合对象javaType
:指定这个属性的类型
<resultMap type="entity.Employee" id="getEmpAndDeptMap"> <id column="id" property="id"/> <result column="empName" property="name"/> <result column="sex" property="sex"/> <result column="email" property="email"/> <!-- association可以指定联合的javabean对象 property="dept":指定哪个属性是联合对象 javaType:指定这个属性的类型--> <association property="dept" javaType="entity.Department"> <id column="did" property="id"/> <result column="deptName" property="departmentName"/> </association> </resultMap> <!-- public Employee getEmpAndDept(Integer id) --> <select id="getEmpAndDept" resultMap="getEmpAndDeptMap"> select e.id id,e.name empName,e.email email,e.sex sex,e.d_id d_id, d.id did,d.name deptName from employee e,dept d where e.d_id=d.id and e.id=#{id} </select>
使用association进行分布查询
1、先按照员工id查询员工信息将会调用查询员工的sql
2、根据查询员工信息中的d_id值去部门表中查出部门信息
3、部门设置到员工中
<resultMap type="entity.Employee" id="getEmpAndDeptStepMap"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="sex" property="sex"/> <result column="email" property="email"/> <!-- association定义关联对象的封装规则 select:表明当前属性是调用select指定的方法查出的结果 column:指定将那一列的值作为参数传给这个方法 流程:使用select指定的方法(传入column指定的这列参数的值)查出对象, 并封装给property指定的属性 --> <!-- discriminator鉴别器 column:指定判定的列名 javaType:列值对应的java类型 --> <discriminator javaType="string" column="sex"> <!-- resultType不能缺少 --> <case value="男" resultType="entity.Employee"> <association property="dept" select="dao.DepartmentMapper.getDeptById" column="d_id"> </association> </case> </discriminator> </resultMap> <!-- public Employee getEmpByIdStep(Integer id) --> <select id="getEmpByIdStep" resultMap="getEmpAndDeptStepMap"> select * from employee where id=#{id} </select>
嵌套结果集的方式,使用collection标签定义关联的集合类型的属性封装规则
<resultMap type="entity.Department" id="getDeptByIdPlusMap"> <id column="did" property="id"/> <result column="deptName" property="departmentName"/> <!-- collection定义关联集合类型的属性的封装规则 ofType:指定集合里面元素的类型 --> <collection property="emps" ofType="entity.Employee"> <!-- 定义这个集合中元素的封装规则 --> <id column="eid" property="id"/> <result column="empName" property="name"/> <result column="sex" property="sex"/> <result column="email" property="email"/> </collection> </resultMap> <!-- public Department getDeptByIdPlus(Integer id) --> <select id="getDeptByIdPlus" resultMap="getDeptByIdPlusMap"> select d.id did,d.name deptName,e.id eid, e.name empName,e.sex,e.email from dept d left join employee e on d.id=e.d_id where d.id=#{id} </select>
collection分步查询
<resultMap type="entity.Department" id="getDeptByIdStepMap"> <id column="id" property="id"/> <result column="name" property="departmentName"/> <collection property="emps" select="dao.EmployeeMapperPlus.getEmpsByDeptId" column="{id}"> <!-- 或则 column="{deptId=id}"--> </collection> </resultMap> <!-- public List<Employee> getEmpsByDeptId(Integer deptId --> <select id="getEmpsByDeptId" resultType="entity.Employee"> select * from employee where d_id=#{deptId} </select> <!-- public Department getDeptByIdStep(Integer id) --> <select id="getDeptByIdStep" resultMap="getDeptByIdStepMap"> select * from dept where id=#{id} </select>
当分布查询需要传递多个多个值时,将多个值封装map传递
colum=“{key1=column1,key2=colum2...}”
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
赞 (0)