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

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

增删改查,无论是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的灵活性。

MP实战系列(十一)之封装方法详解(续一)的更多相关文章

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

    继续MP实战系列(十一)之封装方法详解(续一)这篇文章之后. 此次要讲的是关于查询. 查询是用的比较多的,查询很重要,好的查询,加上索引如鱼得水,不好的查询加再多索引也是无济于事. 1.selectB ...

  2. MP实战系列(五)之封装方法讲解

    mybatis plus封装的方法怎么用?以及它们对应的sql是那些sql?及其什么情况用? 这些需要说下,以下我将会将我常用的说下,不是常用的,可能提以下或者不提. 根据主键查询 UserEntit ...

  3. prometheus学习系列十一: Prometheus exporter详解

    exporter详解 前面的系列中,我们在主机上面安装了node_exporter程序,该程序对外暴露一个用于获取当前监控样本数据的http的访问地址, 这个的一个程序成为exporter,Expor ...

  4. MP实战系列(十四)之分页使用

    MyBatis Plus的分页,有插件式的,也有其自带了,插件需要配置,说麻烦也不是特别麻烦,不过觉得现有的MyBatis Plus足以解决,就懒得配置插件了. MyBatis Plus的资料不算是太 ...

  5. MP实战系列(九)之集成Shiro

    下面示例是在之前的基础上进行的,大家如果有什么不明白的可以参考MP实战系列的前八章 当然,同时也可以参考MyBatis Plus官方教程 建议如果参考如下教程,使用的技术为spring+mybatis ...

  6. MP实战系列(二)之集成swagger

    其实与spring+springmvc+mybatis集成swagger没什么区别,只是之前写的太不好了,所以这次决定详细写. 提到swagger不得不提rest,rest是一种架构风格,里面有对不同 ...

  7. MP实战系列(七)之集成springboot

    springboot是现在比较流行的微服使用的框架,springboot本质上就是将spring+springmvc+mybatis零配置化,基本上springboot的默认配置符合我们的开发.当然有 ...

  8. PHP cURL应用实现模拟登录与采集使用方法详解

    对于做过数据采集的人来说,cURL一定不会陌生.虽然在PHP中有file_get_contents函数可以获取远程链接的数据,但是它的可控制性太差了,对于各种复杂情况的采集情景,file_get_co ...

  9. PHP cURL实现模拟登录与采集使用方法详解教程

    来源:http://www.zjmainstay.cn/php-curl 本文将通过案例,整合浏览器工具与PHP程序,教你如何让数据 唾手可得 . 对于做过数据采集的人来说,cURL一定不会陌生.虽然 ...

随机推荐

  1. 入门angularJs笔记手记一

    angularjs表达式: ng-init ng-bind ng-app ng-model输入域的值绑定到程序 ng-repeat重复一个HTML元素 自定义指令: <script> va ...

  2. 一卡通大冒险(hdu2512)

    一卡通大冒险 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. Vue计算属性的用法

    计算属性是个很好玩的东西,在这里面可以对数据模型进行操作,·也可以使用getter,setter方法.使用的话也是非常的简洁明了 这里写个例子 <!DOCTYPE html> <ht ...

  4. 【代码笔记】iOS-在Block中修改外部变量值的

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...

  5. 【代码笔记】iOS-FMDBDemo

    一,效果图. 二,工程图. 三,代码. ViewController.h #import <UIKit/UIKit.h> #import "FMDatabase.h" ...

  6. (1)H5实现音乐播放器【正在播放-歌词篇】

    近期闲来无事,就想着复习一下前端的东西,然后正好跟朋友搞了一个公共开放的音乐api接口,就想着写一个音乐播放器玩玩! 话不多说,直接上图,然后上代码 [播放器显示正在播放] 实现功能: 1:歌词随着歌 ...

  7. Tracing 在PeopleSoft 程序中怎么开启

    本文介绍一些常用的跟踪方法在Applications,Application Engine,PeopleSoft,Integration Broker,Cobol中. 1.Application En ...

  8. Maven学习(六)maven使用中遇到的坑

    坑1:使用eclipse构建web项目时,pom.xml中 <packaging>war</packaging> 报错 eclipse给出的报错信息提示是:web.xml is ...

  9. springboot 1.3.5升级1.5.9后 默认使用tomcat 8.5版本 get请求报400 异常信息为 The valid characters are defined in RFC 7230 and RFC 3986

    1.springboot 1.3.5升级1.5.9后 默认使用tomcat 8.5版本而之前用的是tomcat7    get请求报400 异常信息为 The valid characters are ...

  10. jQuery EasyUI datagrid列名包含特殊字符会导致表格错位

    首先申明:本文所述的Bug存在于1.3.3以及更高版本中,其它低版本,本人未测试,太老的版本不想去折腾了. 洒家在写前端的SQL执行工具时,表格用了 jQuery EasyUI datagrid,因为 ...