mybatisplus查询今天的数据_MybatisPlus(CRUD)

插入功能

//测试插入@Testpublic void testInsert(){    User user = new User();    user.setName("ironman");    user.setAge(3);    user.setEmail("123456@qq.com");    System.out.println(user);    System.out.println("======================");    System.out.println(userMapper.insert(user));//会自动生成id,并回填}

1c435a95e5eda25cb2211bcb135bdf9a.png

数据库默认插入的id为:全局的唯一id

主键生成策略

分布式系统唯一id生成:https://www.cnblogs.com/liujianping/p/10401842.html

雪花算法:

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。

主键自增

  1. 实体类字段上添加@TableId(type = IdType.AUTO)

  2. 数据库字段一定得是自增

fdb100c9c32886bc0683b32efb69c760.png

这两个条件缺一不可,否则就会报错

  1. 再次插入实现自增

4b170229d9c27026bc7178bf7f0acc0e.png

其余的源码解释

public enum IdType {    AUTO(0),  //数据库id自增    NONE(1),   //未设置主键    INPUT(2),   //手动输入    ASSIGN_ID(3),      ASSIGN_UUID(4),       /** @deprecated */    @Deprecated    ID_WORKER(3),  //默认的全局唯一id    /** @deprecated */    @Deprecated    ID_WORKER_STR(3),  //ID_WORKER字符串表示法    /** @deprecated */    @Deprecated    UUID(4);   //全局唯一id}

更新操作

    //测试更新    @Test    public void testUpdate(){        User user = new User();        //通过条件自动拼接动态SQL        user.setId(1L);        user.setName("i m ironman");        //  虽然名字是byID,但是实际上参数是一个对象        System.out.println(userMapper.updateById(user));    }

90426f30687364b8a746fc6caa7a207e.png

b9049e4ca836d81081690c3347c5a221.png

所有的SQL都是自动的进行动态设置

自动填充

创建时间,修改时间!这些个操作一般都是自动化完成的,我们不希望手动更新。(gmt_create,gmt_modified)

方式一:数据库级别

  1. 在表中新增字段create_time,update_time

3c19063b9522ec563f8dfb97e9fa5752.png

  1. 再次测试插入方法,先把实体类同步

private Date createTime;private Date updateTime;

e593cad687859e2479822a4cb6885f19.png

方法二:代码级别

  1. 删除数据库的默认值,更新操作

9d071f1077cd8321922dc3dc6ec03225.png

  1. 实体类字段属性上需要增加注释

//字段添加填充内容@TableField(fill = FieldFill.INSERT)private Date createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private Date updateTime;
  1. 编写处理器处理注解

package com.zhang.mybatis_plus.handler;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;import lombok.extern.slf4j.Slf4j;import org.apache.ibatis.reflection.MetaObject;import org.springframework.stereotype.Component;import java.util.Date;import static jdk.nashorn.internal.runtime.regexp.joni.Config.log;@Slf4j@Componentpublic class MyMetaObjectHandler implements MetaObjectHandler {    //插入是的更新策略    @Override    public void insertFill(MetaObject metaObject) {        log.info("start insert .......");        //setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)        this.setFieldValByName("createTime",new Date(),metaObject);        this.setFieldValByName("updateTime",new Date(),metaObject);    }    //更新时的填充策略    @Override    public void updateFill(MetaObject metaObject) {        this.setFieldValByName("updateTime",new Date(),metaObject);    }}
  1. 测试插入

乐观锁

乐观锁:顾名思义,总是十分乐观,总是认为不会出现问题,无论干什么都不去上锁,如果出现了问题,再次更新测试(version ,new version)

悲观锁:顾名思义,总是十分悲观,总是认为会出现问题,无论干什么都会上锁,再去操作。

意图:

当要更新一条记录的时候,希望这条记录没有被别人更新

乐观锁实现方式:

  • 取出记录时,获取当前version

  • 更新时,带上这个version

  • 执行更新时, set version = newVersion where version = oldVersion

  • 如果version不对,就更新失败

乐观锁:1.先查询,获得版本号 version =1  ----线程Aupdate user set name = "ironman",version = version  +  1  where  id  =  2  and  version  =  1  ----线程B抢先完成,这个时候version  =  2,会导致A线线程修改失败update user set name = "ironman",version = version  +  1  where  id  =  2  and  version  =  1

测试MP的乐观锁插件

  1. 数据库增加version字段

90c6210838d446bb7e54e68d55b01b9b.png

  1. 实体类增加对应的字段

@Version //代表乐观锁注解private Integer version;
  1. 注册组件

package com.zhang.mybatis_plus.config;import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;import org.mybatis.spring.annotation.MapperScan;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.transaction.annotation.EnableTransactionManagement;@MapperScan("com.zhang.mybatis_plus.mapper")@EnableTransactionManagement@Configuration //配置类public class MybatisPlusConfig {    //注册乐观锁插件    @Bean    public OptimisticLockerInterceptor optimisticLockerInterceptor(){        return new OptimisticLockerInterceptor();    }}

测试一下

//测试乐观锁成功@Testpublic void testOptimisticLocker(){    //1.查询用户信息    User user = userMapper.selectById(1L);    //2.修改用户信息    user.setName("zhang");    user.setEmail("123456@qq.com");    //3. 执行更新操作    userMapper.updateById(user);}//测试乐观锁失败@Testpublic void testOptimisticLocker2(){    //线程1    //1.查询用户信息    User user = userMapper.selectById(1L);    //2.修改用户信息    user.setName("zhang");    user.setEmail("123456@qq.com");    //线程2    //1.查询用户信息    User user2 = userMapper.selectById(1L);    //2.修改用户信息    user2.setName("zhangxi");    user2.setEmail("123456@qq.com");    //3. 执行更新操作    userMapper.updateById(user2);    userMapper.updateById(user);//如果没有乐观锁,就会覆盖插队线程的值}

f21c7296a6782bfe1e9a91b95512ae19.png

查询操作

//测试查询@Testpublic void testSelectById(){    /*User user = userMapper.selectById(1L);    System.out.println(user);*/    //批量查询    List users = userMapper.selectBatchIds(Arrays.asList(1,2,3));    users.forEach(System.out::println);}//测试条件查询@Testpublic void testSelectById3(){    HashMapmap = new HashMap<>();    //自定义查询    map.put("name","Jack");    List users = userMapper.selectByMap(map);    users.forEach(System.out::println);}

分页查询

  1. 原始的limit分页

  2. pageHelper第三方插件

  3. MP内置的分页插件

步骤:

  1. 配置拦截器组件

    @Bean    public PaginationInterceptor paginationInterceptor() {        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();        // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false        // paginationInterceptor.setOverflow(false);        // 设置最大单页限制数量,默认 500 条,-1 不受限制        // paginationInterceptor.setLimit(500);        // 开启 count 的 join 优化,只针对部分 left join        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));        return paginationInterceptor;    }
  1. 直接使用page对象即可

//测试分页查询@Testpublic void testPage(){    //参数1:当前页    //参数2:页面大小    Page page = new Page<>(1, 5);    userMapper.selectPage(page,null);    page.getRecords().forEach(System.out::println);    System.out.println(page.getTotal());}

删除操作

//测试删除@Testpublic void testDeleteById(){    userMapper.deleteById(1287313900072681476L);}//批量删除@Testpublic void testDeleteBatchId(){    userMapper.deleteBatchIds(Arrays.asList(1287313900072681477L,1287313900072681478L));}//map删除@Testpublic void testDeleteMap(){    HashMapmap = new HashMap<>();    map.put("name","ironman");    userMapper.deleteByMap(map);}

逻辑删除

物理删除:从数据库中直接移除

逻辑删除:在数据库中隐藏,没有被移除,而是通过一个变量来让他失效!deleted =0 ==》 deleted=1

管理员可以查看被删除的记录!防止数据的丢失,类似于回收站!

测试:

  1. 在数据库字段中添加deleted字段

f8c09538e317a9a0355e3eb0f32447da.png

  1. pojo实体类中增加属性

@TableLogic //逻辑删除private Integer deleted;
  1. 配置

//注册bean,从3.1.1后,这一步已经不再需要@Beanpublic ISqlInjector sqlInjector(){  return new LogicSqlInjector();}
mybatis-plus:  global-config:    db-config:      logic-delete-field: flag  # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)      logic-delete-value: 1 # 逻辑已删除值(默认为 1)      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
  1. 测试删除

a9f7a8f0388bd17c820161be742dea2e.png

记录依旧在数据库,但是值已经发生了变化

28d9c7add13d07c1733ec93ca9bf9fd2.png

12d32de9b41b60d30d980475cbfde876.gif


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部