【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。

使用

  1. 添加
        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。

  1. 根据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);
  1. 更新

非常简单

        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就可以了。

  1. 删除

没啥可说的

        User user = new User();
        user.setId(1331923233802158081L);
        boolean updateFlag = user.deleteById();
  1. 更新或者删除

insertOrUpdate()方法。使用和insert方法一样,只是会进行一个判断,如果没有ID就插入,有ID会进行一个查找,找到了就更新,没找到就插入。非常好用。

还有很多方法都在Model里面。大部分都和之前介绍的相似。

原文地址:https://www.cnblogs.com/zllk/p/14044722.html