【MyBatis-Plus-In-Action】五、ActiveRecord(活動記錄)
上一節我們學習基於 mybatis-plus
的條件構造器——QueryWrapper,這一節我們來學習一下mybatis-plus
的ActiveRecord(活動記錄)
。
在開始之前,我們先來瞭解一下什麼是ActiveRecord(活動記錄)?
Active Record(活動記錄),是一種領域模型模式,特點是一個模型類對應關係型資料庫中的一個表,而模型類的一個例項對應表中的一行記錄。
ActiveRecord 一直廣受動態語言( PHP 、 Ruby 等)的喜愛,而 Java 作為準靜態語言,對於 ActiveRecord 往往只能感嘆其優雅,所以 MP 也在 AR 道路上進行了一定的探索
那麼我們如何使用AR模式呢?
僅僅需要讓實體類繼承 Model 類且實現主鍵指定方法,即可開啟 AR 之旅 。
下面我們來介紹詳細內容,首先按照快速開始——Spring整合Mybatis-Plus
一節的操作,新建一個mp04
的 Module
,可以將mp02
中的內容全部複製過來,然後進行下面的修改:
修改 Employee
實體類:
/**
* mybatis-plus 預設會使用實體類的小寫類名作為表名
*
* 繼承 Model 類,開啟AR模式
*/
@Data
@ToString
public class Employee extends Model<Employee> {
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
中已經配置了表的字首生成策略
<bean id="dbConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig">
<!-- 全域性表主鍵生成策略 -->
<property name="idType" value="AUTO"></property>
<!-- 全域性的表字首策略配置 -->
<property name="tablePrefix" value="tbl_"></property>
</bean>
複製程式碼
所以,不會出現資料庫表和實體類不匹配的狀況,如果想要使用單獨的表名,可以在實體類上使用@TableName("表名")
註解。
@TableName("tbl_employee")
public class Employee extends Model<Employee>{
// .. fields
// .. getter and setter
@Override
protected Serializable pkVal() {
return this.id;
}
}
複製程式碼
注意
:mapper不用做修改,但是也不能少,雖然AR模式用不到該介面,但一定要定義,否則使用AR時會報空指標異常。
public interface EmployeeMapper extends BaseMapper<Employee> {
}
複製程式碼
修改mp04的pom.xml
檔案:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>mybatis-plus-in-action</artifactId>
<groupId>com.demo.mybatis-plus</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mp04</artifactId>
<dependencies>
<!-- mp 依賴
mybatis-plus 會自動維護mybatis 以及 mybatis-spring相關的依賴
Mybatis 及 Mybatis-Spring 依賴請勿加入專案配置,以免引起版本衝突!!!Mybatis-Plus 會自動幫你維護!
-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<!--junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<!--lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
複製程式碼
刪除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<Employee> employees = employee.selectAll();
System.out.println(employees);
//4、查詢操作 selectList
List<Employee> employeeList = employee.selectList(
new QueryWrapper<Employee>().like("last_name","M"));
System.out.println(employeeList);
//5、統計查詢
Integer count = employee.selectCount(
new QueryWrapper<Employee>().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<Employee>().like("last_name","M"));
System.out.println(delete1);
}
複製程式碼
5、AR 複雜分頁操作
/**
* AR 複雜分頁操作
*/
@Test
public void testARPage() {
Employee employee = new Employee();
IPage<Employee> page = employee.selectPage(
new Page<>(1,2),new QueryWrapper<Employee>().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<Employee> page = employee.selectPage(
new Page<>(1,".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<Employee>().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<Employee> employees = employee.selectAll();
System.out.println(employees);
//4、查詢操作 selectList
List<Employee> employeeList = employee.selectList(
new QueryWrapper<Employee>().like("last_name","M"));
System.out.println(employeeList);
//5、統計查詢
Integer count = employee.selectCount(
new QueryWrapper<Employee>().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的程式碼結構如下所示:
至此,基於 mybatis-plus
的ActiveRecord(活動記錄)
演示就完成了,下面我們就可以進入到下一節程式碼生成器
的學習了。
原始碼
相關示例完整程式碼:mybatis-plus-in-action