Mybatis关联映射
Mybatis关联映射的用途:
在实际的开发过程中,对于数据库的操作除了单表外往往会涉及到多张表,这些操作在面向对象中就涉及到了对象与对象之间的关联关系。针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关系。
关联关系的种类:
在关系型数据库中,多表之间存在着三种关联关系,分别为一对一(1:1)、一对多(1:N)和多对多(M:N)。
一对一(1:1):在任意一方引入对方主键作为外键。
一对多(1:N):在“多”的一方,添加“一”的一方的主键作为外键。
多对多(M:N):产生中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键。
在java中也可以通过对象进行关联关系的描述
一对一(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默认没有开启延迟加载所以需要在核心配置文件中添加一些配置。如下图:
使用<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);