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不为16)User 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();}
}