Data Access 之 MyBatis Plus(六)- ActiveRecord

简介: Data Access 之 MyBatis Plus(六)- ActiveRecord

一、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 类中包含了许多查询操作,可以直接通过实例化的模型类对象调用这些方法。

c50a867afbd64465b694b9b32c0875d1_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.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);
    }
}
复制代码

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

636ae4df4d64406f837c2756a825c77a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

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

public interface TeslaMapper extends BaseMapper<Tesla> {
}
复制代码

再次执行 selectById() 方法

154cfc55c52b426faf424e18469b1d29_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.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


相关文章
|
2月前
|
Java 数据库连接 mybatis
Mybatis Plus保存数据返回主键id
Mybatis Plus保存数据返回主键id
110 1
|
2月前
|
Java 关系型数据库 数据库连接
MyBatis Plus 解决大数据量查询慢问题
MyBatis Plus 解决大数据量查询慢问题
|
13天前
|
Java 数据库连接 数据库
Spring Boot集成MyBatis Plus
Spring Boot集成MyBatis Plus
|
13天前
|
SQL Java 数据库连接
Mybatis Plus入门
Mybatis Plus入门
|
2月前
|
SQL Java 数据库连接
Mybatis Plus字段为空值时未更新解决方案
Mybatis Plus字段为空值时未更新解决方案
152 1
|
2月前
|
Java 数据库连接 数据库
Spring Boot整合MyBatis Plus集成多数据源轻松实现数据读写分离
Spring Boot整合MyBatis Plus集成多数据源轻松实现数据读写分离
53 2
|
2月前
|
存储 缓存 Java
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
|
2月前
|
Java 数据库连接 mybatis
mybatis plus字段为null或空字符串把原来的数据也更新了,只需要注解
mybatis plus字段为null或空字符串把原来的数据也更新了,只需要注解
35 0
|
2月前
|
SQL Java 数据库连接
mybatis plus :mybatis简化了jdbc,mybatisplus简化了mybatis
mybatis plus :mybatis简化了jdbc,mybatisplus简化了mybatis
58 0
|
2月前
|
缓存 Java 数据库连接
MyBatis Plus的“幻查” 规范到底要怎样使用哪几个查询函数 为什么会出现幻查?还有幻删为什么会删不掉
MyBatis Plus的“幻查” 规范到底要怎样使用哪几个查询函数 为什么会出现幻查?还有幻删为什么会删不掉