标签解释:
(resultMap的子标签)
<association property="di" column="deptno" javaType="manytoone.bean.DeptInfo"> (Java中原名 外键 Java类型)
内部为各个列和对应的Java属性
<association property="di" column="deptno" javaType="manytoone.bean.DeptInfo">
<id property="deptNo" column="deptno"/>
<result property="dname" column="dname"/>
<result property="loc" column="loc"/>
</association>
延迟加载:Lazy
使用时加载,不使用时不加载。
(resultMap的子标签)
<collection property="empSet" column="deptno" ofType="onetomany.bean.EmpInfo">属性 外键 泛型
<collection property="empSet" column="deptno" ofType="onetomany.bean.EmpInfo">
<id property="empNo" column="empno"/>
<result property="ename" column="ename"></result>
<result property="job" column="job"></result>
<result property="mgr" column="mgr"></result>
<result property="hireDate" column="hireDate"></result>
<result property="sal" column="sal"></result>
<result property="comm" column="comm"></result>
</collection>
以一个员工表和职务表为例:
一对多的情况:
bean包:
package onetomany.bean;
public class EmpInfo {
private Integer empNo; //id
private String ename; //名称
private String job; //职位
private Integer mgr;
private String hireDate;
private Double sal;
private Double comm;
private Integer deptNo;
……get,set,toString方法……
}
package onetomany.bean;
import java.util.HashSet;
import java.util.Set;
public class DeptInfo {
private Integer deptNo;
private String dname;
private String loc;
// 一对多关系
private Set<EmpInfo> empSet = new HashSet<>();
……get,set,toString方法……
}
mapper接口:
package onetomany.mapper;
import onetomany.bean.DeptInfo;
public interface DeptMapper {
DeptInfo findDeptByNo(int deptNo); //按部门查询
}
mapper.xml:
<?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="onetomany.mapper.DeptMapper">
<resultMap type="onetomany.bean.DeptInfo" id="dept1">
<id column="deptNo" property="deptNo" />
<result column="dname" property="dname"/>
<result column="loc" property="loc"/>
<collection property="empSet" column="deptno" ofType="onetomany.bean.EmpInfo">
<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>
<select id="findDeptByNo" resultMap="dept1">
SELECT * FROM dept d LEFT JOIN emp e ON d.`DEPTNO`=e.`deptno` WHERE d.deptno=#{deptNo}
</select>
</mapper>
biz包:
package onetomany.biz;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import onetomany.bean.DeptInfo;
import onetomany.mapper.DeptMapper;
public class DeptBiz {
private SqlSession session;
private DeptMapper dm;
public DeptBiz() {
InputStream in = DeptBiz.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
session = ssf.openSession();
dm = session.getMapper(DeptMapper.class);
}
public DeptInfo findDeptByNo(int deptNo) {
return dm.findDeptByNo(deptNo);
}
}
测试类:
package onetomany.biz;
import onetomany.bean.DeptInfo;
public class Test {
public static void main(String[] args) {
DeptInfo di = new DeptBiz().findDeptByNo(40);
System.out.println(di);
}
}
多对一的情况:
bean包:
package manytoone.bean;
public class DeptInfo {
private Integer deptNo;
private String dname;
private String loc;
……get,set,构造器,toString方法……
}
package manytoone.bean;
import manytoone.biz.EmpBiz;
public class EmpInfo {
private Integer empNo;
private String ename;
private String job;
private Integer mgr;
private String hireDate;
private Double sal;
private Double comm;
private Integer deptNo;
// 多对一操作
private DeptInfo di;
……get,set,方法……
}
mapper接口:
package manytoone.mapper;
import manytoone.bean.DeptInfo;
import manytoone.bean.EmpInfo;
public interface EmpMapper {
// 勤加载
EmpInfo findEmpByNo(int empNo);
// 懒加载
EmpInfo findEmpByNo2(int empNo);
DeptInfo findDeptByNo(int deptNo);
}
mapper.xml:
<?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="manytoone.mapper.EmpMapper">
<resultMap type="manytoone.bean.EmpInfo" id="emp1">
<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"/>
<association property="di" column="deptno" javaType="manytoone.bean.DeptInfo">
<id property="deptNo" column="deptno" />
<result property="dname" column="dname"/>
<result property="loc" column="loc"/>
</association>
</resultMap>
<select id="findEmpByNo" resultMap="emp1">
SELECT * FROM emp e ,dept d WHERE e.`deptno`=d.`DEPTNO` and empno=#{empNo}
</select>
<select id="findEmpByNo2" resultType="manytoone.bean.EmpInfo">
SELECT * FROM emp WHERE empno=#{empNo}
</select>
<select id="findDeptByNo" resultType="manytoone.bean.DeptInfo">
SELECT * FROM dept WHERE deptno=#{deptNo}
</select>
</mapper>
biz包:
package manytoone.biz;
import java.io.InputStream;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import manytoone.bean.DeptInfo;
import manytoone.bean.EmpInfo;
import manytoone.mapper.EmpMapper;
public class EmpBiz {
private SqlSession session;
private EmpMapper em;
public EmpBiz() {
InputStream in = EmpBiz.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
session = ssf.openSession();
em = session.getMapper(EmpMapper.class);
}
public EmpInfo findEmpByNo(int empNo) {
return em.findEmpByNo(empNo);
}
public EmpInfo findEmpByNo2(int empNo) {
EmpInfo ei = em.findEmpByNo2(empNo);
return ei;
}
public DeptInfo findDeptByNo(int deptNo) {
return em.findDeptByNo(deptNo);
}
}
测试类:
package manytoone.test;
import manytoone.bean.EmpInfo;
import manytoone.biz.EmpBiz;
public class Test {
EmpBiz eb = new EmpBiz();
public void a() {//勤加载
EmpInfo ei = eb.findEmpByNo(7782);
System.out.println(ei);
}
public void b() {//懒加载
EmpInfo ei = eb.findEmpByNo2(7782);
System.out.println(ei.getEname());
System.out.println(ei.getDi());
}
public static void main(String[] args) {
new Test().b();
}
}
多对多的情况:此情况员工 表和部门表不再适用,使用用户与权限的关系来描述:
方式一:
bean包:
package manytomany.one.bean;
import java.util.HashSet;
import java.util.Set;
public class Users1Info {//用户表
private Integer userId;
private String userName;
private String userPass;
private String userNickName;
private Set<UserPowerInfo> powerSet = new HashSet<>();
……构造器,get,set,toString方法……
}
package manytomany.one.bean;
import java.util.HashSet;
import java.util.Set;
public class Powers1Info {//权限表
private Integer powerId;
private String powerContent;
private Integer powerState;
private Set<UserPowerInfo> userSet = new HashSet<>();
……构造器,get,set,toString方法……
}
package manytomany.one.bean;
public class UserPowerInfo {//因为为多对多关系,故引入第三张表
private Integer rpId;
private Users1Info ui;
private Powers1Info pi;
……构造器,get,set,toString方法……
}
mapper接口:
package manytomany.one.mapper;
import manytomany.one.bean.Users1Info;
public interface Users1Mapper {
Users1Info findUsers1ById(int userId);
}
mapper.xml:
<?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="manytomany.one.mapper.Users1Mapper">
<resultMap type="manytomany.one.bean.Users1Info" id="ui1">
<id property="userId" column="userId"/>
<result property="userName" column="userName"/>
<result property="userPass" column="userPass"/>
<result property="userNickName" column="userNickName"/>
<collection property="powerSet" column="userid" ofType="manytomany.one.bean.UserPowerInfo">
<id property="rpId" column="rpId"/>
<association property="pi" column="powerid" javaType="manytomany.one.bean.Powers1Info">
<id property="powerId" column="powerId"/>
<result property="powerContent" column="powerContent"/>
<result property="powerState" column="powerState"/>
</association>
</collection>
</resultMap>
<select id="findUsers1ById" resultMap="ui1">
SELECT * FROM users u LEFT JOIN user_power up ON u.userid=up.userid INNER
JOIN powers p ON up.powerid=p.powerid WHERE u.userid=#{userId}
</select>
</mapper>
biz包与测试:
package manytomany.one.biz;
import java.io.InputStream;
import java.util.Set;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import manytomany.one.bean.UserPowerInfo;
import manytomany.one.bean.Users1Info;
import manytomany.one.mapper.Users1Mapper;
public class Users1Biz {
private SqlSession session;
private Users1Mapper um;
public Users1Biz() {
InputStream in = Users1Biz.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
session = ssf.openSession();
um = session.getMapper(Users1Mapper.class);
}
public Users1Info findUsers1ById(int userId) {
return um.findUsers1ById(userId);
}
public static void main(String[] args) {
Users1Info ui = new Users1Biz().findUsers1ById(3);
System.out.println(ui.getUserName()+"\t"+ui.getUserNickName());
Set<UserPowerInfo> set = ui.getPowerSet();
for (UserPowerInfo up : set) {
System.out.println("\t"+up.getPi().getPowerContent());
}
}
}
方式二:
bean包:
package manytomany.two.bean;
import java.util.HashSet;
import java.util.Set;
public class Users2Info {
private Integer userId;
private String userName;
private String userPass;
private String userNickName;
private Set<Powers2Info> powerSet = new HashSet<>();
……构造器,get,set,toString方法……
}
package manytomany.two.bean;
import java.util.HashSet;
import java.util.Set;
public class Powers2Info {
private Integer powerId;
private String powerContent;
private Integer powerState;
private Set<Users2Info> userSet = new HashSet<>();
……构造器,get,set,toString方法……
}
mapper接口:
package manytomany.two.mapper;
import manytomany.two.bean.Users2Info;
public interface Users2Mapper {
Users2Info find2UsersById(int userId);
}
mapper.xml:
<?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="manytomany.two.mapper.Users2Mapper">
<resultMap type="manytomany.two.bean.Users2Info" id="ui2">
<id property="userId" column="userId"/>
<result property="userName" column="userName"/>
<result property="userPass" column="userPass"/>
<result property="userNickName" column="userNickName"/>
<collection property="powerSet" column="powerid" ofType="manytomany.two.bean.Powers2Info">
<id property="powerId" column="powerId"/>
<result property="powerContent" column="powerContent"/>
<result property="powerState" column="powerState"/>
</collection>
</resultMap>
<select id="find2UsersById" resultMap="ui2">
SELECT * FROM users u LEFT JOIN user_power up ON u.userid=up.userid INNER
JOIN powers p ON up.powerid=p.powerid WHERE u.userid=#{userId}
</select>
</mapper>
biz包:
package manytomany.two.biz;
import java.io.InputStream;
import java.util.Set;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import manytomany.two.bean.Powers2Info;
import manytomany.two.bean.Users2Info;
import manytomany.two.mapper.Users2Mapper;
public class UserBiz {
private SqlSession session;
private Users2Mapper um;
public UserBiz() {
InputStream in = UserBiz.class.getClassLoader().getResourceAsStream("config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(in);
session = ssf.openSession();
um = session.getMapper(Users2Mapper.class);
}
public Users2Info find2UsersById(int userId) {
return um.find2UsersById(userId);
}
public static void main(String[] args) {
UserBiz ub = new UserBiz();
Users2Info ui = ub.find2UsersById(2);
System.out.println(ui.getUserNickName());
Set<Powers2Info> set = ui.getPowerSet();
for (Powers2Info pi : set) {
System.out.println("\t"+pi.getPowerContent());
}
}
}