关联查询
在进行表设计时,往往需要在具体的业务基础上分析表与表之间的业务关系,再分析数据库级别表与表之间的业务关系。
一对一查询
员工表和部门表之间的关系分析:一个员工只能属于一个部门。
需求:查询出员工编号为7369的员工信息和部门信息。
sql语句:select * from t_emp JOIN t_dept on(t_emp.deptno=t_dept.deptno) where t_emp.empno=7369
resultType映射
看看mybatis中的写法
mapper.xmlselect * from t_emp JOIN t_dept on(t_emp.deptno=t_dept.deptno) where t_emp.empno=#{emp.empno}
扩展Emp类增加部门熟悉
public class EmpVo extends Emp{//增加dept表的属性
private Integer deptno; private String dname; private String loc;//....}
运行结果
==> Preparing: select * from t_emp JOIN t_dept on(t_emp.deptno=t_dept.deptno) where t_emp.empno=?
==> Parameters: 7369(Integer)<== Columns: empno, ename, job, mgr, hiredate, sal, comm, deptno, deptno, dname, loc<== Row: 7369, SMITH, CLERK, 7902, 1980-12-17, 800.00, null, 20, 20, RESEARCH, DALLAS<== Total: 1Closing non transactional SqlSession
[org.apache.ibatis.session.defaults.DefaultSqlSession@266e9dda]Emp{empno=7369, ename='SMITH', job='CLERK', mgr=7902, hiredate=Wed Dec 17 00:00:00 CST 1980, sal=800.0, comm=null, deptno=null}
从上面可以看出,如果输出映射的实体类中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
resultMap映射
除了用EmpVo类继承Emp类并且增加部门属性外,也可以在Emp类中增加Dept类型的对象来完成映射。mapper.xml中association 标签来映射关联对象。
public class Emp { private Integer empno; private String ename; private String job; private Integer mgr; private Date hiredate; private Float sal; private Float comm; private Integer deptno; private Dept dept;//....}
mybatis的写法
select * from t_emp JOIN t_dept on(t_emp.deptno=t_dept.deptno) where t_emp.empno=#{emp.empno}
运行结果
==> Preparing: select * from t_emp JOIN t_dept on(t_emp.deptno=t_dept.deptno) where t_emp.empno=?
==> Parameters: 7369(Integer)<== Columns: empno, ename, job, mgr, hiredate, sal, comm, deptno, deptno, dname, loc<== Row: 7369, SMITH, CLERK, 7902, 1980-12-17, 800.00, null, 20, 20, RESEARCH, DALLAS<== Total: 1Closing non transactional
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2a87ba34]Emp{empno=7369, ename='SMITH', job='CLERK', mgr=7902, hiredate=Wed Dec 17 00:00:00 CST 1980, sal=800.0, comm=null, deptno=20, dept=Dept{deptno=20, dname='RESE