MyBaits_Plus

news2024/11/24 12:45:55

MyBatis_Plus

文章目录

  • MyBatis_Plus
    • 0. 必备知识
    • 1.快速入门
      • 1.1什么是MyBatis_Plus
      • 1.2快速使用
    • 2.配置日志
    • 3.CURD的扩展
      • 3.1Insert
      • 3.2 update
      • 3.3自动填充
      • 3.4乐观锁
      • 3.5delete
    • 4.select
      • 4.1基本查询
      • 4.2分页查询
      • 4.3条件构造器
    • 5.代码自动生成器

0. 必备知识

使用第三方组件一般步骤

  1. 导入对应依赖

  2. 研究依赖如何配置

  3. 代码如何编写

  4. 提高技术扩展能力

对于MyBatis-Plus的学习我们也将按照上面4步进行学习

常见网站

MVN仓库

MyBatisPlus官网

1.快速入门

1.1什么是MyBatis_Plus

  • 简称MP,是一个MyBatis的增强工具,在其基础上只做增强,不做修改
  • 引入MP,就不再需要导入MyBatis了

1.2快速使用

1.添加依赖

  • 父工程的Spring Boot Starter版本2.5+

  • 添加依赖

    • spring-boot-starter
    • spring-boot-starter-test

    这两个如果创建了springboot项目则大概率存在,注意检查是否已经存在

    • mybatis-plus-boot-starter:mybatis plus

    • MySQL Connector/J:数据库驱动

    • Project Lombok:简化java代码,@Data,@NoArgsConstructor,@AllArgsConstructor,生成常见方法

    • mybatis-plus-generator:代码生成器,

    • Spring Boot Starter JDBC

2.安装插件lombok

这是为了让IDEA正确处理Lombok注解

3.配置

首先我们需要了解到,在Springboot项目中,使用.properties.yml配置是等效的,均可以正常识别并使用.

在这里我们使用.properties配置

spring.datasource.username=root
spring.datasource.password=232156

spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  • mybatis_plus ?:对应使用的数据库的名称

  • serverTimezone=Asia/Shanghai:配置时区

  • useUnicode=true&characterEncoding=utf-8:字符编码解码格式

  • MySql5之前的

    • 驱动不同,采用该驱动
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    
    • 不需要时区配置

4.编写代码

  • 编写顺序:pojo-mapper-service-controller

主要设计两个包的代码编写

  • pojo:存放实体类,

    //注解就是利用lombok来自动生成一些方法
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class User {
     private Integer id;
     private String name;
     private Integer age;
     private String email;
    }
    
  • mapper:存放对应使用的接口,在这一步,所有的CURD就已经全部实现完了

    //必须继承BaseMapper类
    @Mapper
    public interface UserMapper extends BaseMapper<User> {
    }
    
  • 在主程序入口添加@MapperScan,来快速扫描mapper

    //括号中填写具体的mapper文件夹路径
    @MapperScan("com.baomidou.mybatisplus.samples.quickstart.mapper")
    
  • 测试

    @SpringBootTest
    class MyBatisPlusApplicationTests {
    	//所有方法都来自父类
    	//也可以编写自己的文件
    	@Autowired
    	private UserMapper userMapper;
    
    	@Test
    	void contextLoads() {
    		//参数是wapper
    		List<User> users=userMapper.selectList(null);
    		System.out.println(users);
    	}
    	}
    

问题思考

  • 谁帮我们编写的SQL:MyBatisPlus
  • 方法哪里来?MyBatis_Plus写好了

2.配置日志

我们所有sql是不可见的,我们希望知道他是怎么执行的,所以必须要看日志

#配置日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

image-20230820164644133

  • 自动生成的id

image-20230820165240641

3.CURD的扩展

3.1Insert

主键生成策略

  • 自增id:实体类配置(对应数据库中的也需要对应的设置)

    @TabledId(type=IdType.AUTO)
        NONE:未设置主键
        INPUT:手动输入,需要我们手动输入
        ID_WORKER:默认全局唯一ID
        UUID:全局唯一id uuid
        ID_WORKER_STRID_WORKER字符串表示法
    
  • UUID

  • Redis生成ID

雪花算法

  • 雪花算法(多用于分布式):snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。

  • 其核心思想是使用41bit作为毫秒数,10bit作为机器ID(5bit数据中心,5bit机器ID),12bit作为毫秒的流水号(每个节点每毫秒产生4096个id),最后一个符号位永远为0.可以保证全球唯一

3.2 update

  • 注意在这里传入的参数实际是一个对象
@Test
	public void testUpdate(){
		User user=new User();
		user.setId(1);
		user.setName("曹操");
		//参数实际是一个对象
		int i=userMapper.updateById(user);
		System.out.println(i);
	}

3.3自动填充

  • 数据库的级别的自动填充

    1. 修改数据库(给对应的字段添加默认值)

    image-20230821164046202

    1. 修改实体类(与数据库同步)

    2. 再次执行更新操作即可

代码级别

  1. 不设置默认值

  2. 实体类字段上增加注解

    @TableField(fill = FieldFill.INSERT)//插入执行,更新不执行
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)//插入更新都执行
    private Date updateTime;
    
  3. 编写处理器处理该注解(放在hadler包中

    @Slf4j//日志
    @Component//丢到springboot里   一定不要忘记把处理器加到Ioc容器中!
    public class MyMetaObjectHandler extends MetaObjectHandler {//extends??
        @Override//插入时的填充策略
        public void insertFill(MetaObject metaObject) {
            log.info("==start insert ······==");
            //setFieldValByName(java.lang.String fieldName, java.lang.Object fieldVal, org.apache.ibatis.reflection.MetaObject metaObject)
           this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); 
            this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); 
        }
        @Override//更新时的填充策略
        public void updateFill(MetaObject metaObject) {
            log.info("==start update ······==");
           this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); 
        }
    }
    
  4. 测试即可

    • 更新
    • 插入

3.4乐观锁

  • 乐观锁:他总是认为不会出现问题,无论做什么都不会去上锁!如果出现问题,就再次更新值测试‘
  • 悲观锁:认为总是出现问题,无论干什么都会上锁
  • 当你跟新一条记录时,希望这条记录没有被别人更新

乐观锁的实现

  1. 取出记录时,获取当前version
  2. 更新时,带上这个version
  3. 执行更新,set version=newVersion where version=oldVersion
  4. 如果version不对则更新失败
  1. 给数据库增加version字段

  2. 实体类增加对应字段即注解

    @Version//乐观锁version注解
    private Integer version;
    
  3. 注册组件:新建文件config.MyBatisPlusConfig文件

    @MapperScan("com.upupstudy.mybatis_plus.mapper")//在主程序入口就可以删除对应的扫描了
    @EnableTransactionManagement//事务管理
    @Configuration//代表这是配置类
    public class MyBatisPlusConfig {
        //注册乐观锁插件
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor() {//拦截器
            MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
            interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());//乐观锁插件
            interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));//分页插件
            return interceptor;
        }
    
    }
    
  4. 测试

3.5delete

  • 物理删除:直接在数据库中删除
  • 新增一个字段:用改值来标记是否被删除(0在1删)
  1. 新增一个deleted字段

  2. 实体类添加对应属性

    @TableLogic//逻辑删除注解
    private Integer deleted;
    
  3. 配置

    #配置逻辑删除  没删除的为0 删除的为1
    mybatis-plus.global-config.db-config.logic-delete-value=1
    mybatis-plus.global-config.db-config.logic-not-delete-value=0
    
  4. 测试

    • 将对应项的deleted值进行更新
    • 但是查询时,无法查询该项
    userMapper.deleteById(1)//看似删除,其实执行的时更新操作
    

4.select

4.1基本查询

  • 单个查询

    @Test//通过id查询单个用户
    public void testSelectById(){
        User user = userMapper.selectById(1);
        System.out.println(user);
    }
    
  • 批量查询

    @Test//通过id查询多个用户
    public void testSelectBatchIds(){
        List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
        users.forEach(System.out::println);
        //System.out.println(users);
    }
    
  • 条件查询

    @Test//通过条件查询之一  map
    public void testMap(){
        HashMap<String, Object> map = new HashMap<>();
        //自定义要查询的条件
        map.put("name","张飞");
        map.put("age",18);
        List<User> users = userMapper.selectByMap(map);
        users.forEach(System.out::println);
    }
    

4.2分页查询

常见的分页方法

  • limit方法
  • pageHelper第三方插件
  • MP内置分页插件
  1. 设置拦截器组件

    @MapperScan("com.upupstudy.mybatis_plus.mapper")
    @EnableTransactionManagement//事务管理
    @Configuration//代表这是配置类
    public class MyBatisPlusConfig {
        //注册乐观锁插件
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor() {//拦截器
            MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
            interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());//乐观锁插件
            //************新增分页插件***************
            interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));//分页插件
            return interceptor;
        }
    
    }
    
  2. 直接使用page对象分页查询

    /*
    *与前端连用,只需要从前端向后传输一个current参数即可
    *
    */
    @Test//测试分页查询
    public void testPage(){
        //参数一current:当前页   参数二size:页面大小
        //使用了分页插件之后,所有的分页操作都变得简单了
        Page<User> page = new Page<>(2,5);
        userMapper.selectPage(page,null);
        page.getRecords().forEach(System.out::println);
        System.out.println("总页数==>"+page.getTotal());
    }
    

4.3条件构造器

  • 具体条件可在官网查看,这里不一一列出
@Test
public void testWrapper1() {
    //参数是一个wrapper ,条件构造器,和刚才的map对比学习!
    //查询name不为空,email不为空,age大于18的用户
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper
        .isNotNull("name")
        .isNotNull("email")
        .ge("age",18);//年龄大于18
    
    
    List<User> userList = userMapper.selectList(wrapper);
    userList.forEach(System.out::println);

5.代码自动生成器

可以快速生成Entity,Mapper,Mapper XML,Service,Controller等各个模块的代码,极大的提高了开发效率

1.导入依赖

  • mybatis-plus-generator
  • Freemarker

2.代码编写:建议放在测试文件夹中

  • 交互生成

    FastAutoGenerator.create(DATA_SOURCE_CONFIG)
        // 全局配置
        .globalConfig((scanner, builder) -> builder.author(scanner.apply("请输入作者名称?")).fileOverride())
        // 包配置
        .packageConfig((scanner, builder) -> builder.parent(scanner.apply("请输入包名?")))
        // 策略配置
        .strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all")))
                            .controllerBuilder().enableRestStyle().enableHyphenStyle()
                            .entityBuilder().enableLombok().addTableFills(
                                    new Column("create_time", FieldFill.INSERT)
                            ).build())
        /*
            模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker
           .templateEngine(new BeetlTemplateEngine())
           .templateEngine(new FreemarkerTemplateEngine())
         */
        .execute();
    
    
    // 处理 all 情况
    protected static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }
    
  • 快速生成

FastAutoGenerator.create("url", "username", "password")//对应到.properites中的sql配置
    .globalConfig(builder -> {
        builder.author("baomidou") // 设置作者
            //建议注释
            .enableSwagger() // 开启 swagger 模式,0
            //建议注释
            .fileOverride() // 覆盖已生成文件,建议注释
            .outputDir("D://"); // java一级目录下,绝对路径
    })
    .dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
        int typeCode = metaInfo.getJdbcType().TYPE_CODE;
        if (typeCode == Types.SMALLINT) {
            // 自定义类型转换
            return DbColumnType.INTEGER;
        }
        return typeRegistry.getColumnType(metaInfo);

    }))
    .packageConfig(builder -> {
        builder.parent("com.baomidou.mybatisplus.samples.generator") // 填写到与主程序同一级目录
            .moduleName("system") // 设置父包模块名,为这个文件夹命名
            .pathInfo(Collections.singletonMap(OutputFile.xml, "D://")); // 设置mapperXml生成路径
    })
    .strategyConfig(builder -> {
        builder.addInclude("t_simple") // 设置需要生成的表名
            .addTablePrefix("t_", "c_"); // 设置过滤表前缀
    })
    .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
    .execute();

配置方法

详细解释

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/910311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[已解决]system: No such file or directory #include <filesystem>

make编译&#xff0c;遇到&#xff1a;system: No such file or directory #include <filesystem> &#xff08;1&#xff09;升级gcc[参考][gcc升级参考1][gcc升级参考2]&#xff1a;gcc7.5 升级为 gcc11.1, 未解决问题&#xff1b; &#xff08;2&#xff09;修改头文…

TienChin 渠道管理-工程创建

因为本文章主要围绕着项目开发进行&#xff0c;所以前言不做开头&#xff0c;直接上内容。 添加字段 我们的渠道表&#xff0c;我看到若依脚手架当中有一个是否删除的标志字段&#xff0c;所以我这里也添加一下&#xff1a; ALTER TABLE tienchin_channelADD COLUMN del_flag c…

使用MySQL:5.6和owncloud镜像搭建个人网盘

拉取镜像 [rootkvm ~]# docker pull mysql:5.6[rootkvm ~]# docker pull owncloud启动mysql容器 [rootkvm ~]# docker run -d --name db1 -e MYSQL_ROOT_PASSWORDroot mysql:5.6 db832e4e4333a0e9a7c152a67272721fdbe5381054090c5eb24f90455390a852 [rootkvm ~]# docker ps …

2、Spring_DI

DI 1.概述 概述&#xff1a;Dependency Injection 依赖注入&#xff0c;给对象设置属性&#xff0c;曾经我们需要自己去创建 mapper 对象&#xff0c;才能调用&#xff0c;现在交给 spring 创建&#xff0c;并且使用 DI 注入&#xff0c;直接拿来用&#xff0c;程序员就可以更…

小说作者分享:如何利用爱校对使我的作品更出彩?

在创作小说的过程中&#xff0c;校对和修改是至关重要的步骤。许多作家已经开始利用“爱校对”这一工具&#xff0c;有效地提高他们作品的质量。本篇文章将通过实际案例&#xff0c;展示一些小说作者是如何成功地利用爱校对来精雕细琢他们的文字&#xff0c;并将作品提升到一个…

数据结构,二叉树,前中后序遍历

二叉树的种类 最优二叉树 最优二叉树画法 排序取最小两个值和&#xff0c;得到新值加入排序重复1&#xff0c;2 前序、中序和后序遍历是树形数据结构&#xff08;如二叉树&#xff09;中常用的遍历方式&#xff0c;用于按照特定顺序遍历树的节点。这些遍历方式在不同应用中有不…

x86 分段机制

本篇只是做个记录,把重要的东西记录一下. 不保证正确x86中的物理地址计算过程 8086 时代的分段机制 这要从8086实模式说起 8086实模式 是基于 分段机制的.该模式下有段寄存器该模式下存在 逻辑地址[a:b] 和 (线性地址) 物理地址 // a 存储在段寄存器中,[a:b] 存储了 逻辑地址…

记一次由于整型参数错误导致的任意文件上传

当时误打误撞发现的&#xff0c;觉得挺奇葩的&#xff0c;记录下 一个正常的图片上传的点&#xff0c;文件类型白名单 但是比较巧的是当时刚对上面的id进行过注入测试&#xff0c;有一些遗留的测试 payload 没删&#xff0c;然后在测试上传的时候就发现.php的后缀可以上传了&a…

PostMan 测试项目是否支持跨域

使用PostMan可以方便快速的进行跨域测试。 只需要在请求头中手动添加一个Origin的标头&#xff0c;声明需要跨域跨到的域&#xff08;IP&#xff1a;端口&#xff09;就行&#xff0c;其余参数PostMan会自动生成。添加此标头后&#xff0c;请求会被做为一条跨域的请求来进行处…

Python编程基础-文件的打开和读取

文件的访问 使用 open() 函数 打开文件 &#xff0c;返回一个 file 对象 使用 file 对象的读 / 写方法对文件进行读 / 写的 操作 使用 file 对象的 close() 方法关闭文件 打开文件 open()方法&#xff0c;需要一个字符串路径&#xff0c;并返回一个文件对象&#xff0c;默认是”…

学习maven工具

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f3e8;maven工具产生的背景&#x1f993;maven简介&#x1fa80;pom.xml文件(project object Model 项目对象模型) &#x1fa82;maven工具安装步骤两个前提&#xff1a;下载 m…

Android基础——英文复习资料

一.填空题 1.An Android project must be bulit before it is run&#xff0c;compiling the java source code(.java flises)into Java bytetcode(.class files)and the into .dex files 2.In Android an activity stores the code for a screen of an app&#xff0c; …

.NET6.0 System.Drawing.Common 通用解决办法

最近有不少小伙伴在升级 .NET 6 时遇到了 System.Drawing.Common 的问题&#xff0c;同时很多库的依赖还都是 System.Drawing.Common &#xff0c;而 .NET 6 默认情况下只在 Windows 上支持使用&#xff0c;Linux 上默认不支持这就导致在 Linux 环境上使用会有问题&#xff0c;…

# 电脑好用的工具推荐

电脑好用的工具推荐 文章目录 电脑好用的工具推荐必装工具浏览器火绒安全卸载工具Geek迅雷 记笔记工具Typora印象笔记 开发工具IntelliJ IDEAVisual Studio CodeDbeaverAnother Redis Desktop Manager 备份工具百度网盘阿里云盘一刻相册蓝奏云 必装工具 浏览器 就别装那些乱七…

vue2.x项目从0到1(七)之用户权限

此章节偏理论知识 对于小一点的项目 比如说角色都是平级的 那我们直接像之前 vue2.x项目从0到1&#xff08;二&#xff09;之后台管理侧边栏&#xff08;动态渲染路由以及高亮&#xff09;_vue动态渲染侧边栏_关忆北_的博客-CSDN博客这样渲染就行了 但是一旦项目大了 …

Reids 的整合 Spring Data Redis使用

大家好 , 我是苏麟 , 今天带来强大的Redis . REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统&#xff0c;是跨平台的非关系型数据库。 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选…

如何使用CSS实现一个拖拽排序效果?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 实现拖拽排序效果的CSS和JavaScript示例⭐ HTML 结构⭐ CSS 样式 (styles.css)⭐ JavaScript 代码 (script.js)⭐ 实现说明⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦…

【HCIP】02.MSTP

运行RSTP/STP&#xff0c;局域网内所有的VLAN共享一棵生成树&#xff0c;被阻塞后的链路将不承载任何流量&#xff0c;无法在VLAN间实现数据流量的负载均衡&#xff0c;导致链路带宽利用率、设备资源利用率较低。802.1S,MSTP兼容STP和RSTP&#xff0c;通过建立多棵无环路的树&a…

论文及代码详解——HRNet

文章目录 论文详解 &#xff08;High-Resolution Networks&#xff09;Parallel Multi-Resolution ConvolutionsRepeated Multi-Resolution FusionsRepresentation Head 代码详解 论文&#xff1a;《Deep High-Resolution Representation Learning for Visual Recognition》 代…

MySQL报错:Incorrect integer value: ‘None‘ for column ‘managerId‘ at row 1

错误如下&#xff1a; 今天在建表的时候突然报错 上网查询了原因&#xff0c;把None改成NULL就行了。 5以上的版本如果是空值应该要写NULL&#xff0c;这种问题一般mysql 5.x上出现。 改完后就运行正常了