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

}
时间: 2024-11-04 09:16:42

-------------------------------用MyBatis处理表与表之间的关联关系----------------------------------的相关文章

mybatis框架学习-多表查询

啰里巴嗦 mybatis中的多表查询 表之间的关系有几种: 一对多 多对一 一对一 多对多 举例: 用户和订单就是一对多 订单和用户就是多对一 一个用户可以下多个订单 多个订单属于同一个用户 人和身份证号就是一对一 一个人只能有一个身份证号 一个身份证号只能属于一个人 老师和学生之间就是多对多 一个学生可以被多个老师教过 一个老师可以交多个学生 特例: 如果拿出每一个订单,他都只能属于一个用户. 所以Mybatis就把多对一看成了一对一. mybatis中的多表查询: 示例:用户和账户 一个用户

sharding-jdbc结合mybatis实现分库分表功能

最近忙于项目已经好久几天没写博客了,前2篇文章我给大家介绍了搭建基础springMvc+mybatis的maven工程,这个简单框架已经可以对付一般的小型项目.但是我们实际项目中会碰到很多复杂的场景,比如数据量很大的情况下如何保证性能.今天我就给大家介绍数据库分库分表的优化,本文介绍mybatis结合当当网的sharding-jdbc分库分表技术(原理这里不做介绍) 首先在pom文件中引入需要的依赖 <dependency> <groupId>com.dangdang</gr

第四天,表与表之间的关系,一对多,多对多,查询

※MySQL中的字符编码(注意,utf8中没有'-',跟Java中不一样)SHOW VARIABLES; //查看系统变量//查询字符编码相关的系统变量SHOW VARIABLES WHERE variable_name LIKE 'character%'; 解决MySQK的中文乱码:character_set_client,character_set_connection和character_set_results这三者必须一致(GBK,GB2312,UTF8这三者都可以,但若采用其中一种则3

MySQL---数据库从入门走上大神系列(四)-子查询、表与表之间的关系

本篇博客讲解(子查询)非相关子查询/相关子查询,一对一,一对多,多对一,多对的的关系! 准备: 首先我们创建一列sex.再为部分行设置好值0(女)或者1(男): delete from stud where age=26; 删除年龄为26的行. update stud set sex='1' where saddress like '湖南%'; 将地址中湖南开头的人的的sex修改为1. update stud set sex='0' where age>=30 and sex is null;

mysql表与表之间的关系(多对多,一对多)

#创建数据库CREATE DATABASE day15;#使用USE day15;#创建表CREATE TABLE test1( id INT PRIMARY KEY AUTO_INCREMENT,#这是主键 num INT UNIQUE, #这个唯一键不起作用? NAME VARCHAR(22));#存入数据INSERT INTO test1(NAME) VALUES('aaa'); #删除数据但是不重置自动增长数DELETE FROM test1; #删除数据重置行数(相当于删除掉整个表,然

表与表之间关系回顾

------------------siwuxie095 表与表之间关系回顾 1.一对多 (1) 1)场景:分类和商品的关系 2)描述:一个分类里面有多个商品,一个商品只能属于一个分类 (2) 1)场景:客户和联系人的关系 2)描述:一个客户里面有多个联系人,一个联系人只能属于一个客户 注意:这里的客户是公司级的,即 公司,联系人 即 公司里的员工,实 际上就是公司和员工的关系 (3)一对多建表:通过外键建立关系 在多的那一方创建字段作为外键,指向一的那一方的主键 客户: cid cname 1

表和表之间的连接

表和表之间为什么要产生连接:因为单个表的信息不完整,需要在其他表中获取更加完整的信息,所以表和表之间产生了连接关系 inner join(内连接) ,可简写为:join 解释: inner join(等值连接) 只返回两个表中联结字段相等的行 left outer join(左连接),可简写为:left join 解释:left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right outer join(右连接),可简写为:right join 解释:right j

mybatis的sharding分表

最近业务系统处理数据量比较大,需要分表,由于用的mybatis做持久化,有sharding插件可以直接用,下面是自己做的demo部分 一.Pom.xml添加maven依赖, <dependency> <groupId>org.shardbatis</groupId> <artifactId>shardbatis</artifactId> <version>2.0.0D</version> </dependency&g

ios CoreData框架的使用,对上下文数据的增删改查,表与表之间的关联,1对多,1对1,谓词查询,多表连接

这里是只是代码,因为博客插入图片效果不是很好,我自己写的总结比较详细,有兴趣的朋友可以在评论里留下邮箱,我收到后会发给大家. 转载注明出处,重视原创者的劳动成果,谢谢! - (void)viewDidLoad { [super viewDidLoad]; [self _creatTable];//插入数据 //    [self _query];// 查询数据 // KVC很霸道,即使readonly通过kvc也可赋值,kvo精华 //    Book * book = [[Book alloc