首页 > 技术文章 > MyBatis关联映射小结

shijinglu2018 2020-03-13 11:21 原文

 https://www.cnblogs.com/shijinglu2018/p/10372835.html  其它内容参看自己之前相关联的一篇博客;

关联映射   
概念:关联映射,即类对象与类对象之间的关联关系,数据库表与数据库表之间的关系;
场景:一对一
步骤
       1.建库建表,插入数据,其中建表要将当前表中某个字段作为外键与另外一个表的主键相关联。
       2.导入相关jar包,并引入日志文件、MybatisUtils、mybatis-config.xml;
       3.建两个实体类。并在其中任意一个类中建立关联的属性字段,但个人认为,将属性少的那个实体类作为的id作为属性多的那个实体类的外键来关联。
       4.写映射文件;
       法1:写两个映射文件,一个是正常的查询,另外一个也是正常查询,但是需要注意的是,属性多的那个需要用<association>属性来关联另外一个表。
       法2:写一个映射文件,将两个表关联查询,也是在<resultMap>元素中嵌入一个<association>标签来关联另外一个表。
       说明:两种方法,法二更好,因为法二之结果嵌套,法一是查询嵌套,需要执行两条sql,法二只需执行一条sql,只是在写法上稍微显得复杂,但
       是从执行效率上来讲结果的表关联效率要高一些。
       5.写mybatis-config.xml,并在其中写入数据库的连接配置、别名等,还有就是加载映射文件的路径,另外在文件头部开启延迟加载,到需要的时候再
执行,在一定程度上降低运行消耗,提高查询效率。
       6.测试,到sqlSession工厂中去取映射的结果并将其存入到sqlSession中。



场景:一对多
步骤
       1.建库建表,插入数据,其中建表要将当前表中某个字段作为外键与另外一个表的主键相关联。
       2.导入相关jar包,并引入日志文件、MybatisUtils、mybatis-config.xml;
       3.建两个实体类。在一的一方定义关联属性,如private List<Orders> ordersList。
       4.写映射文件,以一的一方来写映射文件,将两张表通过id关联的形式来查询结果,当列名相同时要取别名来区分,返回值通过<resultMap>来表示,并将该其关联到另外一张表,并通过<collection>来关联另外一张表。
       5.写mybatis-config.xml,并在其中写入数据库的连接配置、别名等,还有就是加载映射文件的路径,另外在文件头部开启延迟加载,到需要的时候再执行,在一定程度上降低运行消耗,提高查询效率。
       6.测试,到sqlSession工厂中去取映射的结果并将其存入到sqlSession中。

 

场景:多对多,如订单和商品之间的关系
步骤
       1.建库建表,对于建表要着重说明,订单表和商品表中各自插入数据,由于是多对多,需要将两者关联起来的话要建一个中间表,这个中间表除了自身ID外,还要将订单表、商品表的id都设置进来,并且将这两个字段分别与另外两张表的主键相关联,用外键的方式。
       2.导入相关jar包,并引入日志文件、MybatisUtils、mybatis-config.xml;
       3.建实体类,如Orders.java和Product.java,由于是多对多,所以,当建Product.java时候,除了自身的属性需要定义之外,还要定义还要加上与另外一张表相关联的属性定义,如private List<Orders> orders;类似,当建Orders.java时也需要额外定义private List<Product> productList;
       4.写映射文件,如OrdersMapper.xml,在这个里面写一个根据ID查询的方法,返回值通过<resultMap>来表示,并将该其关联到另外一张表,过程中和一对多是一样的。另外一个ProductMapper.xml,也是根据id来查的,只是id是一个取自中间表,通过in的方式,格式如select * from product where in( select product_id from temp_table where orders_id=#{id})。
       5.在mybatis-config.xml中添加两张表资源路径。
       6.测试,到sqlSession工厂中去取映射的结果并将其存入到sqlSession中。

       说明:对于第4步,其实还可改写一下,因为,第四步执行了两条sql,是从两个表中分别取数据。
       改法:在<select>将这三张表通过id关联起来,并通过<collection>来将其连起来即可,做法和一对多类似。
       说明:这种方法更好,执行了一条sql,故能在一定程度上提高了效率,但在写法上可能要更复杂一点。

      一对多和多对多的关系:其实一对多和多对多有类似的地方,相当于是一对多的乘积,只是这个乘积是通过中间表来实现的。

推荐阅读