/* 今天学习的是关联关系的部分内容 */
(一)一对一关系
这里我以住房和户主为例,在通常情况下(土豪和炒房团奏凯!),它们是一对一的关系。
我们先写两个持久类:House 与 Host
Host持久类:
package ouc;
public class Host {
private int mid;
private String name;
private House house;
public Host(){}
public Host(int mid,String name,House house){
super();
this.mid = mid;
this.name = name;
this.house = house;
}
public int getMid() {
return mid;
}
public String getName() {
return name;
}
public House getHouse() {
return house;
}
public void setHouse(House house) {
this.house = house;
}
public void setName(String name) {
this.name = name;
}
public void setMid(int mid) {
this.mid = mid;
}
@Override
public String toString() {
return "Host{" +
"mid=" + mid +
", name='" + name + '\'' +
", house=" + house +
'}';
}
}
House持久类:
package ouc;
public class House {
private int hid;
private String housename;
private Host host;
public House(){
}
public House(int hid,String housename,Host host) {
super();
this.hid = hid;
this.housename = housename;
this.host = host;
}
public int getHid() {
return hid;
}
public Host getHost() {
return host;
}
public void setHost(Host host) {
this.host = host;
}
public String getHousename() {
return housename;
}
public void setHousename(String housename) {
this.housename = housename;
}
public void setHid(int hid) {
this.hid = hid;
}
@Override
public String toString() {
return "House{" +
"hid=" + hid +
", housename='" + housename + '\'' +
", host=" + host +
'}';
}
}
然后写出对应的Mapper接口:
HouseMapper:
package maper;
import ouc.Host;
import ouc.House;
import java.util.List;
public interface HouseMapper {
/**
* 插入
* @param house
*/
public void insertHouse(House house) throws Exception;
/**
* 找到所有房子
* @return
*
*/
public List<House> findAll() throws Exception;
/**
* 查找房
* @param hid
* @return
*/
public House findHouseByHid(int hid) throws Exception;
}
HostMapper:
package maper;
import ouc.Host;
public interface HostMapper {
/**
* 插入
*/
public void insert(Host host) throws Exception;
/**
* 查找
* @param mid
*/
public void findByMid(int mid) throws Exception;
/**
* 删除
* @param mid
*/
public void delete(int mid) throws Exception;
public Host findHostByHid(int hid) throws Exception;
}
接下去是映射配置文件:
HouseMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="maper.HouseMapper">
<!-- 方式一:嵌套查询:通过执行另外一个SQL映射语句来返回预期的复杂类型-->
<resultMap id="house" type="ouc.House">
<id property="hid" column="hid" javaType="int"/>
<result property="housename" column="housename" javaType="String"/>
<association property="host" column="mid" select="maper.HostMapper.findHostByMid"/>
</resultMap>
<select id="findHouseByHid" resultType="ouc.House">
select * from t_house where hid=#{hid}
</select>
<!-- 方式二:嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集
封装联表查询的数据(去除重复的数据)-->
<resultMap id="house1" type="ouc.House">
<id property="hid" column="hid" javaType="int"/>
<result property="housename" column="housename" javaType="String"/>
<association property="host" javaType="ouc.Host">
<id property="mid" column="mid" />
<result property="name" column="name" />
</association>
</resultMap>
<select id ="findHouseByHid1" resultMap="house1">
SELECT * from t_house he,t_host ht where he.hid = ht.hid and he.hid=#{hid}
</select>
</mapper>
HostMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="maper.HostMapper">
<resultMap id="hostMap" type="ouc.Host">
<id property="mid" column="mid" javaType="int"/>
<result property="name" column="name" javaType="String"/>
<association property="house" column="hid" select="maper.HouseMapper.findHouseByHid"/>
</resultMap>
<select id="findHostByMid" resultType="ouc.Host">
select * from t_host where mid=#{mid}
</select>
<insert id="insert">
insert INTO t_host values(#{mid},#{name},#{house.hid})
</insert>
</mapper>
因为在mybatis.cfg.xml下已经设置了自动扫描方式,所以就不去一一设置了。
工具类也不再具体说明,与上篇文章一样。
最后是测试类:
package Test;
import Tools.DBtools;
import maper.*;
import org.apache.ibatis.session.SqlSession;
import ouc.*;
import ouc.Class;
public class test {
public static void main(String agrs[]){
SqlSession sqlSession = DBtools.getSession();
HouseMapper hMaper = sqlSession.getMapper(HouseMapper.class);
HostMapper hostMapper = sqlSession.getMapper(HostMapper.class);
try {
House house = hMaper.findHouseByHid1(5);
System.out.print(house);
sqlSession.commit();
} catch (Exception e) {
e.printStackTrace();
sqlSession.rollback();
}
}
}
结果测试成功。
(二) 一对多关系
以班级和学生为例,这里一个班级对应多个学生。
持久类:
学生:
package ouc;
public class Student {
private int sid;
private String sname;
private Class clazz;
public String getSname() {
return sname;
}
public Student(){
}
public Class getClazz() {
return clazz;
}
public void setClazz(Class clazz) {
this.clazz = clazz;
}
public Student(int sid, String sname, Class clazz) {
super();
this.sid = sid;
this.sname =sname;
this.clazz = clazz;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", clazz=" + clazz +
'}';
}
}
班级:
package ouc;
import java.util.List;
public class Class {
private int cid;
private String cname;
private List<Student> students;
public String getCname() {
return cname;
}
public List<Student> getStudents() {
return students;
}
public Class(){
}
public Class(int cid,String cname,List<Student> students) {
super();
this.cid = cid;
this.cname = cname;
this.students = students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
public void setCname(String cname) {
this.cname = cname;
}
public int getCid() {
return cid;
}
public void setCid(int cid) {
this.cid = cid;
}
@Override
public String toString() {
return "Class{" +
"cid=" + cid +
", cname='" + cname + '\'' +
", students=" + students +
'}';
}
}
同样,写出Mapper接口
package maper;
import ouc.Student;
import java.util.List;
public interface StudentMaper {
public void insertStudent(Student student) throws Exception;
public Student findStudent(int sid) throws Exception;
public List<Student> findStudentsByCid(int cid) throws Exception;
}
package maper;
import ouc.Class;
public interface ClassMaper {
public void insertClass(Class clazz) throws Exception;
public Class findClass(int id) throws Exception;
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 不要忘记namespace!!!! -->
<mapper namespace="maper.ClassMaper">
<resultMap id="classAndStudentMap" type="Class">
<id property="cid" column="cid" javaType="int"/>
<result property="cname" column="cname" javaType="String"/>
<!-- ???? -->
<!-- column项 为CID!!! -->
<collection property="students" column="cid" select="maper.StudentMaper.findStudentsByCid"/>
</resultMap>
<insert id="insertClass" useGeneratedKeys="true" keyProperty="cid">
insert into class values(#{cid},#{cname})
</insert>
<select id="findClass" parameterType="int" resultMap="classAndStudentMap">
select * from class where cid=#{cid}
</select>
</mapper>