mybatis 换一种格式完成一对一关联单表查询
上次我们查询的是类,这次我们试试查询list。
联动:
其实上次的方法是有大问题的。
因为限制了id为绝对单一,所以通过id去查找数据无论如何都只能查到一个实体类的数据。但是,如果存在多个匹配结果,因为单个实体类无法映射多个返回,就会报错。
为了解决这个问题,需要使用list去承载多个返回的实体类结果。
一、代码实现
(1)首先写好class的实体类Class2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package test; import java.util.List; public class Class2 { private int id; private String name; private List<Teacher> teachers; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Teacher> getTeachers() { return teachers; } public void setTeachers(List<Teacher> teachers) { this.teachers = teachers; } @Override public String toString() { return "Class2 [id=" + id + ", name=" + name + ", teachers=" + teachers + "]"; } } |
主要改动就是private List<Teacher> teachers,从单一实体类换成了list。
(2)配置sql映射文件ClassMapper2.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?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="test.ClassMapper2"> <resultMap type="test.Class2" id="ClassResultMap"> <id property="id" column="id" /> <result property="name" column="name" /> <collection property="teachers" column="teacherid" ofType="test.Teacher"> <id property="id" column="id"/> <result property="name" column="name"/> </collection> </resultMap> <select id="selectbyidlist" parameterType="int" resultMap="ClassResultMap"> select * from class c,teacher t where c.teacherid = t.id and c.id = #{id} </select> </mapper> |
注意:teachers这个字段从association换成了collection。
(3)在mybatis配置文件conf.xml中注册sql配置文件ClassMapper2.xml
1 2 3 4 |
<!-- 注册mapper --> <mappers> <mapper resource="test/ClassMapper2.xml"/> </mappers> |
一样的注册,没有什么不同。
(4)写一个测试方法
1 2 3 4 5 6 7 8 9 10 |
@Test public void selectbyidlist(){ SqlSession sqlSession = getFactory().openSession(); String statement = "test.ClassMapper2.selectbyidlist"; Class2 class2 = sqlSession.selectOne(statement,1); List<Teacher> teachers = class2.getTeachers(); for (Teacher teacher : teachers) { System.out.println("id:" + teacher.getId() + " " + "name:" + teacher.getName()); } } |
运行结果:
1 |
id:1 name:godlikexie |
成功输出了class中id为1的teacher的数据。
(5)分析
这次只做了一点小改动,但是意义有很大不同。
如果class的实体类中嵌入的是teacher的实体类,那么查询结果只能有1个,如果存在多个返回值,就报错。所以,如果存在多个查询结果,就需要一个list来装载查询结果。
所以改成了一个List<Teacher>,这样就允许返回多个结果了。
二、总结
如果有多个返回结果,就可以这么写。