基础示例:基于用户与身份证之间一对一的关系,示例展示了用户信息想关联身份证号或身份证全量信息的用法。

1、构建实体对象

  1. @Data
  2. @Table(comment = "身份证信息")
  3. public class IdentityCard {
  4. @ColumnComment("主键")
  5. private String id;
  6. @Unique
  7. @ColumnComment("用户id")
  8. private String userId;
  9. @ColumnComment("身份证号")
  10. private String identityNumber;
  11. // 身份证其他信息
  12. ......
  13. }
  1. @Data
  2. @Table(comment = "用户信息")
  3. public class User {
  4. @ColumnComment("主键")
  5. private String id;
  6. @ColumnComment("用户名")
  7. private String username;
  8. @ColumnComment("密码")
  9. private String password;
  10. // 关联身份证完整信息
  11. // 其中‘conditions’的赋值,表示当前对象(User)的id属性与关联对象(IdentityCard)的userId属性相同
  12. // 即,如果当前User对象的id为1的话,那么IdentityCard数据中某条userId为1的数据会被关联过来
  13. @BindEntity(conditions = @JoinCondition(selfField = "id", joinField = "userId"))
  14. private IdentityCard idCard;
  15. // 同理只关联身份证号码,@BindField比@BindEntity多了entity、field字段。
  16. // 因为无法从属性的类型上直接获取实体,需要指明哪个实体的哪个字段。
  17. @BindField(entity = IdentityCard.class,
  18. field = "identityNumber",
  19. conditions = @JoinCondition(selfField = "id", joinField = "userId"))
  20. private String idCardNumber;
  21. }

2、数据查询

  1. /**
  2. * 正常继承自MP的BaseMapper<T>即可
  3. */
  4. @Mapper
  5. public interface UserMapper extends BaseMapper<User> {
  6. /**
  7. * xml的sql省略了
  8. */
  9. List<User> listByUsername(String name);
  10. }
  1. /**
  2. * 用户服务
  3. */
  4. @Slf4j
  5. @Service
  6. public class UserService {
  7. @Resource
  8. private UserMapper userMapper;
  9. /**
  10. * 根据用户的名字模糊查询所有用户的详细信息
  11. */
  12. @Transactional(readOnly = true)
  13. public List<User> searchUserByName(String name) {
  14. // 获取到需要的user集合
  15. List<User> userList = userMapper.listByUsername(name);
  16. // 关键步骤,指定关联角色数据。如果你打开sql打印,会看到3条sql语句,第一条根据id去User表查询user信息,第二条根据userId去IdentityCard中查询
  17. // 【推荐】用法一、指定属性关联。
  18. Binder.bindOn(userList, User::getIdCardNumber);
  19. // 【不推荐】用法二、全关联。此种用法默认关联user下所有声明需要绑定的属性。
  20. // Binder.bind(userList);
  21. return userList;
  22. }
  23. }

3、进阶查询(推荐)

熟悉MybatisPlus的话可以利用MybatisPlus的lambda表达式查询

  1. /**
  2. * 正常继承自MP的BaseMapper<T>即可
  3. */
  4. @Mapper
  5. public interface UserMapper extends BaseMapper<User> {
  6. }
  1. /**
  2. * BaseRepository,该类集成了MP的ServiceImpl,ServiceImpl包装了BaseMapper的同时,引入了lambda形式的数据查询
  3. * BaseRepository在ServiceImpl的基础上,添加了动态监听数据变化的事件,配合【数据冗余】功能,同时也拓展了lambda支持快捷bind操作
  4. * 后文有关于BaseRepository的专门讲解
  5. */
  6. @Repository
  7. public class UserRepository extends BaseRepository<UserMapper, User> {
  8. }
  1. /**
  2. * 用户服务
  3. */
  4. @Slf4j
  5. @Service
  6. public class UserService {
  7. @Resource
  8. private UserRepository userRepository;
  9. /**
  10. * 【推荐】根据用户的名字模糊查询所有用户的详细信息,等价于上一个查询方式
  11. */
  12. @Transactional(readOnly = true)
  13. public List<User> searchUserByName(String name) {
  14. // 本框架拓展的lambda查询器lambdaQueryPlus,增加了bindOne、bindList、bindPage
  15. // 显然这是一种更加简便的查询方式,但是如果存在多级深度的关联关系,此种方法就不适用了,还需要借助Binder
  16. List<User> userList = userRepository.lambdaQueryPlus()
  17. .eq(name != null, User::getUsername, name)
  18. // 【推荐】用法一、指定属性关联,只关联身份证号这个字段。
  19. .bindList(User::getIdCardNumber);
  20. // 【不推荐】用法二、全关联。
  21. // .bindList();
  22. return userList;
  23. }
  24. }