MyBatis Plus | 08 - ActiveRecord

2,026 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

一、ActiveRecord

ActiveRecord 是 ORM 的一种实现方式,在 Ruby 和 PHP 中使用较多,ActiveRecord 的特点是模型类的一个实例化对象对应数据库表中的一行记录。

MyBatis Plus 框架中也实现了 ActiveRecord。

使用 IDEA 创建一个新的 Maven 项目 mybatis-plus-ar,相关依赖可以参考前面工程中的依赖。新建 entity 包并新增 Tesla 实体类,在 MyBatis 中使用 ActiveRecord 要将实体类继承 Model 类并重写 pkVal() 方法返回模型类的主键。

@Data
@TableName(value = "t_tesla")
public class Tesla extends Model<Tesla>{

    @TableId(type = IdType.AUTO)
    private Integer id;
    @TableField(value = "name")
    private String vehicleName;
    @TableField(value = "price")
    private Double vehiclePrice;
    private String vehicleType;
    private String factory;

    @Override
    public Serializable pkVal() {
        return id;
    }
}

其他如数据库连接配置、MyBatis Plus 配置以及日志配置等都可以参考前面的工程。

二、ActiveRecord 的 CRUD 操作

ActiveRecord 的特点是模型类的实例化对象对应表中的一行记录,所以 ActiveRecord 的操作方式是通过实例化对象调用方法进行增删改查操作。

ActiveRecord 的查询操作

Model 类中包含了许多查询操作,可以直接通过实例化的模型类对象调用这些方法。

image.png

新建一个测试类 TeslaTest,增加测试方法 selectById ()

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:application.xml")
public class TeslaTest {

    // 基于实体类本身进行操作
    @Test
    public void selectById(){
        Tesla tesla = new Tesla();

        Tesla selectTesla = tesla.selectById(1166057520);
        System.out.println("查询到的数据为:\n" + selectTesla);
    }
}

执行上述代码,输出结果如下: image.png

出现该报错的原因是没有 Mapper 接口,虽然操作数据库用到的是实体类对象,但是仍然需要 Mapper 接口,新建 mapper 包,增加 TeslaMapper 接口继承 BaseMapper

public interface TeslaMapper extends BaseMapper<Tesla> {
}

再次执行 selectById() 方法

image.png

控制台中输出了查询到的数据,使用 id 查询时也可以将 id 设置到对象中。

测试类中新增 selectAll 方法,测试 Model 类中的 selectAll 方法

@Test
public void selectAll(){
    Tesla tesla = new Tesla();

    List<Tesla> teslaList = tesla.selectAll();
    System.out.println("查询到的数据为:\n" + teslaList);
}

执行上述方法,输出结果如下:

image.png

selectList 方法可以根据条件进行查询,返回符合条件的数据

@Test
public void selectList(){
    Tesla tesla = new Tesla();
    QueryWrapper queryWrapper = new QueryWrapper();
    queryWrapper.gt("price",300000.00);
    List<Tesla> teslaList = tesla.selectList(queryWrapper);
    System.out.println("查询到的数据为:\n" + teslaList);
}

执行上述代码,输出结果如下:

image.png

selectCount 方法可以返回符合条件的记录的数量

@Test
public void selectCount(){
    Tesla tesla = new Tesla();
    QueryWrapper queryWrapper = new QueryWrapper();
    queryWrapper.eq("price",300000.00);
    long count = tesla.selectCount(queryWrapper);
    System.out.println("符合条件的记录数为:\n" + count);
}

执行上述代码,输出结果如下:

image.png

ActiveRecord 插入操作

测试类中新增测试方法 insert

// 基于实体类本身进行操作
@Test
public void insert(){
    Tesla tesla = new Tesla();
    tesla.setVehicleName("Solar City 太阳能电池");
    tesla.setFactory("纽约超级工厂");
    tesla.setVehicleType("SUV");
    tesla.setVehiclePrice(80000.00);

    boolean insert = tesla.insert();
    System.out.println("插入成功?" + insert);
}

执行上述代码,输出结果如下:

image.png

查看数据库表中的记录

image.png

ActiveRecord 更新操作

在 TeslaTest 中新增 update 方法

@Test
public void update(){
    Tesla tesla = new Tesla();
    tesla.setId(1166057565);
    tesla.setVehicleName("Solar City 太阳能电池");
    tesla.setFactory("纽约州水牛城特斯拉超级工厂");
    tesla.setVehicleType("电池");
    tesla.setVehiclePrice(80000.00);

    boolean insert = tesla.updateById();
    System.out.println("更新成功?" + insert);
}

执行上述代码,输出结果如下:

image.png

ActiveRecord 删除操作

在 TeslaTest 中新增 deleteById 方法

@Test
public void deleteById(){
    Tesla tesla = new Tesla();
    boolean delete = tesla.deleteById(1166057566);
    System.out.println("删除成功?" + delete);
}

执行上述代码,输出结果如下:

image.png

要删除的 id 也可以设置在实例化对象中。

ActiveRecord 分页查询操作

在 TeslaTest 中新增 分页查询方法 selectPage

@Test
public void selectPage(){
    Tesla tesla = new Tesla();
    QueryWrapper queryWrapper = new QueryWrapper();
    queryWrapper.lt("price", 1000000.00);
    Page<Tesla> teslaPage = tesla.selectPage(new Page<>(1,5),queryWrapper);
    System.out.println("分页查询到的记录总数为:" + teslaPage.getSize());
}

执行上述代码,输出结果如下:

image.png