resultMap 中的标签和属性
如果是主键列 一般用id标签对应 propertyjava对象的属性 column 数据库中的列( javaType实体类数据类型 jdbcType数据库列的数据类型 ) 不需要配置 <id property="empno" column="empno" />如果是普通列 一般用result对应 propertyjava对象的属性 column 数据库中的列
<result property="ename" column="ename" />
高级映射 (映射数据与对象的对应关系) 如果列不指定 不能自动对应
通常搭配继承一起使用 体现基础字段的对应
association 对应某个实体对象
Emp对象中 有部门信息 在java中 包含一个Dept对象
package com.javasm.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;
import java.io.Serializable;/*** (Emp)实体类** @author makejava* @since 2024-11-26 09:40:43*/@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp implements Serializable {private static final long serialVersionUID = -16018027389934188L;private Integer empno;private String ename;private String job;private Integer mgr;private String hiredate;private Double sal;private Double comm;//关联部门信息private Dept dept;// private Integer deptno;
//
//
// private String dname;
//
// private String loc;}
映射文件配置
<resultMap id="EmpMapBasMap" type="com.javasm.entity.Emp" >
<!-- 主键列用id -->
<!-- 实体类属性名 数据库列 ( javaType实体类数据类型 jdbcType数据库列的数据类型 ) 不需要配置 --><id property="empno" column="empno" />
<!-- 其他列用result --><result property="ename" column="ename" /><result property="job" column="job" /><result property="mgr" column="mgr" /><result property="hiredate" column="hiredate" /><result property="sal" column="sal" /><result property="comm" column="comm" /></resultMap><resultMap id="EmpMapWithDept" extends="EmpMapBasMap" type="com.javasm.entity.Emp" ><!-- 实体类属性名 数据库列 --><!-- 高级映射(对象映射标签) 需要手动指定所有字段association 解析resultSet数据时 可以创建多个对象collection配置关联的对象 --><association property="dept" javaType="com.javasm.entity.Dept"><id property="deptno" column="deptno" /><result property="dname" column="dname" /><result property="loc" column="loc" /></association></resultMap>
通过sql语句 把需要的数据查询出来
select * from emp e,dept d where e.deptno = d.deptno
collection 对应集合
每个Dept中都有多个Emp List<Emp>
每个部门有多个员工 部门对象中 包含Emp的集合
package com.javasm.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.List;@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dept {private Integer deptno;private String dname;private String loc;//多方的数据集合private List<Emp> emps;}
映射配置
<!-- 基础字段映射 --><resultMap id="DeptBasMap" type="com.javasm.entity.Dept" ><id property="deptno" column="deptno" /><result property="dname" column="dname" /><result property="loc" column="loc" /></resultMap><resultMap id="DeptWithEmps" extends="DeptBasMap" type="com.javasm.entity.Dept">
<!-- 聚合 对应集合对象 --><collection property="emps" ofType="com.javasm.entity.Emp"><id property="empno" column="empno" /><result property="ename" column="ename" /><result property="job" column="job" /><result property="mgr" column="mgr" /><result property="hiredate" column="hiredate" /><result property="sal" column="sal" /><result property="comm" column="comm" /></collection></resultMap>
sql语句
select * from dept d left join emp e on d.deptno = e.deptno
order by d.deptno
2数据库关联查询
表有数据关联时 需要做关联查询
-- 连表查询
-- 简化语法 使用内连接
select * from emp e,dept d where e.deptno = d.deptno
-- 标准sql语法 内连接
select * from emp e INNER JOIN dept d on e.deptno = d.deptno
-- 外连接 left right 哪一方显示全集
select d.*,e.* from emp e right join dept d on e.deptno = d.deptno
order by d.deptnoselect * from dept d left join emp e on d.deptno = e.deptno
order by d.deptno
-- 如果是内连接 连表顺序无影响-- 如果做外联 连表顺序 有影响
多表关联时 全集方向保持一致
3.数据库对应关系 java对象对应关系
一对一情况下
java中 双方对象 都包含对方的对象 mybatis中使用 association 配置结果
一对多情况下
多方 包含一方的集合 collection配置
dept ----> list<emp>
class(班级) -----> list<student>
一方 关联多方的对象 association配置
emp -----> dept
student ---> class(班级)
多对多情况下
双方都是对方的集合 collection配置
order ----> list<productInfo>
productInfo -->list<Order>
总结:
java中 对象之间的关系
对象中包含某个其他对象 association
对象中包含集合其他对象 collection
4自连接
自连接 需要起别名 通过别名 让mybatis识别哪些是内层 哪些是外层
高级映射标签 association collection 可以多次 和嵌套使用
查省市对应关系数据
select ta2.*,ta1.code AS subcode ,ta1.name AS subname ,ta1.pcode AS subpcode from tb_area ta1 inner join tb_area ta2 on ta1.pcode = ta2.code
where ta2.pcode = 0
映射文件
<resultMap id="TbAreaMap" type="com.javasm.entity.TbArea" ><id property="code" column="code" jdbcType="INTEGER"/><result property="name" column="name" jdbcType="VARCHAR"/><result property="pcode" column="pcode" jdbcType="INTEGER"/><collection property="subArea" ofType="com.javasm.entity.TbArea"><id property="code" column="subcode" jdbcType="INTEGER"/><result property="name" column="subname" jdbcType="VARCHAR"/><result property="pcode" column="subpcode" jdbcType="INTEGER"/></collection></resultMap>
查省市县对应关系数据
select ta3.*,ta2.code AS citycode ,ta2.name AS cityname ,ta2.pcode AS citypcode ,ta1.code AS areacode ,ta1.name AS areaname ,ta1.pcode AS areapcode from tb_area ta1 inner join tb_area ta2 on ta1.pcode = ta2.codeinner join tb_area ta3 on ta2.pcode = ta3.code
映射文件
<resultMap id="TbAreaMap2" type="com.javasm.entity.TbArea" ><id property="code" column="code" jdbcType="INTEGER"/><result property="name" column="name" jdbcType="VARCHAR"/><result property="pcode" column="pcode" jdbcType="INTEGER"/><collection property="subArea" ofType="com.javasm.entity.TbArea"><id property="code" column="citycode" jdbcType="INTEGER"/><result property="name" column="cityname" jdbcType="VARCHAR"/><result property="pcode" column="citypcode" jdbcType="INTEGER"/><collection property="subArea" ofType="com.javasm.entity.TbArea"><id property="code" column="areacode" jdbcType="INTEGER"/><result property="name" column="areaname" jdbcType="VARCHAR"/><result property="pcode" column="areapcode" jdbcType="INTEGER"/></collection></collection></resultMap>