当前位置: 首页 > news >正文

mybatis-plus

1.添加maven依赖
导入springboot整合mybatis的maven

  <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version></dependency>

2,在mapper包中写接口并继承mybatis-plus

@Mapper
public interface UserMapperMB extends BaseMapper<User> {
}

3,测试类使用sql语句
3.1 没使用条件查询

@SpringBootTest
class ItheimaBootApplicationTests {@Autowiredprivate UserMapperMB userMapperMB;@Testvoid query(){//调用查询全部方法List<User> users = userMapperMB.selectList(null);System.out.println(users);}//添加语句@Testvoid add(){User u=new User();u.setPhone("123456789");u.setBalance(new BigDecimal(123));u.setUname("test");int insert = userMapperMB.insert(u);System.out.println(insert);}//修改语句@Testvoid update(){User u=new User();u.setPhone("123456789");u.setBalance(new BigDecimal(123));u.setUname("test");u.setId(404148226);userMapperMB.updateById(u);}//删除语句@Testvoid delete(){userMapperMB.deleteById(374759425);}/*** 分页查询* 使用mybatis-plus的分页查询需注册一个分页拦截器*/@Testvoid page(){
//        设置分页的页码IPage page=new Page(1,2);
//        执行分页查询userMapperMB.selectPage(page,null);
//        获取分页查询的数据System.out.println(page.getRecords());System.out.println("一个多少条"+page.getTotal());System.out.println("一共多少页"+page.getPages());System.out.println("当前页码值"+page.getCurrent());System.out.println("每页显示的条数"+page.getSize());}
}

4.分页拦截器

@Configuration
public class MBConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){
//        添加mybatisplus拦截器MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();//将分页拦截器设置到mybatisplus拦截器中interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}

3.2 条件查询
QueryWrapper 是 MyBatis-Plus 提供的一个用于构建查询条件的类。泛型 指定了这个查询包装器是专门用来构建针对 User 实体类的查询条件的。

 /*** 条件查询 非空判断*/@Testvoid wrapperQuery(){User u=new User();
//        u.setUname("小美");
//        使用lambda表达式添加条件LambdaQueryWrapper <User> wrapper=new LambdaQueryWrapper<>();wrapper.lt(User::getBalance,100); //        查询余额小于100的用户wrapper.like(null!=u.getUname(),User::getUname,u.getUname()); //        查询用户名包含小美的用户(模糊查询) 如果为空不添加条件(为true执行)List<User> users = userMapperMB.selectList(wrapper);System.out.println(users);}

5.查询倒影

   /*** 查询投影*/@Testvoid selectProject(){LambdaQueryWrapper <User> wrapper=new LambdaQueryWrapper<>();wrapper.select(User::getCard_number,User::getBalance,User::getUname); //只查询字段getCard_number和getBalance和getUname 其他字段为空List<User> users = userMapperMB.selectList(wrapper);System.out.println(users);}
/*** 查询出现的次数*/@Testvoid selectCount(){
//        QueryWrapper 是 MyBatis-Plus 提供的一个用于构建查询条件的类。泛型 <User> 指定了这个查询包装器是专门用来构建针对 User 实体类的查询条件的。QueryWrapper <User> wrapper=new QueryWrapper<>();wrapper.select("uname,count(*),phone"); // 查询出现的次数wrapper.groupBy("phone"); // 按照phone分组wrapper.groupBy("uname"); // 按照phone分组List<Map<String, Object>> maps = userMapperMB.selectMaps(wrapper);System.out.println(maps);}
    @Testvoid selectOne(){LambdaQueryWrapper <User> wrapper=new LambdaQueryWrapper<>();wrapper.between(User::getBalance,100,200); // 查询余额在100到200之间的用户List<User> users = userMapperMB.selectList(wrapper);System.out.println(users);}

二,数据库映射兼容
1,当数据库的字段跟实体类的字段不一致的时候 可以使用该注解 跟数据库的字段名保持一致

@TableField(value="pwd")
String password;

2,实体类定义了与数据库表无关的字段,可以使用该字段,让mybais-plus不使用该字段,不能跟value一起使用

@TableField(exist=false)
String pid;

3,当数据库表中有敏感字段时,可设置他不参与查询

@TableField(selete=false)
String password;

4,当实体类的类名跟表名不一致的时候 可使用注解使让实体类类名跟表名一致

@TableName("User")
public class user_01{}

三,id生成策略
1,跟随数据库自增id增加

 @TableId(type = IdType.AUTO)

2,用户自己输入id

 @TableId(type = IdType.INPUT)

3,雪花算法生成id

 @TableId(type = IdType.ASSIGN_ID)

组成:
重复率极低
在这里插入图片描述
可在application.yml配置文件配置全局配置

mybatis-plus:global-config:db-config:id-type: auto //配置全局变量的id自增为跟随数据库自增列自增table-prefix: t_   //在实体类上拼上这个前缀

四,多数据操作(删除和查询)
1,多数据删除

    @Testvoid deleteList(){userMapperMB.deleteBatchIds(Arrays.asList(-1395240958,-1118425087));}

2,多数据查询

        @Testvoid seleteList(){List<User> users = userMapperMB.selectBatchIds(Arrays.asList(6, 7));System.out.println(users);}

五,逻辑删除
所谓逻辑删除不是真正的删除字段 而是添加一个字段(delete_id)来标识是否有删除
1,第一种方式通过注解
在实体类上添加

    @TableLogic(value = "0", delval = "1")private Integer deleteId;

2,第二种方式在application.yml中配置(全局生效)

mybatis-plus:global-config:db-config:logic-delete-field: deleteId  #逻辑删除字段logic-delete-value: 1  #逻辑删除的值logic-not-delete-value: 0  #逻辑删除的值

3,测试类

 @Testvoid deleteLogic(){userMapperMB.deleteById(74);}

通过mybatis_plus方式查询的时候 标识删除列为1的会查询不到
sql语句为

SELECT * FROM `user` where delete_id=0

删除语句

update user set delete_id=1 where id= ? and delete_id=0

五,乐观锁
1,在sql数据库添加字段为version并设置默认值
2,在实体类添加字段为version并添加注解

    @Version //乐观锁private Integer version;

3,添加乐观锁拦截器(在mybatis-plus配置文件中添加)

	@Configurationpublic class MBConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){//        添加mybatisplus拦截器MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();//将分页拦截器设置到mybatisplus拦截器中interceptor.addInnerInterceptor(new PaginationInnerInterceptor());//        乐观锁拦截器 当执行修改语句的时候会自增version字段 使用乐观锁的前提就是要给version字段设置值interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}}

4,测试类
4.1,第一种方式 需要自添加version的值 方便修改version的值和根据version判断是否有人修改过

	 @Testvoid updateVersion(){User user = new User();user.setId(71);
//        传递当前version值user.setVersion(1);user.setUname("张三");userMapperMB.updateById(user);}

4.2,第二种方式 获取user对象之后根据你要修改的字段而set值

     @Testvoid updateVersions() {User user = userMapperMB.selectById(69);user.setUname("王八蛋");//        修改值后会动态的将修改后的值覆给实体类userMapperMB.updateById(user);}

模拟并发执行同一sql语句

    @Testvoid updateVersion(){User user = new User();user.setId(69);
//        传递当前version值user.setVersion(16);user.setUname("张三1");userMapperMB.updateById(user); 修改成功 修改完成之后version值为17 因此下面的修改语句无效(version不为16User user1 = new User();user1.setId(69);
//        传递当前version值user1.setVersion(16);user1.setUname("张三2");userMapperMB.updateById(user1); 修改失败 }

sql语句

UPDATE user SET uname=?, version=version+1 WHERE id=? AND version=? AND delete_id=0

要是version的值为一致时 不会执行修改语句
!!!注意事项

查询后的user修改他的name值并将user对象给到updateById进行修改操作之后会把修改后的值重新赋给user,也就是user可以实时获取到修改后的值

  @Testvoid updateVersions() {User user = userMapperMB.selectById(69);user.setUname("王");System.out.println(user.getVersion());userMapperMB.updateById(user);执行成功 version为17//        修改值后会动态的将修改后的值覆给user对象System.out.println(user.getVersion());userMapperMB.updateById(user);执行成功 version为18}

但是修改后的值也只能赋给所传递给修改语句的user对象 其他对象不可使用到

    @Testvoid updateVersions() {User user = userMapperMB.selectById(69);User user2 = userMapperMB.selectById(69);user.setUname("王1");user2.setUname("王2");userMapperMB.updateById(user); 修改成功 version自增userMapperMB.updateById(user2); 修改失败 version已经自增过了 user2对象获取的是旧的数据}

六,自动代码生成器
使用了mybatis-plus的自动代码生成器

    <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.4.1</version></dependency>
        <dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency>

使用了springboot3版本会不兼容 只能使用springboot2 同时那些所需的数据库等maven也需要导入

package com.lwt.boot.generator;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;public class Generator {public static void main(String[] args) {
//        创建代码生成器对象AutoGenerator autoGenerator = new AutoGenerator();
//        配置数据源DataSourceConfig dataSource = new DataSourceConfig();dataSource.setDriverName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/bank");dataSource.setUsername("root");dataSource.setPassword("123456");
//        将数据源设置到代码生成器中autoGenerator.setDataSource(dataSource);/*设置全局配置*/GlobalConfig globalConfig = new GlobalConfig();
//        设置输出位置globalConfig.setOutputDir(System.getProperty("user.dir")+"/src/main/java");
//        设置是否打开文件资源管理器globalConfig.setOpen(false);
//        设置作者globalConfig.setAuthor("Tian");
//        设置文件是否覆盖原始生成文件globalConfig.setFileOverride(true);
//        设置数据层接口名 %s为占位符为表名的名字加上模块前缀globalConfig.setMapperName("%sMapper");
//        设置id生成策略globalConfig.setIdType(IdType.AUTO);autoGenerator.setGlobalConfig(globalConfig);PackageConfig packageConfig = new PackageConfig();
//        设置包名 也可设置实体类和mapper的包命名packageConfig.setParent("com.lwt.boot");autoGenerator.setPackageInfo(packageConfig);StrategyConfig strategyConfig = new StrategyConfig();
//        设置数据库参与生成代码的表
//        strategyConfig.setTablePrefix("user");
//        指数据库表名的前缀不参与生成strategyConfig.setTablePrefix("t_");
//        设置controller层为ResController风格strategyConfig.setRestControllerStyle(true);
//        设置乐观锁strategyConfig.setVersionFieldName("version");
//        设置逻辑删除strategyConfig.setLogicDeleteFieldName("deleted");
//        设置实体类启动lambokstrategyConfig.setEntityLombokModel(true);autoGenerator.setStrategy(strategyConfig);//        执行代码生成器autoGenerator.execute();}
}

http://www.mrgr.cn/news/63837.html

相关文章:

  • World of Warcraft [CLASSIC][80][the Ulduar] BOSS 01
  • TS指令和Swap指令
  • igmp sock
  • 四、k8s快速入门之Kubernetes资源清单
  • 程序中怎样用最简单方法实现写excel文档
  • 书生实战营第四期-第四关 玩转HF/魔搭/魔乐社区
  • Golang | Leetcode Golang题解之第526题优美的排列
  • QEMU学习之路(4)— Xilinx开源项目systemctlm-cosim-demo安装与使用
  • [运维] 服务器本地网络可用性检查脚本
  • 信息学奥赛一本通 1393:联络员(liaison)
  • OpenEmbedded、yocto和poky是什么关系?
  • 计算机后台服务-更新下载,重启————未来之窗行业应用跨平台架构
  • Object类中的方法
  • *指针引用
  • 双指针习题篇(下)
  • 使用Django Channels实现WebSocket实时通信
  • 数据库作业5
  • yocto是如何收集recipes,如何加入现有的bb文件
  • Java | Leetcode Java题解之第525题连续数组
  • Linux 基础IO
  • Lucene的使用方法与Luke工具(2)
  • 【NOIP普及组】 FBI树
  • ATom:加州理工学院(CIT)化学电离质谱仪(CIMS)测量的气相有机和无机分析物的浓度CIT-CIMS
  • 代码随想录算法训练营第十七天| 654最大二叉树、617合并二叉树、700二叉搜索树中的搜索、98验证二叉搜索树
  • mlp文件夹继续阅读
  • ST IoT Wireless 物联网与无线技术 研讨会