基础示例:基于用户与身份证之间一对一的关系,示例展示了用户信息想关联身份证号或身份证全量信息的用法。
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>即可
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {
/**
* xml的sql省略了
*/
List<User> listByUsername(String name);
}
/**
* 用户服务
*/
@Slf4j
@Service
public class UserService {
@Resource
private 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>即可
*/
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
/**
* BaseRepository,该类集成了MP的ServiceImpl,ServiceImpl包装了BaseMapper的同时,引入了lambda形式的数据查询
* BaseRepository在ServiceImpl的基础上,添加了动态监听数据变化的事件,配合【数据冗余】功能,同时也拓展了lambda支持快捷bind操作
* 后文有关于BaseRepository的专门讲解
*/
@Repository
public class UserRepository extends BaseRepository<UserMapper, User> {
}
/**
* 用户服务
*/
@Slf4j
@Service
public class UserService {
@Resource
private UserRepository userRepository;
/**
* 【推荐】根据用户的名字模糊查询所有用户的详细信息,等价于上一个查询方式
*/
@Transactional(readOnly = true)
public List<User> searchUserByName(String name) {
// 本框架拓展的lambda查询器lambdaQueryPlus,增加了bindOne、bindList、bindPage
// 显然这是一种更加简便的查询方式,但是如果存在多级深度的关联关系,此种方法就不适用了,还需要借助Binder
List<User> userList = userRepository.lambdaQueryPlus()
.eq(name != null, User::getUsername, name)
// 【推荐】用法一、指定属性关联,只关联身份证号这个字段。
.bindList(User::getIdCardNumber);
// 【不推荐】用法二、全关联。
// .bindList();
return userList;
}
}