MP实战系列(十一)之封装方法详解(续一)

简介: 之前写的封装方法详解,比较简要。今天我主要讲增加和删除及其修改。查的话得单独再详讲。增删改查,无论是Java或者C#等等,凡是对数据库操作的都离不开这四个。一、增加方法讲解MyBatis Plus很好的将增加的方法进行封装。

之前写的封装方法详解,比较简要。

今天我主要讲增加和删除及其修改。查的话得单独再详讲。

增删改查,无论是Java或者C#等等,凡是对数据库操作的都离不开这四个。

一、增加方法讲解

MyBatis Plus很好的将增加的方法进行封装。

而且它封装的这个比原来的MyBatis要灵活的多。

比如下面代码:

        UserEntity u = new UserEntity();
        u .setLogo(0);
        u .setCreateTime(DateUtils.getDateTime());
        u .setEmail("test@231.com");
        u.setPassword("123456");
        u.setSex("1");
        u.setUsername("test001");

        int line = ud.insert(u);    
        System.out.println(line);             

调用就是对应BaseMapper里面的该方法:

    /**
     * <p>
     * 插入一条记录
     * </p>
     *
     * @param entity 实体对象
     * @return int
     */
    Integer insert(T entity);

 你可以指定需要在数据表中插入的数据。至于主键有四种策略:

主键策略源码:

/**
 * Copyright (c) 2011-2020, hubin (jobob@qq.com).
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.baomidou.mybatisplus.enums;

/**
 * <p>
 * 生成ID类型枚举类
 * </p>
 *
 * @author hubin
 * @Date 2015-11-10
 */
public enum IdType {
    AUTO(0, "数据库ID自增"), INPUT(1, "用户输入ID"),

    /* 以下2种类型、只有当插入对象ID 为空,才自动填充。 */
    ID_WORKER(2, "全局唯一ID"), UUID(3, "全局唯一ID"), NONE(4, "该类型为未设置主键类型");

    /**
     * 主键
     */
    private final int key;

    /**
     * 描述
     */
    private final String desc;

    IdType(final int key, final String desc) {
        this.key = key;
        this.desc = desc;
    }

    /**
     * <p>
     * 主键策略 (默认 ID_WORKER)
     * </p>
     *
     * @param idType ID 策略类型
     * @return
     */
    public static IdType getIdType(int idType) {
        IdType[] its = IdType.values();
        for (IdType it : its) {
            if (it.getKey() == idType) {
                return it;
            }
        }
        return ID_WORKER;
    }

    public int getKey() {
        return this.key;
    }

    public String getDesc() {
        return this.desc;
    }

}

 

这四种简单的说,根据数据表中的主键而定,如果你的主键是int或者tinyint类型,可以使用自增策略,如果是varchar类型可以使用UUID或者自定义以某种方式进行主键生成,通常自定义的话,需要在调用增加方法的时候进行setId(),setId()里面可以填写,也可以调用某个工具类随机生成等。

    UserEntity u = new UserEntity();
        u .setLogo(0);
        u .setCreateTime(DateUtils.getDateTime());
        u .setEmail("test@123.com");
        u.setPassword("123456");
        u.setSex("1");
        u.setUsername("test003");


        int lines = ud.insertAllColumn(u);
        System.out.println(lines);

 

这里的代码和第一段代码基本是一样的除了方法名不一样而已,方法的作用都是增加,MyBatis Plus开发者之所以这样起名,我认为应该是有个区分,方法如其名,insertAllColumn意为插入该表所有数据,如果该表有十列,那么这一条数据也应该包含十个列名,对应Java中,也就是属性名。

 

 

二、修改方法讲解

修改中在实际开发,也应用很多,基本可以说,对于庞大的业务系统而言,数据是不允许删除的,顶多就是改改状态,假性删除。对于数据为王的时代,数据就是经济,数据就是发展。

于是诞生了一个叫大数据的玩意,帮助人们管理数据,然后又诞生了一个职业叫数据分析师,通过分析数据得到某个结论,从而发掘某个市场。

修改的话与增加基本一致,不一致的就是一个在数据表中插入一条数据,而修改,顾名思义,当然是修改对应的数据。

代码如下:

        UserEntity u = new UserEntity();
        u.setUserId(34);
        u .setLogo(0);
        u .setCreateTime(DateUtils.getDateTime());
        u .setEmail("test@123.com");
        u.setPassword("123456");
        u.setSex("2");
        u.setUsername("test003");


        int lines = ud.updateById(u);
        System.out.println(lines);

updateById(),意思是根据主键进行修改

相当于MyBatis这样的一条sql语句:udpate `user` set logo=#{logo} where userId=#{userId}

根据主键进行修改。

如果不指定主键就无法完成修改业务。

源代码如下:

 /**
     * <p>
     * 根据 ID 修改
     * </p>
     *
     * @param entity 实体对象
     * @return int
     */
    Integer updateById(@Param("et") T entity);


updateAllColumnById()意思也是以主键为主,对所有的数据列进行修改,当然了,这里的所有是指符合主键的条件。主键唯一的嘛,当然仅仅就是对该条数据进行修改
        UserEntity u = new UserEntity();
        u.setUserId(34);
        u .setLogo(0);
        u .setCreateTime(DateUtils.getDateTime());
        u .setEmail("test@231.com");
        u.setPassword("123456");
        u.setSex("2");
        u.setUsername("test003");


        int lines = ud.updateAllColumnById(u);
        System.out.println(lines);

源代码如下:

    /**
     * <p>
     * 根据 ID 修改
     * </p>
     *
     * @param entity 实体对象
     * @return int
     */
    Integer updateAllColumnById(@Param("et") T entity);

 

大家或许要问,我不想通过主键来修改数据,我只想传几个对应的参数来修改数据,别担心,MyBatis Plus这个也替你考虑了。

看演示代码:

        UserEntity u = new UserEntity();
        u.setUserId(34);
        u .setLogo(0);
        u .setCreateTime(DateUtils.getDateTime());
        u .setEmail("test@231.com");
        u.setPassword("123456");
        u.setSex("4");
        u.setUsername("test003");
        
        EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("user_id", 34);
        wrapper.eq("email", "test@323.com");

        int lines = ud.update(u, wrapper);
        System.out.println(lines);

 

上述代码本质的sql就是 update 表名 set column=#{data1},column2=#{data2} where user_id=#{userId} and email=#{email}

记住wrapper.eq()对应的参数,一个是数据表中的列名,另外一个就是对应的值。记得一定要填写正确的列名,否则就会修改失败。

对于传统的MyBatis而言,找不到列,会报sql错误等异常信息。而MyBatis Plus就不会报。

这里我提醒一句,还是那句话,单元测试很重要,首先在单元测试,测试通过了,多弄几个常用条件测试,测试都没问题,再进行ui层面的,也就是web开发。

源代码如下:

    /**
     * <p>
     * 根据 whereEntity 条件,更新记录
     * </p>
     *
     * @param entity  实体对象
     * @param wrapper 实体对象封装操作类(可以为 null)
     * @return
     */
    Integer update(@Param("et") T entity, @Param("ew") Wrapper<T> wrapper);

 

这里的Wrapper<T> wrapper非常灵活

只要是wrapper里面有的方法,都可以常用。

比如:

        wrapper.between(column, val1, val2)
        wrapper.groupBy(columns)  //对应sql中分组
        wrapper.eq(column, params) //相当于where条件
        wrapper.in(column, value) //sql中in
        wrapper.notIn(column, value) //sql中 not in
        wrapper.orderBy(columns, isAsc) //排序
        wrapper.exists(value) //相对于sql中exists查询
        wrapper.notExists(value) //相当于sql中not exists查询
        wrapper.notBetween(column, val1, val2) //相当于sql中在某个范围内使用的between
        wrapper.ge(column, params) //大于等于
        wrapper.le(column, params) //小于等于
        wrapper.like(column, value) //模糊查询
        wrapper.having(sqlHaving, params) //条件过滤

上述wrapper都可以用,前提是只要你有这个需求。

 

三、删除方法讲解

虽然之前强调过,删除在实际应用中,用的少,这个少是指需求。关键是看业务。

比如博客方面,博客系统有一个叫回收站的地方,回收站里面都是一些作者删除没用的文章放置处,这个资源对于非盈利性组织而言,回收处的垃圾需要定时清理。

不然的话,数据量大也一定增加会增加服务器压力,数据库也是服务器,名曰:数据服务器。

deleteById() 根据主键进行删除

代码如下:

        int lines = ud.deleteById(34);
        System.out.println(lines);

源码如下:

    /**
     * <p>
     * 根据 ID 删除
     * </p>
     *
     * @param id 主键ID
     * @return int
     */
    Integer deleteById(Serializable id);

 

deleteByMap()方法

源代码如下:

    /**
     * <p>
     * 根据 columnMap 条件,删除记录
     * </p>
     *
     * @param columnMap 表字段 map 对象
     * @return int
     */
    Integer deleteByMap(@Param("cm") Map<String, Object> columnMap);

 

演示代码如下:

        Map<String,Object> map = new HashMap<String,Object>();
        map.put("username", "李四");
        int lines = ud.deleteByMap(map);
        System.out.println(lines);

 

本质相当于 delete from table where username=#{username}

还可以继续增加条件,对于Java代码而言就是增加几个put。

 

delete()方法

源代码如下:

  /**
     * <p>
     * 根据 entity 条件,删除记录
     * </p>
     *
     * @param wrapper 实体对象封装操作类(可以为 null)
     * @return int
     */
    Integer delete(@Param("ew") Wrapper<T> wrapper);

 

演示代码如下:

    EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>();
        wrapper.eq("username", "王麻子");
        wrapper.eq("email", "123@qq.com");
        int lines = ud.delete(wrapper);
        System.out.println(lines);

其实本质上还是它

这个"它"指的是 delete from table where username=#{username} and email=#{email}

只不过put里面的键必须与#{username}一致否则会删除失败,而对于eq而言,对应键必须和数据表中的列名,即column一致,否则删除失败。就无法达到删除数据的目的。

 

deleteBatchIds()

批量删除,在实际中用的也比较多,主要针对无用日志或者对于博客而言,用户删除聊天信息等,通常一个一个删除麻烦,直接批量删除即可。

源码如下:

   /**
     * <p>
     * 删除(根据ID 批量删除)
     * </p>
     *
     * @param idList 主键ID列表
     * @return int
     */
    Integer deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);

 

在这里也得提提动态sql

deleteBatchIds();

本质上代码相当于这个:

<delete id="batchDeleteUser">
        delete from table where column in (
        <foreach collection="idList" item="attribute" separator=",">
            #{id}
        </foreach>
        )  

 </delete>

不过要看清楚了,还是基于主键批量删除。

 

总结:

个人看来,不管怎么样,MyBatis还是基础,只有当MyBatis用的非常熟练,那么对于MyBatis Plus可以融会贯通。

本质上说,MyBatis Plus就是MyBatis。MyBatis Plus的创建者们也一再强调多,MyBatis Plus对于MyBatis而言只做增强不做改变。

所以说,用MyBatis Plus,其实相当于还在用MyBatis,只不过,我们不需要再重复性写大量sql,当然了,这个不写,并不是指什么都不写,而是指像增删改这类的,我们完全可以不用自己写,因为MyBatis Plus,已经将它们都封装好了。而我们只需调用即可。

当然了,对于一些复杂业务,需要多表查的,我们只能通过自己手动编写了。这样也保留了MyBatis的灵活性。

 

目录
相关文章
|
设计模式 前端开发 Java
DTO和VO的区别及使用场景详解
DTO和VO的区别及使用场景详解
8947 1
|
设计模式 前端开发 关系型数据库
【DDD】全网最详细2万字讲解DDD,从理论到实战(代码示例) 3
【DDD】全网最详细2万字讲解DDD,从理论到实战(代码示例)
6460 2
|
Java API 数据库
Spring Boot(16)——使用DataSource
使用DataSource 需要使用DataSource可以在pom.xml中添加spring-boot-starter-jdbc依赖,这会自动加入Spring Jdbc的依赖。还需要加入相应的JDBC驱动包的依赖,笔者这里使用的是MySQL的驱动。
9625 0
|
消息中间件 存储 RocketMQ
Rocketmq如何保证消息不丢失
文章分析了RocketMQ如何通过生产者端的同步发送与重试机制、Broker端的持久化存储与消息重试投递策略、以及消费者端的手动提交ack与幂等性处理,来确保消息在整个传输和消费过程中的不丢失。
|
7月前
|
SQL 人工智能 自然语言处理
Qoder @database功能上线!自动关联数据库 Schema,后端 AI Coding 效率拉满
Qoder是JetBrains平台唯一深度支持“数据库原生感知”的AI编程插件,内置@database能力,可将IDE中的数据库连接直接转化为AI上下文,实现精准SQL生成、架构评审与数据模拟。无需手动复制DDL,解决AI因缺乏表结构导致的“乱写代码”问题,真正闭环数据库开发流程,提升研发效率。
1681 1
|
JavaScript 前端开发 安全
JDK1.8 新特性详解及具体使用方法
本文详细介绍了JDK 1.8的新特性及其组件封装方法,涵盖Lambda表达式、Stream API、接口默认与静态方法、Optional类、日期时间API、方法引用、Nashorn JavaScript引擎及类型注解等内容。通过具体代码示例,展示了如何利用这些特性简化代码、提高开发效率。例如,Lambda表达式可替代匿名内部类,Stream API支持集合的函数式操作,Optional类避免空指针异常,新日期时间API提供更强大的时间处理能力。合理运用这些特性,能够显著提升Java代码的简洁性、可读性和可维护性。
1130 50
|
人工智能 Nacos 开发者
手把手教你搭建MCP服务器
Model Context Protocol(MCP)正成为AI智能体连接外部工具的主流标准。本文详解两种搭建方案,助你构建专属AI工具扩展引擎,实现工具调用的标准化与高效集成。
|
消息中间件 存储 设计模式
RocketMQ原理—5.高可用+高并发+高性能架构
本文主要从高可用架构、高并发架构、高性能架构三个方面来介绍RocketMQ的原理。
3720 21
RocketMQ原理—5.高可用+高并发+高性能架构
|
Java 数据库连接 数据库
mybatis plus 更新值为null的字段
mybatis plus 更新值为null的字段
861 7

热门文章

最新文章