mybatisPlus实现ActiveRecord(AR)操作
一、什么是ActiveRecord?
🍅看mybatisPlus实现ActiveRecord(AR)操作之前,建议先看Mybatis-plus(MP)中CRUD操作保姆级笔记
ActiveRecord翻译:活动记录
每一个数据库表 对应创建一个类 ,类的每一个对象实例 对应于数据库中表的一行记录 ; 通常表的每个字段 在类中都有相应的 Field;
ActiveRecord 负责把自己持久化. 在 ActiveRecord 中封装了对数据库的访问 ,通过对象自己实现 CRUD,实现优雅的数据库操作。
ActiveRecord 也封装了部分业务逻辑 。可以作为业务对象使用。
二、MybatisPlus操作ActiveRecord
1、AR实现CRUD操作的环境准备
(1)创建数据库表
创建员工表
-- 创建员工表 CREATE TABLE dept ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50) DEFAULT NULL, mobile varchar(50) DEFAULT NULL, manager int(11) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 查询 select * from dept; -- 表结构 desc dept;
表结构
(2)dept实体类
mybatisPlus中Model 类中提供了对数据库的CRUD 操作
/** * @author 王恒杰 * @version 1.0 * @Description: * 使用AR,要求实体类需要继承MybatisPlus中的model方法 * Model中提供了对数据库的CRUD 操作 */ public class Dept extends Model<Dept> { /** * 设置表的主键,自增长 */ @TableId(value = "id",type = IdType.AUTO) private Integer id; private String name; private String mobile; private Integer manager;
mybatisPlus中Model类 源码解读版
public abstract class Model<T extends Model<?>> implements Serializable { //实现序列化接口 private static final long serialVersionUID = 1L; //无参构造 public Model() { } //添加 public boolean insert() { } public boolean insertOrUpdate() {} public boolean deleteById(Serializable id) { } public boolean deleteById() { } public boolean updateById() { } public boolean update(Wrapper<T> updateWrapper) {} public List<T> selectAll() {} public T selectById(Serializable id) {} public T selectById() {} public List<T> selectList(Wrapper<T> queryWrapper) {} public T selectOne(Wrapper<T> queryWrapper) {} public <E extends IPage<T>> E selectPage(E page, Wrapper<T> queryWrapper) {} public Integer selectCount(Wrapper<T> queryWrapper) {} protected SqlSession sqlSession() {} protected String sqlStatement(SqlMethod sqlMethod) {} protected String sqlStatement(String sqlMethod) {} protected void closeSqlSession(SqlSession sqlSession) {} }
(3)mapper
mybatisPlus必须通过Mapper扫描到实体,才能找到和表的对应的关系
/** * @author 王恒杰 * @Description: * BaseMapper是不需要使用的,MP需要使用DeptMapper获取到数据库的表信息 * 如果不定义DeptMapper,Mp会报错,找不到表的定义信息 */ public interface DeptMapper extends BaseMapper<Dept> { }
2、AR 之 insert
@RunWith(SpringRunner.class)的作用
Springboot的@RunWith(SpringRunner.class) 注解的意义在于Test测试类要使用注入的类,比如@Autowired注入的类, 有了@RunWith(SpringRunner.class)这些类才能实例化到spring容器中,自动注入才能生效, 不然直接一个NullPointerExecption
测试类
/** * 添加操作 */ @Test public void insertDeptTest(){ Dept dept = new Dept(); dept.setName("市场部"); dept.setMobile("123"); dept.setManager(1); //返回的是boolean值,如果为true为真,如果为false为执行失败 boolean insert = dept.insert(); System.out.println(insert); }
封装的sql语句
INSERT INTO dept ( name, mobile, manager ) VALUES ( ?, ?, ? )
3、AR之删除delete
测试类
/** * 删除操作 */ @Test public void deleteDeptTest(){ Dept dept = new Dept(); dept.setId(1); boolean delete = dept.deleteById(dept); System.out.println(delete); }
封装的SQL语句
DELETE FROM dept WHERE id=?
日志
注意:删除操作即使没从数据库中删除,返回的值也是true
4、AR之操作update
测试类
/** * 更新操作 */ @Test public void updateDeptTest(){ Dept dept = new Dept(); dept.setId(2); dept.setName("技术部"); //null的属性值不做更新处理,在update中没有null字段 boolean update = dept.updateById(); //封装的Sql语句: UPDATE dept SET name=? WHERE id=? System.out.println(update); }
封装的SQL语句
UPDATE dept SET name=? WHERE id=?
5、AR之查询select
测试类
/** * 查询操作 */ @Test public void selectDeptTest(){ Dept dept = new Dept(); dept.setId(2); // SELECT id,name,mobile,manager FROM dept WHERE id=? Dept dept1 = dept.selectById(); System.out.println(dept1); }
封装的SQL语句
SELECT id,name,mobile,manager FROM dept WHERE id=?
日志
没有对应的值,值为null
/** * 查询操作 */ @Test public void selectDeptTest(){ Dept dept = new Dept(); //id为1的值是没有的,已经被删除了 dept.setId(1); // SELECT id,name,mobile,manager FROM dept WHERE id=? Dept dept1 = dept.selectById(); System.out.println(dept1); }