Active Record(活动记录 ),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的 一行记录。
ActiveRecord 一直广受动态语言( PHP 、 Ruby 等)的喜爱,而 Java 作为准静态语言,对于 ActiveRecord 往往只能感叹其优雅,所以 MP也在 AR 道路上进行了一定的探索
领域模型是一门很大的学问,对是很大,这里不做讨论
【1】com.baomidou.mybatisplus.activerecord.Model
① 这个类是什么
为什么要先说这个类?因为这是ActiveRecord 模式 CRUD。该类提供了一系列CRUD方法实现,当你的model如employee继承该类时即可使用CRUD方法。
② 如何使用 AR模式
仅仅需要让实体类继承 Model类且实现主键指定方法
,即可开启 AR之旅 。修改employee类如下(看不懂的请参考前面两篇博文)。
public class Employee extends Model<Employee> { private Integer id ; // int private String lastName; private String email ; private Integer gender; private Integer age ; @TableField(exist=false) private Double salary ; //...get set toString method /** * 指定当前实体类的主键属性,一定要注意这个方法!!! */ @Override protected Serializable pkVal() { return id; } }
③ model方法底层实现
以selectAll方法为例,可以看到其底层使用了sqlSession来实现方法—还是mybatis的东西。
public List<T> selectAll() { return sqlSession().selectList(sqlStatement(SqlMethod.SELECT_LIST)); }
【2】ActiveRecord 模式 CRUD实例
① 查询操作
测试代码如下:
@Test public void testARSelect() { Employee employee = new Employee(); //根据ID查询 //Employee result = employee.selectById(14); // employee.setId(14); // Employee result = employee.selectById(); // System.out.println(result ); //查询所有 // List<Employee> emps = employee.selectAll(); // System.out.println(emps); //模糊查询 // List<Employee > emps= // employee.selectList(new EntityWrapper<Employee>().like("last_name", "老师")); // System.out.println(emps); //统计查询 Integer result = employee.selectCount(new EntityWrapper<Employee>().eq("gender", 0)); System.out.println("result: " +result ); }
② 插入操作
测试代码如下:
@Test public void testARInsert() { Employee employee = new Employee(); employee.setLastName("小泽老师"); employee.setEmail("sls@163.com"); employee.setGender(1); employee.setAge(35); boolean result = employee.insert(); System.out.println("result:" +result ); }
直接调用了employee.insert();
方法进行插入。
③ 修改操作
测试代码如下:
@Test public void testARUpdate() { Employee employee = new Employee(); employee.setId(20); employee.setLastName("玛利亚老师"); employee.setEmail("sls@163.com"); employee.setGender(1); employee.setAge(36); boolean result = employee.updateById(); System.out.println("result:" +result ); }
直接调用了employee.updateById();
方法进行更新。
④ 删除操作
测试代码如下:
/** * AR 删除操作 * 注意: 删除不存在的数据 逻辑上也是属于成功的. */ @Test public void testARDelete() { Employee employee = new Employee(); //boolean result = employee.deleteById(2); // employee.setId(2); // boolean result = employee.deleteById(); // System.out.println("result:" +result ); boolean result = employee.delete(new EntityWrapper<Employee>().like("last_name", "小")); System.out.println(result ); }
⑤ 分页查询
测试代码如下:
@Test public void testARPage() { Employee employee = new Employee(); Page<Employee> page = employee.selectPage(new Page<>(1, 1), new EntityWrapper<Employee>().like("last_name", "老")); List<Employee> emps = page.getRecords(); System.out.println(emps); }
还有很多其他方法,使用类似。其实AR 模式提供了一种更加便捷的方式实现 CRUD 操作,其本质还是调用的Mybatis 对应的方法,类似于语法糖