基础示例:基于用户与身份证之间一对一的关系,示例展示了用户信息想关联身份证号或身份证全量信息的用法。
1、构建实体对象
@Data@Table(comment = "身份证信息")public class IdentityCard {@ColumnComment("主键")private String id;@Unique@ColumnComment("用户id")private String userId;@ColumnComment("身份证号")private String identityNumber;// 身份证其他信息......}
@Data@Table(comment = "用户信息")public class User {@ColumnComment("主键")private String id;@ColumnComment("用户名")private String username;@ColumnComment("密码")private String password;// 关联身份证完整信息// 其中‘conditions’的赋值,表示当前对象(User)的id属性与关联对象(IdentityCard)的userId属性相同// 即,如果当前User对象的id为1的话,那么IdentityCard数据中某条userId为1的数据会被关联过来@BindEntity(conditions = @JoinCondition(selfField = "id", joinField = "userId"))private IdentityCard idCard;// 同理只关联身份证号码,@BindField比@BindEntity多了entity、field字段。// 因为无法从属性的类型上直接获取实体,需要指明哪个实体的哪个字段。@BindField(entity = IdentityCard.class,field = "identityNumber",conditions = @JoinCondition(selfField = "id", joinField = "userId"))private String idCardNumber;}
2、数据查询
/*** 正常继承自MP的BaseMapper<T>即可*/@Mapperpublic interface UserMapper extends BaseMapper<User> {/*** xml的sql省略了*/List<User> listByUsername(String name);}
/*** 用户服务*/@Slf4j@Servicepublic class UserService {@Resourceprivate UserMapper userMapper;/*** 根据用户的名字模糊查询所有用户的详细信息*/@Transactional(readOnly = true)public List<User> searchUserByName(String name) {// 获取到需要的user集合List<User> userList = userMapper.listByUsername(name);// 关键步骤,指定关联角色数据。如果你打开sql打印,会看到3条sql语句,第一条根据id去User表查询user信息,第二条根据userId去IdentityCard中查询// 【推荐】用法一、指定属性关联。Binder.bindOn(userList, User::getIdCardNumber);// 【不推荐】用法二、全关联。此种用法默认关联user下所有声明需要绑定的属性。// Binder.bind(userList);return userList;}}
3、进阶查询(推荐)
熟悉MybatisPlus的话可以利用MybatisPlus的lambda表达式查询
/*** 正常继承自MP的BaseMapper<T>即可*/@Mapperpublic interface UserMapper extends BaseMapper<User> {}
/*** BaseRepository,该类集成了MP的ServiceImpl,ServiceImpl包装了BaseMapper的同时,引入了lambda形式的数据查询* BaseRepository在ServiceImpl的基础上,添加了动态监听数据变化的事件,配合【数据冗余】功能,同时也拓展了lambda支持快捷bind操作* 后文有关于BaseRepository的专门讲解*/@Repositorypublic class UserRepository extends BaseRepository<UserMapper, User> {}
/*** 用户服务*/@Slf4j@Servicepublic class UserService {@Resourceprivate UserRepository userRepository;/*** 【推荐】根据用户的名字模糊查询所有用户的详细信息,等价于上一个查询方式*/@Transactional(readOnly = true)public List<User> searchUserByName(String name) {// 本框架拓展的lambda查询器lambdaQueryPlus,增加了bindOne、bindList、bindPage// 显然这是一种更加简便的查询方式,但是如果存在多级深度的关联关系,此种方法就不适用了,还需要借助BinderList<User> userList = userRepository.lambdaQueryPlus().eq(name != null, User::getUsername, name)// 【推荐】用法一、指定属性关联,只关联身份证号这个字段。.bindList(User::getIdCardNumber);// 【不推荐】用法二、全关联。// .bindList();return userList;}}
