Mybatis 使用注解实现复杂关系映射开发
程序员文章站
2022-03-20 10:15:38
...
实现复杂关系映射之前我们可以在映射文件中通过配置<resultMap>
来实现, 在使用注解开发时我们需要借助@Results
注解, @Result
注解, @One
注解, @Many
注解
一、复杂关系映射的注解说明
@Results 注解:代替的是原先 UserDao.xml 中的标签<resultMap>
该注解中可以使用单个@Result 注解,也可以使用@Result 集合
@Results({@Result(), @Result() })或@Results(@Result())
@Resutl 注解:代替了 <id>标签和<result>标签
@Result 中 属性介绍:
* id 是否是主键字段
* column 数据库的列名
* property 需要装配的属性名
one 需要使用的@One 注解(@Result(one=@One)()))
many 需要使用的@Many 注解(@Result(many=@many)()))
@One 注解(一对一):代替了<assocation>标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。
@One 注解属性介绍:
* select 指定用来多表查询的 sqlmapper
* fetchType 会覆盖全局的配置参数 lazyLoadingEnabled。
使用格式:@Result(column=" ",property="",one=@One(select=""))
@Many 注解(多对一):代替了<Collection>标签,是多表查询的关键,在注解中用来指定子查询返回对象集合。
注意:聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType
(一般为 ArrayList)但是注解中可以不定义;
使用格式:@Result(property="",column="",many=@Many(select=""))
一般一对一关系采用立即获取,一对多关系采用延迟获取
二、使用注解实现一对一复杂关系映射及延迟加载
需求:加载账户信息时并且加载该账户的用户信息,根据情况可实现延迟加载。(注解方式实现)
@Data
public class Account implements Serializable {
private Integer id;
private Integer uid;
private Double money;
/**
* 多对一(mybatis中称之为一对一)的映射:一个账户只能属于一个用户
*/
private User user;
}
public interface AccountDao {
/**
* 查询所有账户,并且获取每个账户所属的用户信息
* @return
*/
@Select("select * from account")
@Results(id ="accountMap",value = {
@Result(id = true,column = "id",property = "id"),
@Result(column = "uid",property = "uid"),
@Result(column = "money",property = "money"),
@Result(property = "user",column = "uid",one=@One(select="mybatis.dao.UserDao.findById",fetchType= FetchType.EAGER))
})
List<Account> findAll();
/**
* 根据用户id查询账户信息
* @param uid
* @return
*/
@Select("select * from account where uid = #{uid}")
List<Account> findAccountByUid(Integer uid);
}
三、使用注解实现一对多复杂关系映射
需求:查询用户信息时,也要查询他的账户列表。使用注解方式实现。
分析:一个用户具有多个账户信息,所以形成了用户(User)与账户(Account)之间的一对多关系。
@Data
public class User implements Serializable{
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
/**
*一对多关系映射:一个用户对应多个账户
*/
private List<Account> accounts;
}
public interface UserDao {
/**
* 查询所有用户,包含每个用户的账户信息,同时采用延迟加载
* @return
*/
@Select("select * from user")
@Results(id="userMap",value={
@Result(id=true,column = "id",property = "id"),
@Result(column = "username",property = "username"),
@Result(column = "address",property = "address"),
@Result(column = "sex",property = "sex"),
@Result(column = "birthday",property = "birthday"),
@Result(property = "accounts",column = "id",
many = @Many(select = "mybatis.dao.AccountDao.findAccountByUid",
fetchType = FetchType.LAZY))
})
List<User> findAll();
/**
* 根据 id 查询用户信息
* @param id
* @return
*/
@Select("select * from user where id=#{id} ")
User findById(Integer id);
}
四、注意套娃现象的产生
这里使用注解实现复杂关系映射时,要注意防止套娃现象的出现,即如果想查询一个用户(包含其的账户信息),则对于用户就可以使用@ResultMap
,表示查询关联的账户
需要注意的是 findAccountByUid 的实现就不能再使用能查询账户下的用户的@ResultMap
标签,否则将会出现套娃现象
上一篇: Mybatis学习笔记
下一篇: Mybatis学习 && Lombok
推荐阅读
-
Maven项目开发中使用Mybatis注解开发
-
Mybatis使用注解实现一对一复杂关系映射及延迟加载
-
MyBatis3使用注解配置SQL映射器
-
day62 JavaWeb框架阶段—— Mybatis的注解开发&SSM框架整合(原始方式整合&Spring整合MyBatis& MyBatis的注解实现复杂映射开发)
-
Mybatis使用注解实现一对一复杂关系映射及延迟加载
-
Mybatis04—注解开发实现CRUD以及实现一对一、一对多及多对多复杂关系映射
-
Mybatis常用的注解开发CRUD&&复杂关系映射(一对一,一对多)&&mybatis 基于注解的二级缓存
-
Mybatis—— 使用注解实现一对一复杂关系映射及延迟加载
-
Mybatis使用注解实现一对多复杂关系映射
-
SSM框架学习之路-Mybatis(八)使用注解开发