Mybatis框架的基本原理
多表关联查询:表中存在一对多,多对一的现象
关联集合
association标签在装配一个对象时使用,其中column属性指将哪个当前表哪个列的值作为参数传入sql语句中,
property属性指对象在类中的属性名,
select属性指通过哪个查询语句查询出该对象信息
id与result,id用于设置主键的映射关系(这里也包括外联表的主键),而result则用于设置非主键的映射关系
collection中,用于设置外联表的映射,使用ofType来设置外联表的Bean类,而原本表的bean类由resultMap中的Type属性确定
2。多表查询
<select resultMap="resultMap标签的id值" ...></select>
<resultMap type="结果集映射的实体类" id="">
<!--主键值-->
<id column="查询出的结果中的列名" property="实体类的属性名"/>
<!--普通字段-->
<result column="查询出的结果中的列名" property="实体类的属性名"/>
</resultMap>
多对一(一对一):
resultMap标签中:
使用<association property="属性名" javaType="属性的实体类型">进行关联对象映射
在association标签中,使用id resul标签 映射出关联的对象的属性
一对多
resultMap标签中:
使用<collection property="实体类集合的属性名" ofType="集合中元素的类型">进行关联对象映射
在association标签中,使用id resul标签 映射出关联的对象的集合
在JavaBean中:
实体类Dept
package com.hadwinling.entity;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dept {
private int deptno;
private String dname;
private String loc;
//一对多查询
private List<Emp> emps;
}
实体类Emp
package com.hadwinling.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
private int empno;
private String ename;
private String job;
private double sal;
private int deptno;
//多对一(一对一) 查询
private Dept dept;
}
对应的Mapper文件
Dept的Mapper文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hadwinling.dao.DeptDao">
<!-- 一对多查询:查询所有部门及部门关联的所有员工 -->
<select id="findAllDept" resultMap="deptMap">
select d.*,e.empno,e.ename,e.job,e.sal,e.deptno did
from dept d left join emp e
on d.deptno=e.deptno
</select>
<resultMap type="Dept" id="deptMap">
<id column="deptno" property="deptno"/>
<result column="dname" property="dname"/>
<result column="loc" property="loc"/>
<!-- 关联集合
association标签在装配一个对象时使用,
其中column属性指将哪个当前表哪个列的值作为参数传入sql语句中,
property属性指对象在类中的属性名,
select属性指通过哪个查询语句查询出该对象信息
id与result,id用于设置主键的映射关系(这里也包括外联表的主键),
而result则用于设置非主键的映射关系
collection中,用于设置外联表的映射,使用ofType来设置外联表的Bean类,
而原本表的bean类由resultMap中的Type属性确定
-->
<collection property="emps" ofType="Emp">
<id column="empno" property="empno"/>
<result column="ename" property="ename"/>
<result column="job" property="job"/>
<result column="sal" property="sal"/>
<result column="did" property="deptno"/>
</collection>
</resultMap>
</mapper>
Emp对应的Mapper文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper映射文件 -->
<!-- DAO的具体sql
namespace:命名空间,sql语句进行模块管理
实现mybatis的动态代理配置
namespace="DAO的全路径"
sql的id值为DAO接口中的方法名
-->
<mapper namespace="com.hadwinling.dao.EmpDao">
<select id="findAllEmps" resultMap="empMap">
select e.empno eid,e.ename,e.job,e.sal,e.deptno,d.dname,d.loc from emp e,dept d
where e.deptno=d.deptno;
</select>
<resultMap type="Emp" id="empMap">
<!-- 结果集映射 -->
<!-- 如果查询结果的列名与实体类的属性名不一致,也可以使用resultMap映射 指明列名和属性名 -->
<id column="eid" property="empno"/>
<result column="ename" property="ename"/>
<result column="job" property="job"/>
<result column="sal" property="sal"/>
<result column="deptno" property="deptno"/>
<!-- 多对一 或者 一对一 -->
<association property="dept" javaType="Dept">
<id column="deptno" property="deptno"/>
<result column="dname" property="dname"/>
<result column="loc" property="loc"/>
</association>
</resultMap>
</mapper>
Mybatis的核心文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置properties文件,配置数据库数据源 使用${}读取配置信息 -->
<properties resource="db.properties"></properties>
<!-- 起别名 -->
<typeAliases>
<!-- 给 "com.hadwinling.entity.Admin"起别名为Admin -->
<!-- <typeAlias type="com.hadwinling.entity.Admin" alias="Admin" /> -->
<!-- 整个包起别名 name="包名" 包中所有的类的别名就是类名 -->
<package name="com.hadwinling.entity" />
</typeAliases>
<!-- 配置mybatis运行环境 -->
<environments default="default">
<environment id="default">
<transactionManager type="JDBC" />
<!--设置数据库连接池 -->
<dataSource type="POOLED">
<!-- 数据源 -->
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</dataSource>
</environment>
</environments>
<!-- 配置mapper映射文件 -->
<mappers>
<mapper resource="sqlmap/adminMapper.xml" />
<mapper resource="sqlmap/deptMapper.xml" />
<mapper resource="sqlmap/empMapper.xml" />
<mapper resource="sqlmap/studentMapper.xml" />
</mappers>
</configuration>
在mybatis核心文件中要把dept和emp的mapper映射文件加入