ActiveRecord介绍
ActiveRecord(活动记录,简称AR),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。ActiveRecord 一直广受解释型动态语言( PHP 、 Ruby 等)的喜爱,通过围绕一个数据对象进行CRUD操作。而 Java 作为准静态(编译型)语言,对于 ActiveRecord 往往只能感叹其优雅,所以 MP 也在 AR 道路上进行了一定的探索,仅仅需要让实体类继承 Model 类且实现主键指定方法,即可开启 AR 之旅。
说明:
- 实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 需要项目中已注入对应实体的BaseMapper
ActiveRecord 模式 CRUD
必须存在对应的原始mapper并继承baseMapper并且可以使用的前提下 才能使用此 AR 模式 !!!
ActiveRecord实现
接下来我们来看一下ActiveRecord的实现步骤
【1】让实体类继承Model<User>类
@Data @AllArgsConstructor @NoArgsConstructor public class User extends Model<User> { private Long id; private String name; private Integer age; private String email; }
我们可以看到,Model类中提供了一些增删改查方法,这样的话我们就可以直接使用实体类对象调用这些增删改查方法了,简化了操作的语法,但是他的底层依然是需要UserMapper的,所以持久层接口并不能省略
【2】测试ActiveRecord模式的增删改查
添加数据
@Test void activeRecordAdd(){ User user = new User(); user.setName("wang"); user.setAge(35); user.setEmail("wang@powernode.com"); user.insert(); }
删除数据
@Test void activeRecordDelete(){ User user = new User(); user.setId(8L); user.deleteById(); }
修改数据
@Test void activeRecordUpdate(){ User user = new User(); user.setId(6L); user.setAge(50); user.updateById(); }
查询数据
@Test void activeRecordSelect(){ User user = new User(); user.setId(6L); User result = user.selectById(); System.out.println(result); }
SimpleQuery介绍
SimpleQuery可以对selectList查询后的结果用Stream流进行了一些封装,使其可以返回一些指定结果,简洁了api的调用
SimpleQuery实现
list
@SafeVarargs public static <E, A> List<A> list( LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, boolean isParallel, Consumer<E>... peeks) { return list2List(Db.list(wrapper.setEntityClass(getType(sFunction))), sFunction, isParallel, peeks); }
Params:
wrapper – 条件构造器
sFunction – 需要的列
isParallel – 是否并行流
peeks – 后续操作
演示基于字段封装集合
@Test void testList2(){ List<String> names = SimpleQuery.list( new LambdaQueryWrapper<User>().eq(User::getName, "Mary"), User::getName, e -> Optional.of(e.getName()).map(String::toLowerCase).ifPresent(e::setName)); System.out.println(names); }
map
@SafeVarargs public static <E, A, P> Map<A, P> map (LambdaQueryWrapper<E> wrapper, SFunction<E, A> keyFunc, SFunction<E, P> valueFunc, boolean isParallel, Consumer<E>... peeks) { return list2Map(Db.list(wrapper.setEntityClass(getType(keyFunc))), keyFunc, valueFunc, isParallel, peeks); }
传入Wrappers和key,从数据库中根据条件查询出对应的列表,封装成Map
Params:
wrapper – 条件构造器
keyFunc – key
valueFunc – value
isParallel – 是否并行流peeks – 封装成map时可能需要的后续操作,不需要可以不传
演示将所有的对象以id,实体的方式封装为Map集合
@Test void testMap(){ //将所有元素封装为Map形式 Map<Long, User> idEntityMap = SimpleQuery.keyMap( new LambdaQueryWrapper<>(), User::getId); System.out.println(idEntityMap); }
演示将单个对象以id,实体的方式封装为Map集合
@Test void testMap2(){ //将单个元素封装为Map形式 Map<Long, User> idEntityMap = SimpleQuery.keyMap( new LambdaQueryWrapper<User>().eq(User::getId,1L), User::getId); System.out.println(idEntityMap); }
演示只想要id和name组成的map
@Test void testMap3(){ //只想要只想要id和name组成的map Map<Long, String> idNameMap = SimpleQuery.map( new LambdaQueryWrapper<>(), User::getId, User::getName); System.out.println(idNameMap); }
Group
演示分组效果
@Test void testGroup(){ Map<String, List<User>> nameUsersMap = SimpleQuery.group( new LambdaQueryWrapper<>(), User::getName); System.out.println(nameUsersMap); }
相同姓名为一组,name作为map的key,同一姓名放在一个List集合中作为value