mybatis 一对多 , 就是说一个寝室可以对应很多个人住在里面
那么寝室和人之间就形成了一对多的关系
在XML一对多配置有两种 ,
1. 嵌套查询 , 优点在于关系明朗 , 缺点就是需要查询几次数据库
2. 直接将数据一次性查询出来 , 利用xml进行数据匹配 ,优点在于只需要查询一次数据 , 缺点就是结构不明确
在这里就直接使用第二种了
数据库为Mysql5.5
先创建两个表
寝室(Dorm)
-- 寝室表 CREATE TABLE Dorm( dno INT(10) PRIMARY KEY AUTO_INCREMENT , DNAME VARCHAR(20) )
人(DormPerson)
-- 寝室内的人 CREATE TABLE DORMPERSON( DPNO INT(10) PRIMARY KEY AUTO_INCREMENT , DPNAME VARCHAR(20) , DNO INT(10) REFERENCES DORM(DNO) )
插入数据
-- 添加寝室 INSERT INTO DorM(DNAME) VALUE('101') , ('102') , ('103'); -- 添加人 INSERT INTO DORMPERSON(DPNAME , DNO) VALUE('A1' , 1) , ('A2' , 1) , ('A3' , 1) ,('B1' , 2) , ('B2' , 2) , ('B3' , 2) , ('C1' , 3) , ('C2' , 3) , ('C3' , 3);
Java 操作
首先为表建立实体类对应绑定
Dorm实体
package cn.hong.bean; import java.util.List; public class Dorm { private Integer dno; private String dname; private List<DormPerson> dplist; public Integer getDno() { return dno; } public void setDno(Integer dno) { this.dno = dno; } public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; } public List<DormPerson> getDplist() { return dplist; } public void setDplist(List<DormPerson> dplist) { this.dplist = dplist; } @Override public String toString() { return "Dorm [dno=" + dno + ", dname=" + dname + ",dplist=" + dplist + "]"; } }
DormPerson实体
package cn.hong.bean; public class DormPerson { private Integer dpno; private String dpname; private Integer dno; public Integer getDpno() { return dpno; } public void setDpno(Integer dpno) { this.dpno = dpno; } public String getDpname() { return dpname; } public void setDpname(String dpname) { this.dpname = dpname; } public Integer getDno() { return dno; } public void setDno(Integer dno) { this.dno = dno; } public String toString() { return "DormPerson [dpno=" + dpno + ", dpname=" + dpname + ", dno=" + dno + "]"; } }
建立一个对Dorm进行操作的接口
package cn.hong.mapper; import cn.hong.bean.Dorm; public interface DormMapper { /** * @category 查找Dorm数据 * @return */ public Dorm find(Integer _parameter); }
建立一个与DormMapper接口对应的XML文件
<?xml version="1.0" encoding="UTF-8"?> <!-- 定义dtd文件 --> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 接口操作与数据操作绑定 --> <mapper namespace="cn.hong.mapper.DormMapper"> <resultMap type="cn.hong.bean.Dorm" id="dormMap"> <id property="dno" column="dno" javaType="Integer" /> <result property="dname" column="dname" javaType="String" /> <collection property="dplist" javaType="java.util.ArrayList" ofType="cn.hong.bean.DormPerson"> <id property="dpno" column="dpno" javaType="Integer"/> <result property="dpname" column="dpname" javaType="String"/> <result property="dno" column="dno" javaType="Integer"/> </collection> </resultMap> <select id="find" resultMap="dormMap"> SELECT d.dno , d.dname , dp.dpno , dp.dpname ,dp.dno FROM DORMPERSON dp INNER JOIN dorm d ON dp.DNO = d.dno <where> <if test="_parameter != 0"> and d.dno=#{_parameter}; </if> </where> </select> </mapper>
测试类
import java.io.IOException; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Test; import cn.hong.bean.Dorm; import cn.hong.mapper.DormMapper; public class DormTest { @Test public void Test() throws IOException { String resource = "mybatis.conn.xml"; InputStream in = Resources.getResourceAsStream(resource); SqlSessionFactory ssf =new SqlSessionFactoryBuilder().build(in); SqlSession ss = ssf.openSession(); DormMapper dm = ss.getMapper(DormMapper.class); Dorm d = dm.find(3); System.out.println(d.toString()); } }
注意:当你接口中方法的参数为Integer类型的时候不能直接在xml文件中进行判断,如果你想要拿Integer类型参数进行判断的时候有以下两种方法可以实现
1.将select语句中参数名改为_parameter
2.不改变SQL语句 , 在参数前调价 @Param(value="xxx")
如果不按照以上方式处理的话就会报 There is no getter for property named 'xxx' in 'class java.lang.Integer'