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

MyBatisPlus

1、引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions>
</dependency><!--mybatis-plus-->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.5</version>
</dependency><!--mysql-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency><!--lombok用来简化实体类-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>

2、编写代码

@SpringBootApplication
@MapperScan("com.achang.mybatisplus.mapper")
public class MybatisPlusApplication {
......
}

entity

@Data
public class User {private Long id;private String name;private Integer age;private String email;
}

mapper

@Repository
public interface UserMapper extends BaseMapper<User> {
}

test

@SpringBootTest
class MybatisPlusApplicationTests {@Autowiredprivate UserMapper userMapper;@Testvoid testSelectList(){System.out.println(("----- selectAll method test ------"));//UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper//所以不填写就是无任何条件List<User> list = userMapper.selectList(null);list.forEach(System.out::println);}}

insert

        int result = userMapper.insert(user);

update

        int result = userMapper.updateById(user);

select

        User user = userMapper.selectById(1);

        List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));

        List<User> users = userMapper.selectByMap(map);

delete

        int result = userMapper.deleteById(1364080977348956166L);

        int result = userMapper.deleteBatchIds(Arrays.asList(8, 9, 10));

        int result = userMapper.deleteByMap(map);

主键策略

MyBatis-Plus默认的主键策略是: ID_WORKER 全局唯一 ID

主键自增注解 

        @TableId(type = IdType.AUTO)

        private Long id;

#全局设置主键生成策略 mybatis-plus.global-config.db-config.id-type=auto

自动填充字段

添加datetime类型的新的字段 create_time、update_time

实体上添加注解

        @TableField(fill = FieldFill.INSERT)

        private Date createTime;

        @TableField(fill = FieldFill.INSERT_UPDATE)

        private Date updateTime;

实现元对象处理器接口MetaObjectHandler

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {private static final Logger LOGGER = LoggerFactory.getLogger(MyMetaObjectHandler.class);//使用mp实现添加操作,这个方法执行@Overridepublic void insertFill(MetaObject metaObject) {LOGGER.info("start insert fill。。。");this.setFieldValByName("createTime", new Date(), metaObject);this.setFieldValByName("updateTime", new Date(), metaObject);}//使用mp实现修改操作,这个方法执行@Overridepublic void updateFill(MetaObject metaObject) {LOGGER.info("start update fill ....");this.setFieldValByName("updateTime", new Date(), metaObject);}
}

乐观锁

数据库中添加version字段

实体类添加version字段

        @Version

        @TableField(fill = FieldFill.INSERT)

        private Integer Version;

元对象处理器接口添加version的insert默认值

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {//使用mp实现添加操作,这个方法执行@Overridepublic void insertFill(MetaObject metaObject) {...this.setFieldValByName("version",1,metaObject);}}

在 MybatisPlusConfig 中注册 Bean,使用乐观锁插件

@EnableTransactionManagement
@Configuration
@MapperScan("com.achang.mybatisplus.mapper")
public class MybatisPlusConfig {//乐观锁插件@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();}
}

测试乐观锁

 @Testvoid testOptimisticLocker(){//查询User user = userMapper.selectById(1364080977348956166L);//修改数据user.setName("Helen Yao");user.setEmail("helen@qq.com");//执行更新userMapper.updateById(user);}@Testpublic void testOptimisticLockerFail() {//查询User user = userMapper.selectById(1L);//修改数据user.setName("Helen Yao1");user.setEmail("helen@qq.com1");//模拟取出数据后,数据库中version实际数据比取出的值大,即已被其它线程修改并更新了versionuser.setVersion(user.getVersion() - 1);//执行更新userMapper.updateById(user);}

分页

创建配置类

//分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();
}

测试selectPage分页

//分页查询
@Test
void testPage(){//1、创建page对象//传入参数:当前页 和 每页显示记录数Page<User> userPage = new Page<>(1,3);//调用mp分页查询方法//调用mp分页查询过程中,底层会封装,把所有分页数据分装到page对象中userMapper.selectPage(userPage,null);//通过page对象获取数据userPage.getRecords().forEach(System.out::println);//遍历查询的分页数据System.out.println(userPage.getCurrent());//获取当前页System.out.println(userPage.getSize());//每页显示记录数System.out.println(userPage.getTotal());//总记录数System.out.println(userPage.getPages());//总页数System.out.println(userPage.hasNext());//判断是否有下一页System.out.println(userPage.hasPrevious());//判断是否有上一页
}

测试selectMapsPage分页

//测试selectMapsPage分页:结果集是Map
@Test
void testSelectMapsPage(){//1、创建page对象//传入参数:当前页 和 每页显示记录数Page<User> page = new Page<>(1,3);//调用mp分页查询方法//调用mp分页查询过程中,底层会封装,把所有分页数据分装到page对象中IPage<Map<String, Object>> mapIPage = userMapper.selectMapsPage(page, null);//注意:此行必须使用 mapIPage 获取记录列表,否则会有数据类型转换错误mapIPage.getRecords().forEach(System.out::println);System.out.println(page.getCurrent());System.out.println(page.getPages());System.out.println(page.getSize());System.out.println(page.getTotal());System.out.println(page.hasNext());System.out.println(page.hasPrevious());
}

逻辑删除

数据库中添加 deleted字段

实体类添加deleted 字段

        @TableLogic

        @TableField(fill = FieldFill.INSERT)

        private Integer deleted;

元对象处理器接口添加deleted的insert默认值

@Override
public void insertFill(MetaObject metaObject) {
......
this.setFieldValByName("deleted", 0, metaObject);
}

application.properties 加入配置,指定删除为1,没删为0,此为默认值

        mybatis-plus.global-config.db-config.logic-delete-value=1

        mybatis-plus.global-config.db-config.logic-not-delete-value=0

在 MybatisPlusConfig 中注册 Bean

@Bean
public ISqlInjector sqlInjector() {return new LogicSqlInjector();
}

性能分析拦截器

开发环境使用,超过指定时间,停止运行。

在 MybatisPlusConfig 中配置

//性能分析插件
/*** SQL 执行性能分析插件* 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长*/
@Bean
@Profile({"dev","test"})// 设置 dev test 环境开启
public PerformanceInterceptor performanceInterceptor() {PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();performanceInterceptor.setMaxTime(100);//ms,超过此处设置的ms则sql不执行performanceInterceptor.setFormat(true);//SQL是否格式化,默认falsereturn performanceInterceptor;
}

Spring Boot 中设置dev环境

#环境设置:dev、test、prod

        spring.profiles.active=dev

条件构造器 wapper

1、ge、gt、le、lt、isNull、isNotNull

@Test
public void testDelete() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper
.isNull("name")
.ge("age", 12)
.isNotNull("email");
int result = userMapper.delete(queryWrapper);
System.out.println("delete return count = " + result);
}

UPDATE user SET deleted=1 WHERE deleted=0 AND name IS NULL AND age >= ? AND email IS NOT NULL

2、eq、ne

@Test
public void testSelectOne() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.eq("name", "Tom");User user = userMapper.selectOne(queryWrapper);System.out.println(user);
}

SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name = ?

3、between、notBetween

@Test
public void testSelectCount() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.between("age", 20, 30);Integer count = userMapper.selectCount(queryWrapper);System.out.println(count);
}

SELECT COUNT(1) FROM user WHERE deleted=0 AND age BETWEEN ? AND ?

4、allEq

@Test
public void testSelectList() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();Map<String, Object> map = new HashMap<>();map.put("id", 2);map.put("name", "Jack");map.put("age", 20);queryWrapper.allEq(map);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name = ? AND id = ? AND age = ?

5、like、notLike、likeLeft、likeRight

@Test
public void testSelectMaps() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.notLike("name", "e").likeRight("email", "t");List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);//返回值是Map列表maps.forEach(System.out::println);
}

SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND name NOT LIKE ? AND email LIKE ?

6、in、notIn、inSql、notinSql、exists、notExists

@Test
public void testSelectObjs() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();//queryWrapper.in("id", 1, 2, 3);queryWrapper.inSql("id", "select id from user where id < 3");List<Object> objects = userMapper.selectObjs(queryWrapper);//返回值是Object列表objects.forEach(System.out::println);
}

SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 AND id IN (select id from user where id < 3)

7、or、and

@Test
public void testUpdate1() {//修改值User user = new User();user.setAge(99);user.setName("Andy");//修改条件UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();userUpdateWrapper.like("name", "h").or().between("age", 20, 30);int result = userMapper.update(user, userUpdateWrapper);System.out.println(result);
}

UPDATE user SET name=?, age=?, update_time=? WHERE deleted=0 AND name LIKE ? OR age BETWEEN ? AND ?   

8、嵌套or、嵌套and

@Test
public void testUpdate2() {//修改值User user = new User();user.setAge(99);user.setName("Andy");//修改条件UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();userUpdateWrapper.like("name", "h").or(i -> i.eq("name", "李白").ne("age", 20));int result = userMapper.update(user, userUpdateWrapper);System.out.println(result);
}

UPDATE user SET name=?, age=?, update_time=? WHERE deleted=0 AND name LIKE ? OR ( name = ? AND age <> ? )

9、orderBy、orderByDesc、orderByAsc

@Test
public void testSelectListOrderBy() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.orderByDesc("id");List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 ORDER BY id DESC

10、last    //只能调用一次,多次调用以最后一次为准 有sql注入的风险

@Test
public void testSelectListLast() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.last("limit 1");List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0 limit 1

11、指定要查询的列

@Test
public void testSelectListColumn() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.select("id", "name", "age");List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

SELECT id,name,age FROM user WHERE deleted=0

12、set、setSql

@Test
public void testUpdateSet() {//修改值User user = new User();user.setAge(99);//修改条件UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();userUpdateWrapper.like("name", "h").set("name", "老李头")//除了可以查询还可以使用set设置修改的字段.setSql(" email = '123@qq.com'");//可以有子查询int result = userMapper.update(user, userUpdateWrapper);
}

UPDATE user SET age=?, update_time=?, name=?, email = '123@qq.com' WHERE deleted=0 AND name LIKE ?


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

相关文章:

  • 京准电钟:NTP网络校时服务器应用计算机大数据
  • AVL树的概念与实现
  • java 在同一包下无法跨文件引入自己写的类,也无法导包过去
  • FreeRTOS基于汇编语言理解堆的概念,栈的概念(函数调用,局部变量,FreeRTOS如何使用栈)
  • JAVA课设-图书指引系统(前后端分离)
  • 【机器学习】VQ-VAE(Vector Quantized Variational Autoencoder)
  • 【算法】将单向链表按某值分成左边小、中间相等、右边大的形式
  • 在各大媒体报纸上刊登自己的文章用什么投稿方法发表快?
  • RDK X5 目标跟踪核心代码Deepsort
  • Flux.concat 使用说明书
  • 注塑机机械手升降传送机程序
  • 现代大数据架构Kappa
  • 【Java】—JavaBean转换方法详解
  • 数据结构练习题4(链表)
  • 网络空间安全之一个WH的超前沿全栈技术深入学习之路(二:渗透测试行业术语扫盲)作者——LJS
  • 单位评职称需要在指定媒体上投稿发表文章看我如何轻松应对
  • CGAL概述
  • 缓冲区类QBuffer
  • python-库
  • 【OD】【E卷】【真题】【100分】光伏场地建设规划(PythonJavajavaScriptC++C)
  • Chapter 2 - 7. Understanding Congestion in Fibre Channel Fabrics
  • mysql数据量分库分表
  • SOCKET与底层TCP协议的关系
  • 数据库产品中传输中的数据加密(Encryption in Transit)方法简介
  • 2061:【例1.2】梯形面积
  • STM32—FLASH闪存