• 【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里面。大部分都和之前介绍的相似。

  • 相关阅读:
    分布式缓存重建并发冲突和zookeeper分布式锁解决方案
    C# Datatable、DataReader等转化json
    OpenResty部署nginx及nginx+lua
    zookeeper+kafka集群的安装
    缓存数据生产服务的工作流程
    实现缓存与数据库双写一致性保障
    eclipse不提示问题
    Redis 多级缓存架构和数据库与缓存双写不一致问题
    代码这样写更优雅(Python版)
    java string.getBytes(“UTF-8”) javascript equivalent
  • 原文地址:https://www.cnblogs.com/zllk/p/14044722.html
Copyright © 2020-2023  润新知