mybatis-plus添加与修改
mybaits-plus帮我们简化了CRUD,这次来说一下添加与修改的操作
由于我们所有的 SQL 是不可见的,我们希望知道他是怎么执行的,所以我们必须要看日志。
在properties中添加日志功能:
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
配置日志完毕之后,后面的学习就需要注意这个自动生成的SQL
插入操作
@Test public void testInsert(){ User user = new User(); user.setName("java2"); user.setAge(31); user.setEmail("[email protected]"); int result = userMapper.insert(user);// 帮我们自动生成 id System.out.println(result); // 受影响的行数 System.out.println(user); // 发现,id会自动回填 }
数据库插入的 id 默认值为:全局的唯一 id
主键生成策略
分布式系统唯一 id 生成
这里主键是通过一个雪花算法进行完成的。
主键自增
我们需要配置主键自增
1.实体类上 @TableId(type= IdType.AUTO)
2.数据库字段一定要是自增的!
3.再次插入即可!
补充:主键自增是一种形式,还可以有其他的形式
NONE(1)
未设置主键INPUT(2)
手动输入主键ID_WORKER(3)
默认的全局唯一 idUUID(4)
全局唯一 id uuidID_WORKER_STR(5)
字符串表示法
更新操作
// 测试更新 @Test public void testUpdate(){ User user = new User(); // 通过条件自动拼接动态 sql user.setId(3L); user.setName("ABCD"); user.setAge(18); // 注意:updateById 但是参数是一个 对象!!! int i = userMapper.updateById(user); System.out.println(i); ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210219161620154.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NzI2MTQz,size_16,color_FFFFFF,t_70#pic_center) }
所有的 SQL 都是自动帮我们动态匹配的
自动填充
我们在数据库表中经常会有这样的情况,数据添加与修改的时候需要被记录,每一次操作都需要有时间,所有我们利用自动填充来完成对时间的修改创建时间,修改时间!这些个操作都要自动完成,不希望手动
这里我们直接用代码级别
给数据库表中添加 create_time、update_time 两个字段
实体类上字段属性需要加上注解TableField(fill = FieldFill.INSERT)
@TableField(fill = FieldFill.INSERT) // 时间特有的注解 private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime;
编写处理器来处理这个时间特有的注解即可
在工程建立 handler 包,创建一个 MyMetaObjectHandler 类
@Slf4j @Component public class MyMetaObjectHandler implements MetaObjectHandler { // 插入时的填充策略 @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill......."); // setFieldValByName(String fieldName, Object fieldVal, MetaObject meatObject) this.setFieldValByName("createTime",new Date(),metaObject); this.setFieldValByName("updateTime",new Date(),metaObject); } // 更新时的填充策略 @Override public void updateFill(MetaObject metaObject) { log.info("start insert fill......."); this.setFieldValByName("updateTime",new Date(),metaObject); } }
最后重新测试插入操作,重新测试更新操作,观察时间是否有所变化
mybatis-plus批量添加
mybatis-plus 当前我用的最新版本
com.baomidou mybatis-plus-boot-starter 3.5.1
找到这里我不用多说了,mybatis-plus源码的批量插入和修改是通过for循环转化为多条的单条SQL循环进行插入和修改,所以该方法是SQL拼接成一条SQL传入数据库
批量插入
package com.guide.common.mybatis.mapper; import java.util.List; /** * @author * @version 1.0 * @date 2022/5/6 10:34 */ public interface SpiceBaseMapper{ /** * 批量插入 * {@link com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn} * * @param entityList 要插入的数据 * @return 成功插入的数据条数 */ int insertBatchSomeColumn(List entityList); }
package com.guide.common.mybatis.mapper; import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.extension.injector.methods.AlwaysUpdateSomeColumnById; import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn; import org.springframework.stereotype.Component; import java.util.List; /** * @author * @version 1.0 * @date 2022/5/6 10:28 */ @Component public class SpiceSqlInjector extends DefaultSqlInjector { /** * 如果只需增加方法,保留mybatis plus自带方法, * 可以先获取super.getMethodList(),再添加add */ @Override public ListgetMethodList(Class> mapperClass) { // 注意:此SQL注入器继承了DefaultSqlInjector(默认注入器),调用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自带方法 List methodList = super.getMethodList(mapperClass); // 注入InsertBatchSomeColumn // 在!t.isLogicDelete()表示不要逻辑删除字段,!"update_time".equals(t.getColumn())表示不要字段名为 update_time 的字段,不对进行操作 // methodList.add(new InsertBatchSomeColumn(t -> !t.isLogicDelete() && !"update_time".equals(t.getColumn()))); // 要逻辑删除 t.isLogicDelete() 默认不要 methodList.add(new InsertBatchSomeColumn(t -> !t.isLogicDelete())); return methodList; } }
记住Java是可以接口多继承的
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。