一、ActiveRecord活动记录
活动记录是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。
二、AR基本CRUD
需要让实体类继承Model
类
public class Employee extends Model<Employee>
子类继承了父类的增删改查的方法
插入操作
@Test
public void testARInsert(){
Employee employee = new Employee();
employee.setLastName("zhangsan");
employee.setEmail("zhang@qq.com");
employee.setGender(1);
employee.setAge(33);
boolean result = employee.insert();
System.out.println("result:" + result);
}
打印日志:
修改操作
updateById
通过id
值修改
@Test
public void testARUpdateById(){
Employee employee = new Employee();
employee.setId(17);
employee.setLastName("lisi");
employee.setAge(11);
boolean result = employee.updateById();
System.out.println("result:" + result);
}
打印日志:
带条件的update
@Test
public void testARUpdateById(){
Employee employee = new Employee();
employee.setLastName("lisi111");
employee.setAge(111);
boolean result = employee.update(new QueryWrapper<Employee>()
.eq("last_name","lisi")
.eq("age",11)
);
System.out.println("result:" + result);
}
打印日志:
查询操作
selectById
方法
@Test
public void testARSelectById(){
Employee employee = new Employee();
employee.setId(17);
Employee employee1 = employee.selectById();
System.out.println(employee1);
}
打印日志:
selectOne
带查询条件
@Test
public void testARSelectOne(){
Employee employee = new Employee();
Employee selectOne = employee.selectOne(new QueryWrapper<Employee>()
.eq("last_name", "Tom")
);
System.out.println(selectOne);
}
打印日志:
selectList
带条件查询,返回集合
@Test
public void testARSelectList(){
Employee employee = new Employee();
List<Employee> employees = employee.selectList(new QueryWrapper<Employee>()
.eq("last_name", "mpTestInsert")
);
for (Employee emp : employees){
System.out.println(emp);
}
}
打印日志:
selectAll
返回全部
@Test
public void testARSelectAll(){
Employee employee = new Employee();
List<Employee> employees = employee.selectAll();
for (Employee emp : employees){
System.out.println(emp);
}
}
打印日志:
selectCount
返回符合查询条件的记录数
@Test
public void testARSelectCount(){
Employee employee = new Employee();
Integer selectCount = employee.selectCount(new QueryWrapper<Employee>()
.eq("last_name", "mpTestInsert")
);
System.out.println("Count:" + selectCount);
}
打印日志:
selectPage
返回符合查询条件的分页对象
@Test
public void testARSelectPage(){
Employee employee = new Employee();
Page<Employee> employeePage = employee.selectPage(new Page<Employee>(1, 2), new QueryWrapper<Employee>()
.eq("last_name", "mpTestInsert")
);
Object[] records = employeePage.getRecords().toArray();
int start = (int) ((employeePage.getCurrent() - 1) * employeePage.getSize());
int end = (int) (start + employeePage.getSize());
for (int i = start; i < end; i++){
System.out.println(records[i]);
}
}
打印日志:
分页查询并没有使用limit
关键字,实际上MyBatisPlus还是使用的MyBatis实现的内存分页,而并不是物理分页,实现物理分页可以借用PageHelper插件。
删除操作
deleteById
方法
@Test
public void testARDeleteById(){
Employee employee = new Employee();
employee.setId(17);
boolean result = employee.deleteById();
System.out.println("result:" + result);
}
打印日志:
delete
删除符合查询条件的记录
@Test
public void testARDelete(){
Employee employee = new Employee();
boolean result = employee.delete(new QueryWrapper<Employee>()
.eq("last_name","张老师")
);
System.out.println("result:" + result);
}
打印日志:
三、底层原理
AR的增删改查都是子类调用父类Model里面实现的方法,父类有sqlSession
属性,通过sqlSession
进而调用MyBatis接口实现类封装好实现方法
例如selectAll()
public List<T> selectAll() {
SqlSession sqlSession = this.sqlSession();
List var2;
try {
var2 = sqlSession.selectList(this.sqlStatement(SqlMethod.SELECT_LIST));
} finally {
this.closeSqlSession(sqlSession);
}
return var2;
}
@Override
public <E> List<E> selectList(String statement) {
return this.selectList(statement, null);
}
@Override
public <E> List<E> selectList(String statement, Object parameter) {
return this.selectList(statement, parameter, RowBounds.DEFAULT);
}
@Override
public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
try {
MappedStatement ms = configuration.getMappedStatement(statement);
return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error querying database. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}
}