MP实战系列(十一)之封装方法详解(续一)
之前写的封装方法详解,比较简要。
今天我主要讲增加和删除及其修改。查的话得单独再详讲。
增删改查,无论是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实战系列(十一)之封装方法详解(续一)的更多相关文章
- MP实战系列(十二)之封装方法详解(续二)
继续MP实战系列(十一)之封装方法详解(续一)这篇文章之后. 此次要讲的是关于查询. 查询是用的比较多的,查询很重要,好的查询,加上索引如鱼得水,不好的查询加再多索引也是无济于事. 1.selectB ...
- MP实战系列(五)之封装方法讲解
mybatis plus封装的方法怎么用?以及它们对应的sql是那些sql?及其什么情况用? 这些需要说下,以下我将会将我常用的说下,不是常用的,可能提以下或者不提. 根据主键查询 UserEntit ...
- prometheus学习系列十一: Prometheus exporter详解
exporter详解 前面的系列中,我们在主机上面安装了node_exporter程序,该程序对外暴露一个用于获取当前监控样本数据的http的访问地址, 这个的一个程序成为exporter,Expor ...
- MP实战系列(十四)之分页使用
MyBatis Plus的分页,有插件式的,也有其自带了,插件需要配置,说麻烦也不是特别麻烦,不过觉得现有的MyBatis Plus足以解决,就懒得配置插件了. MyBatis Plus的资料不算是太 ...
- MP实战系列(九)之集成Shiro
下面示例是在之前的基础上进行的,大家如果有什么不明白的可以参考MP实战系列的前八章 当然,同时也可以参考MyBatis Plus官方教程 建议如果参考如下教程,使用的技术为spring+mybatis ...
- MP实战系列(二)之集成swagger
其实与spring+springmvc+mybatis集成swagger没什么区别,只是之前写的太不好了,所以这次决定详细写. 提到swagger不得不提rest,rest是一种架构风格,里面有对不同 ...
- MP实战系列(七)之集成springboot
springboot是现在比较流行的微服使用的框架,springboot本质上就是将spring+springmvc+mybatis零配置化,基本上springboot的默认配置符合我们的开发.当然有 ...
- PHP cURL应用实现模拟登录与采集使用方法详解
对于做过数据采集的人来说,cURL一定不会陌生.虽然在PHP中有file_get_contents函数可以获取远程链接的数据,但是它的可控制性太差了,对于各种复杂情况的采集情景,file_get_co ...
- PHP cURL实现模拟登录与采集使用方法详解教程
来源:http://www.zjmainstay.cn/php-curl 本文将通过案例,整合浏览器工具与PHP程序,教你如何让数据 唾手可得 . 对于做过数据采集的人来说,cURL一定不会陌生.虽然 ...
随机推荐
- 二叉搜索树(hdu3791)
二叉搜索树 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- 【Mybatis】XML配置实现增删改查
①创建数据库和表,数据库为mytest,表为users CREATE DATABASE mytest; USE mytest; DROP TABLE IF EXISTS users; CREATE T ...
- Hbuilder Webview调试+逍遥安卓模拟器
软件版本: HBuilder : 9.0.2.201803061935 逍遥安卓:5.2.2 webview相当于一个浏览器的tab,通过在webview中修改,模拟器端会实时刷新效果.从而达到调试手 ...
- Linux中编译安装软件的基本流程
1. 准备软件包源文件 从互联网下载相应的软件包(以 .tar.gz 或 .tar.bz2 为后缀),将tarball文件解压到/usr/local/src目录下,并切换到软件包目录下 : 2. ./ ...
- TCP 回顾
报文 状态 从wiki上搬运过来 重要参数 RTT(Round Trip Time) 即链路传输延时,从数据发送到达对端并受到对端ack的一次来回时间.由于TCP是依赖报文确认机制来实现传输的可靠性的 ...
- linux服务器SSH破解预防方法
1.linux服务器通过配置 /etc/hosts.deny 禁止对方IP通过SSH登录我的服务器 vim /etc/hosts.deny 2.不用SSH服务的默认端口22,重新设置一个新端口,最好设 ...
- Javascript 随机数函数 学习之二:产生服从正态分布随机数
一.为什么需要服从正态分布的随机函数 一般我们经常使用的随机数函数 Math.random() 产生的是服从均匀分布的随机数,能够模拟等概率出现的情况,例如 扔一个骰子,1到6点的概率应该相等,但现实 ...
- 【读书笔记】iOS-网络-应用间通信
一,URL方案 URL方案有3个主要用途:根据设备上其他应用的存在与否调整逻辑,切换到其他应用以及响应打开你的应用的其他应用.你还可以通过URL方案从某个站点或是在基于Web的认证流程结束是打开应用. ...
- Django使用多个数据库
一.定义数据库 使用Django的多个数据库的第一步是告诉Django将使用的数据库服务器. 这是使用DATABASES设置完成的. 此设置将数据库别名映射到该特定连接的设置字典,该数据库别名是一种在 ...
- Python 基于python实现的http接口自动化测试框架(含源码)
基于python实现的http+json协议接口自动化测试框架(含源码) by:授客 QQ:1033553122 欢迎加入软件性能测试交流 QQ群:7156436 由于篇幅问题,采用百度网 ...