【Mybatis-Plus学习笔记(六)】ActiveRecord模式
本系列博客其他文章请点击下方链接查看
【Mybatis-Plus学习笔记】目录
AR模式简介
本文简要介绍Active Record 设计模式。Active Record 是一种数据访问设计模式,它可以帮助你实现数据对象Object到关系数据库的映射。
应用Active Record 时,每一个类的实例对象唯一对应一个数据库表的一行(一对一关系)。你只需继承一个abstract Active Record 类就可以使用该设计模式访问数据库,其最大的好处是使用非常简单,事实上,这个设计模式被很多ORM产品使用,例如:Laravel ORM Eloquent, Yii ORM, FuelPHP ORM or Ruby on Rails ORM. 本文将用一个简单的例子阐述Active Record 设计模式是如何工作的(这个例子非常简单,如果要应用的话还有许多工作要做。)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fanhengguang_php/article/details/54964490
简单来说就是一个实体类对应表中的一条数据,对实体类操作就可以实现对数据库的操作。
MP中AR模式的实现
第一步:继承Model
在视频中笔者添加了注解@EqualsAndHashCode(callSuper = false)
,为的是不继承父类的Equals和HashCode方法,但是在最新版的Lombok中是不需要这样做的,因为默认就是false,所以只需要继承就好了。
然后序列化
private static final long serialVersionUID = 1L;
第二步:需要有一个继承BaseMapper并传入实体类作为参数的接口,并且可用。就是之前的UserMapper。
使用
- 添加
User user = new User();
user.setName("王为难");
user.setAge(35);
user.setEmail("wwn@baomidou.com");
user.setManagerId(1088248166370832385L);
user.setCreateTime(new Date());
boolean insertFlag = user.insert();
直接对实体进行操作,等同于以下SQL
''DEBUG==> Preparing: INSERT INTO user ( id, name, age, email, manager_id, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
''DEBUG==> Parameters: 1331923233802158081(Long), 王为难(String), 35(Integer), wwn@baomidou.com(String), 1088248166370832385(Long), 2020-11-26 19:30:19.386(Timestamp)
查看insert源码
public boolean insert() {
SqlSession sqlSession = sqlSession();
try {
return SqlHelper.retBool(sqlSession.insert(sqlStatement(SqlMethod.INSERT_ONE), this));
} finally {
closeSqlSession(sqlSession);
}
}
通过sqlSession.insert来实现插入,SqlHelper.retBool将插入结果封装成ture或false。
- 根据Id查找
有两种方法,第一种参入Id作为参数。如下:
User user = new User();t
user.setId(1094592041087729666L);
System.out.println(selectUser==user);
System.out.println(selectUser);
视频中作者强调查出来的selectUser不是user。因为user在被操作过后赋值给了selectUser,两者内容一样,但是地址不同。
第二种是给User的属性赋值。如下:
User user = new User();
user.setId(1094592041087729666L);
User selectUser = user.selectById();
System.out.println(selectUser==user);
System.out.println(selectUser);
- 更新
非常简单
User user = new User();
user.setId(1331923233802158081L);
user.setName("王不难");
boolean updateFlag = user.updateById();
但是这里有个小问题。如果你们像笔者一样更新,有可能把年龄更新成0。为什么呢?让我们看看sql
''DEBUG==> Preparing: UPDATE user SET name=?, age=? WHERE id=?
''DEBUG==> Parameters: 王不难(String), 0(Integer), 1331923233802158081(Long)
''DEBUG<== Updates: 1
明明没有设置age,为什么被赋值成0了。我们先看看updateById的原理,传入的实体类中的主键会作为where的查询条件,然后实体中不为null的参数会被修改。问题就出现在这里了,让我们看看age的类型——int。int类型有一个默认值就是0,所以在没有传入参数的时候,age就是默认的0,这里我们改成Integer就可以了。
- 删除
没啥可说的
User user = new User();
user.setId(1331923233802158081L);
boolean updateFlag = user.deleteById();
- 更新或者删除
insertOrUpdate()方法。使用和insert方法一样,只是会进行一个判断,如果没有ID就插入,有ID会进行一个查找,找到了就更新,没找到就插入。非常好用。
还有很多方法都在Model里面。大部分都和之前介绍的相似。