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类类型的集合
一对一的关联关系:
而在
在
Property:指定映射到的实体类对象属性,与表字段一一对应
Column:指定表中对应的字段
javaType:指定映射到实体对象属性的类型
Select:指定引入嵌套查询的子SQL语句,该属性用于关联映射中的嵌套查询
fetchType:指定在关联查询时是否启用延迟加载。
MyBatis加载关联关系对象的两种方式:
嵌套查询:嵌套查询是通过执行另外一条SQL映射语句来返回预期的复杂类型
嵌套结果:嵌套结果是使用嵌套结果映射来处理重复的联合结果的子集
二者的区别:
嵌套查询 |
嵌套结果 |
嵌套查询是在查询 SQL 后再进行一个(子)查询 |
嵌套结果是一个多表查询的 SQL 语句 |
会执行多条 SQL 语句 |
只有一条复杂的 SQL 语句(多表连接) |
SQL语句编写较为简单 |
SQL语句编写较为复杂 |
嵌套查询的方式比较简单,但嵌套查询的方式要执行多条SQL语句,这种方式对于大型数据集合和列可能会导致成百上千条关联的SQL语句被执行,极大的消耗数据库性能并降低查询效率。
解决方法:MyBatis的延迟加载在一定程度上可以降低运行消耗并提高查询效率。因为在MyBatis默认没有开启延迟加载所以需要在核心配置文件中添加一些配置。如下图:
使用
嵌套查询:
javaType="com.itheima.po.IdCard" select="com.itheima.mapper.IdCardMapper.findCodeById" />
嵌套结果:
一对多的关联关系:
同样在
配置:
嵌套查询:
select=" com.itheima.mapper.OrdersMapper.selectOrders" />
嵌套结果:
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
@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);