Mybatis关联映射;Mybatis注解

2年前 (2022) 程序员胖胖胖虎阿
138 0 0

Mybatis关联映射

Mybatis关联映射的用途:

实际的开发过程中,对数据库的操作除了单表外往往会涉及到多张表,这些操作在面向对象中就涉及到了对象与对象之间的关联关系。针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关系。

关联关系的种类:

在关系型数据库中,多表之间存在着三种关联关系,分别为一对一(1:1)、一对多(1:N)和多对多(M:N)。

一对一(1:1):在任意一方引入对方主键作为外键。

一对多(1:N):在“多”的一方,添加“一”的一方的主键作为外键。

多对多(M:N):产生中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键。

在java中也可以通过对象进行关联关系的描述

Mybatis关联映射;Mybatis注解

 一对一(1:1):在本类中定义对方类型的对象

一对多(1:N):一个A类类型对应多个B类类型的情况,需要在A类中以集合的方式引入B类类型的对象,在B类中定义A类类型的属性a

多对多(M:N):在A类中定义B类类型的集合,在B类中定义A类类型的集合

一对一的关联关系:

<resultMap> 元素表示的是结果映射集,是 MyBatis 中最重要也是最强大的元素,主要是用来定义映射规则、级联的更新以及定义类型转化器等。

而在<resultMap>元素中,包含了一个<association>子元素,MyBatis就是通过该元素来处理一对一关联关系的。

在<association>子元素中可以配置以下属性:

Property:指定映射到的实体类对象属性,与表字段一一对应

Column:指定表中对应的字段

javaType:指定映射到实体对象属性的类型

Select:指定引入嵌套查询的子SQL语句,该属性用于关联映射中的嵌套查询

fetchType:指定在关联查询时是否启用延迟加载。

MyBatis加载关联关系对象的两种方式:

嵌套查询:嵌套查询是通过执行另外一条SQL映射语句来返回预期的复杂类型

嵌套结果:嵌套结果是使用嵌套结果映射来处理重复的联合结果的子集

二者的区别:

嵌套查询

嵌套结果

嵌套查询是在查询 SQL 后再进行一个(子)查询

嵌套结果是一个多表查询的 SQL 语句

会执行多条 SQL 语句

只有一条复杂的 SQL 语句(多表连接)

SQL语句编写较为简单

SQL语句编写较为复杂

嵌套查询的方式比较简单但嵌套查询的方式要执行多条SQL语句,这种方式对于大型数据集合和列可能会导致成百上千条关联的SQL语句被执行,极大的消耗数据库性能并降低查询效率。

解决方法:MyBatis的延迟加载在一定程度上可以降低运行消耗并提高查询效率。因为在MyBatis默认没有开启延迟加载所以需要在核心配置文件中添加一些配置。如下图:

Mybatis关联映射;Mybatis注解

 使用<association>元素进行一对一关联映射配置

嵌套查询:

<association property="card" column="card_id"

                                        javaType="com.itheima.po.IdCard"                 ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        select="com.itheima.mapper.IdCardMapper.findCodeById" />

嵌套结果:

<association property="card" javaType="com.itheima.po.IdCard">

              <id property="id" column="card_id" />

              <result property="code" column="code" />

    </association>

一对多的关联关系:

同样在<resultMap>元素中,包含了一个<collection>子元素,MyBatis通过该元素来处理一对多关联关系。

 <collection>子元素的属性与<association>元素大致相同,但<collection>包含一个特殊属性ofType,它用于指定实体对象中集合类属性所包含的元素类型。

配置:

嵌套查询:

<collection property="ordersList" column="id" ofType="com.itheima.po.Orders"

                     select=" com.itheima.mapper.OrdersMapper.selectOrders" />

嵌套结果:

<collection property="ordersList" ofType="com.itheima.po.Orders">

            <id property="id" column="orders_id" />

            <result property="number" column="number" />

  </collection>

Mybatis注解

MyBatis的注解方式就是将SQL语句直接写在接口上。

MyBatis注解SQL中,最基本的是@Select、@Insert、@Update、@Delete四种。

MyBatis注解

优点:对于需求比较简单的系统,效率高。

缺点:当SQL有变化时都需要重新编译代码

@Select注解:实现查询功能

        @Select("Select * from user")

        @Results({

        @Result(id = true, column = "id", property = "id"),

        @Result(column = "name", property = "name"),

        @Result(column = "sex", property = "sex"),

        @Result(column = "age", property = "age")

        })

        List<User> queryAllUser();

@Insert注解:实现插入功能

        @Insert("insert into user(name,sex,age) values(#{name},#{sex},#{age}")

        int saveUser(User user);

@Update注解:实现更新功能

        @Update("update user set name= #{name},sex = #{sex},age =#{age} where id = #{id}")

        void updateUserById(User user);

@Delete注解:实现删除功能

        @Delete("delete from  user  where id =#{id}")

        void deleteById(Integer id);

版权声明:程序员胖胖胖虎阿 发表于 2022年11月1日 上午1:56。
转载请注明:Mybatis关联映射;Mybatis注解 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...