五、ActiveRecord(活动记录)

上一节我们学习基于 mybatis-plus 的条件构造器——QueryWrapper,这一节我们来学习一下mybatis-plusActiveRecord(活动记录)

在开始之前,我们先来了解一下什么是ActiveRecord(活动记录)?

Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。

ActiveRecord 一直广受动态语言( PHP 、 Ruby 等)的喜爱,而 Java 作为准静态语言,对于 ActiveRecord 往往只能感叹其优雅,所以 MP 也在 AR 道路上进行了一定的探索

那么我们如何使用AR模式呢?

仅仅需要让实体类继承 Model 类且实现主键指定方法,即可开启 AR 之旅 。

下面我们来介绍详细内容,首先按照快速开始——Spring集成Mybatis-Plus一节的操作,新建一个mp04Module,可以将mp02中的内容全部复制过来,然后进行下面的修改:

修改 Employee实体类:

 /**
 * mybatis-plus 默认会使用实体类的小写类名作为表名
 *
 * 继承 Model 类,开启AR模式
 */
@Data
@ToString
public class Employee extends Model {

    private Integer id;
    private String lastName;
    private String email;
    private Integer gender;
    private Integer age;

    // 当前字段是否在数据库中存在,如果不存在则忽略该字段插入到数据库中
    @TableField(exist = false)
    private Double salary;

    // 注意:我们这里需要重写pkVal()方法,return当前类的主键。 在实际的实践中,发现如果未重写pkVal()方法,并不会影响AR的使用
    @Override
    protected Serializable pkVal() {
        return this.id;
    }
}

注意:mybatis-plus 默认会使用实体类的小写类名作为表名,因为我们在 applicationContext.xml 中已经配置了表的前缀生成策略


    
    
    
    

所以,不会出现数据库表和实体类不匹配的状况,如果想要使用单独的表名,可以在实体类上使用@TableName("表名")注解。

@TableName("tbl_employee")
public class Employee extends Model{
// .. fields
// .. getter and setter
    @Override
    protected Serializable pkVal() {
    	return this.id;
    }
}

注意:mapper不用做修改,但是也不能少,虽然AR模式用不到该接口,但一定要定义,否则使用AR时会报空指针异常。

public interface EmployeeMapper extends BaseMapper {
}

修改mp04的pom.xml文件:



    
        mybatis-plus-in-action
        com.demo.mybatis-plus
        1.0-SNAPSHOT
    
    4.0.0

    mp04

    
        
        
            com.baomidou
            mybatis-plus
            ${mybatis.plus.version}
        
        
        
            junit
            junit
            ${junit.version}
        
        
        
            log4j
            log4j
            ${log4j.version}
        
        
        
            com.alibaba
            druid
            ${druid.version}
        
        
        
            mysql
            mysql-connector-java
            ${mysql.version}
        
        
        
            org.springframework
            spring-context
            ${spring.version}
        
        
            org.springframework
            spring-orm
            ${spring.version}
        
        
        
            org.projectlombok
            lombok
            ${lombok.version}
            provided
        
    

删除TestMp.java中的内容,方便我们来进行测试。

上面的准备工作做完了,下面我们可以来使用AR进行操作了:

1、AR 插入操作

/**
* AR 插入操作
*/
@Test
public void testARInsert() {
    Employee employee = new Employee();
    employee.setGender(1);
    employee.setLastName("ar_insert");

    boolean b = employee.insert();
    System.out.println(b);
}

注意:AR操作是通过对象本身调用相关方法,AR增强了实体类的功能,比如要insert一个Employee,那就用这个Employee调用insert方法即可。可以看到在上面的代码中并不需要注入mapper接口,不过正如之前所说,不使用但还是要定义,否则会报错。

2、AR 修改操作

/**
* AR 修改操作
*/
@Test
public void testARUpdate() {
    Employee employee = new Employee();
    employee.setId(27);
    employee.setLastName("李老师");
    employee.setGender(2);
    employee.setAge(23);

    boolean r = employee.updateById();
    System.out.println(r);
}

3、AR 查询操作

/**
* AR 查询操作
*/
@Test
public void testARSelect() {
    Employee employee = new Employee();
    // 1、查询操作,直接根据id查询 selectById(id)
    Employee result = employee.selectById(14);
    System.out.println(result);

    // 2、查询操作
    employee.setId(23);
    Employee employee1 = employee.selectById();
    System.out.println(employee1);

    //3、查询操作 selectAll
    List employees = employee.selectAll();
    System.out.println(employees);

    //4、查询操作 selectList
    List employeeList = employee.selectList(
        new QueryWrapper().like("last_name", "M"));
    System.out.println(employeeList);

    //5、统计查询
    Integer count = employee.selectCount(
        new QueryWrapper().like("last_name", "M"));
    System.out.println(count);
}

4、AR 删除操作

/**
 * AR 删除操作
 */
@Test
public void testARDelete() {
    // 1、根据id删除
    Employee employee = new Employee();
    boolean deleteById = employee.deleteById(25);
    System.out.println(deleteById);

    //2、根据id删除
    employee.setId(26);
    boolean delete = employee.deleteById();
    System.out.println(delete);

    //3、wrapper 删除
    boolean delete1 = employee.delete(
            new QueryWrapper().like("last_name", "M"));
    System.out.println(delete1);
}

5、AR 复杂分页操作

/**
* AR 复杂分页操作
*/
@Test
public void testARPage() {
    Employee employee = new Employee();
    IPage page = employee.selectPage(
        new Page<>(1, 2),
        new QueryWrapper().like("email", ".com"));

    System.out.println(page.getRecords());
}

6、完整测试代码

public class TestMp {
    private ApplicationContext ioc = new
            ClassPathXmlApplicationContext("applicationContext.xml");

    private EmployeeMapper employeeMapper = ioc.getBean("employeeMapper", EmployeeMapper.class);

    /**
     * AR 复杂分页操作
     */
    @Test
    public void testARPage() {
        Employee employee = new Employee();
        IPage page = employee.selectPage(
                new Page<>(1, 2),
                new QueryWrapper().like("email", ".com"));

        System.out.println(page.getRecords());
    }

    /**
     * AR 删除操作
     */
    @Test
    public void testARDelete() {
        // 1、根据id删除
        Employee employee = new Employee();
        boolean deleteById = employee.deleteById(25);
        System.out.println(deleteById);

        //2、根据id删除
        employee.setId(26);
        boolean delete = employee.deleteById();
        System.out.println(delete);

        //3、wrapper 删除
        boolean delete1 = employee.delete(
                new QueryWrapper().like("last_name", "M"));
        System.out.println(delete1);
    }

    /**
     * AR 查询操作
     */
    @Test
    public void testARSelect() {
        Employee employee = new Employee();
        // 1、查询操作,直接根据id查询 selectById(id)
        Employee result = employee.selectById(14);
        System.out.println(result);

        // 2、查询操作
        employee.setId(23);
        Employee employee1 = employee.selectById();
        System.out.println(employee1);

        //3、查询操作 selectAll
        List employees = employee.selectAll();
        System.out.println(employees);

        //4、查询操作 selectList
        List employeeList = employee.selectList(
                new QueryWrapper().like("last_name", "M"));
        System.out.println(employeeList);

        //5、统计查询
        Integer count = employee.selectCount(
                new QueryWrapper().like("last_name", "M"));
        System.out.println(count);
    }

    /**
     * AR 修改操作
     */
    @Test
    public void testARUpdate() {
        Employee employee = new Employee();
        employee.setId(27);
        employee.setLastName("李老师");
        employee.setGender(2);
        employee.setAge(23);

        boolean r = employee.updateById();
        System.out.println(r);

    }

    /**
     * AR 插入操作
     */
    @Test
    public void testARInsert() {
        Employee employee = new Employee();
        employee.setGender(1);
        employee.setLastName("ar_insert");

        boolean b = employee.insert();
        System.out.println(b);

    }
}

完成上面的操作后,mp04的代码结构如下所示:

五、ActiveRecord(活动记录)_第1张图片

至此,基于 mybatis-plusActiveRecord(活动记录)演示就完成了,下面我们就可以进入到下一节代码生成器的学习了。

源代码

相关示例完整代码:mybatis-plus-in-action


上一节:四、条件构造器——AbstractWrapper
下一节:六、代码生成器——逆行工程

你可能感兴趣的:(MyBatis-Plus,3.x,Spring,5.x)