-------------------------------用MyBatis处理表与表之间的关联关系----------------------------------
Posted 【宁静的夏天】
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了-------------------------------用MyBatis处理表与表之间的关联关系----------------------------------相关的知识,希望对你有一定的参考价值。
1. 表与表的关联关系分为“一对多”,“多对一”,“自联查”,“多对多”,“一对一”。
2.(1)第一种“一对多”的实例,就是一个国家有多个城市
先看下数据库一个country(国家) 和provincial(城市)
---------------------------
(2)建好表之后,我们都知道一个国家有多个城市,所以在country实体类里加一个泛型集合list<provincial>
接口中写一个通过国家id查询一个它的对象(包含它下面的城市)的方法
在mappe.xml文件里,下面是通过两句sql语句查询的,这样可以使用慢加载,在config.xml中配置一个settings标签
<settings> | ||
+ <!--开启延迟加载 默认值是 false--> | ||
+ <setting name="lazyLoadingEnabled" value="true"/> | ||
+ <!-- | ||
+ 我们的一个实体类中可以有多个延迟加载属性不?? 肯定可以! | ||
+ 当启用后,一个有延迟加载属性的对象的任何一个延迟属性被加载时,该对象的所有的属性都会被加载。 | ||
+ 否则,所有属性都是按需加载。默认值是true | ||
+ --> | ||
+ <setting name="aggressiveLazyLoading" value="false"/> | ||
</settings> | ||
|
这个lazyLoadingEnabled默认value=false
aggressiveLazyLoading默认value=true
最后就是测试
3 多对一 相反多个城市可以是一个国家 看下面实体类,在实体类Provincial里面加载一个Country 属性就好
接口中定义一个方法
在mapper.xml 中
然后就是测试
4 。自连接先建一个这样的库
实体类
接口
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="com.xdf.dao.TeacherDao"> <!--必须是对应的dao接口的全类名--> <!-- id name tid 1 导师1 0 2 导师2 0 3 老师1 1 4 老师2 1 5 老师3 3 id: 老师的编号 name:老师姓名 tid:导师的编号 需求 : 根据导师的编号查询出所有的老师信息 比如说:现在查询导师编号为1的所有老师信息 步骤: 01.select * from teacher where tid=1 这时候会有 3 4 两条信息 02. 把这两条信息的id 当成 tid 再次查询 03.tid 为3的 又有一名老师 5 04.结果应该是 3 4 5 三名老师 05.不断的把查询结果的id当成 tid 再次查询, 直到没有值结束查询 --> <!-- 01.根据导师的编号查询导师信息 我们是根据tid查询的 tid是导师编号 然后我们再把查询结果id当成tid再次查询--> <select id="selectTeachersByTid" resultMap="teacherMap"> SELECT id,tname from teacher where tid=#{xxx} </select> <resultMap id="teacherMap" type="Teacher"> <id property="id" column="id"/> <result property="name" column="tname"/> <!--导师对应的老师集合 把查询结果id当成tid再次查询 --> <collection property="teachers" ofType="Teacher" select="selectTeachersByTid" column="id"/> </resultMap> <!-- 01.根据老师的编号查询自身信息 如果这个老师是导师,那么再把id当成tid再次查询下面的老师信息--> <select id="selectByTeacherId" resultMap="teacherIdMap"> select id,tname from teacher where id=#{xxx} </select> <resultMap id="teacherIdMap" type="Teacher"> <id property="id" column="id"/> <result property="name" column="tname"/> <!-- 如果这个老师是导师,那么再把id当成tid再次查询下面的老师信息 --> <collection property="teachers" ofType="Teacher" select="selectTeachersByTid" column="id"/> </resultMap> </mapper>
实现类
自连接的多对一查询 延迟加载 public class TeacherTest { TeacherDao dao=null; SqlSession session=null; Logger log=Logger.getLogger(TeacherTest.class); /** * 在所有的test测试方法执行之前 都要执行的操作 */ @Before public void before(){ //获取session session= SessionFactoryUtil.getSession(); dao=session.getMapper(TeacherDao.class); //获取执行的类对象 } @After public void after(){ if (session!=null){ session.close(); } } @Test public void testSelectByTid(){ List<Teacher> teachers = dao.selectTeachersByTid(1); log.debug(teachers); //会把查询结果id当成tid再次查询 // log.debug(teachers.get(0).getName()); //不会触发 只查询 tid为1的数据 } @Test public void testSelectById(){ Teacher teacher= dao.selectByTeacherId(3); // log.debug(teacher.getName()); //1条sql log.debug(teacher); } }
以上是关于-------------------------------用MyBatis处理表与表之间的关联关系----------------------------------的主要内容,如果未能解决你的问题,请参考以下文章