mybatis 二 :数据库的外键实现(一对多,多对一,多对多)

标签解释:

(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());
		}
	}
}

猜你喜欢

转载自blog.csdn.net/zuo_h_dr/article/details/85963898