mybatisPlus实现ActiveRecord(AR)操作
🍅 Java学习路线:搬砖工的Java学习路线
🍅 作者:程序员小王
🍅 程序员小王的博客:https://www.wolai.com/wnaghengjie/ahNwvAUPG2Hb1Sy7Z8waaF
🍅 扫描主页左侧二维码,加我微信 一起学习、一起进步
🍅 欢迎点赞 👍 收藏 ⭐留言 📝
🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕
一、什么是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);
}