当前位置:   article > 正文

springboot整合mybatis-plus_springboot整合mybatisplus

springboot整合mybatisplus

目录

写在前面

一、环境准备:

1.1、导入依赖

1.2、yaml配置和mybatis的配置文件一致

1.3、IUser实体类

1.4、UserMapper

二、使用

测试须知

2.1、基础增删改查

2.2、批量操作

2.3、查询条件构造器【QueryWrapper】使用

2.4、修改条件构【UpdateWrapper】造器使用

三、减少硬编码

四、代码生成器


写在前面

        mybatis-plus顾名思义就是mybatis的增强工具。对于mybatis的功能只做扩展、不做改变。体现在内置的Mapper对CRUD进行了封装、只需要通过简单的配置即可实现增删改查操作。而不用编写XML和SQL。

前置的项目搭建和数据库表:

传送门:

使用IDEA新建一个springboot项目

springboot整合mybatis

一、环境准备:

1.1、导入依赖

        将springboot 整合mybatis的依赖替换为整合mybatis-plus的起步依赖;

  1. <dependency>
  2. <groupId>com.baomidou</groupId>
  3. <artifactId>mybatis-plus-boot-starter</artifactId>
  4. <version>3.4.0</version>
  5. </dependency>

IDEA按照一个插件Maven Helper可以查看是否有依赖冲突。

1.2、修改配置文件

端口、数据库、mybatis-plus日志输出、驼峰映射、xml位置等 

  1. server:
  2. port: 8889
  3. spring:
  4. datasource:
  5. url: jdbc:mysql://localhost:3308/boot_mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&AllowPublicKeyRetrieval=True
  6. username: root
  7. password: root
  8. mybatis-plus:
  9. mapper-locations: mapper/*.xml
  10. configuration:
  11. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  12. map-underscore-to-camel-case: true
  13. type-aliases-package: com.example.demo.entity

1.3、IUser实体类

绑定表名、主键名

  1. @Data
  2. @TableName("t_user")
  3. public class IUser {
  4. /**
  5. * 指定主键名、主键生产策略
  6. */
  7. @TableId(value = "u_id", type = IdType.AUTO)
  8. private Integer uId;
  9. /**
  10. *指定列名,若一致可以不用指定
  11. */
  12. @TableField("user_name")
  13. private String userName;
  14. private String email;
  15. private String passWord;
  16. private Date birth;
  17. private int gender;
  18. }

1.4、UserMapper

       只要继承BaseMapper<~>即可、其他方法和xml可以删掉。

  1. @Mapper
  2. public interface IUserMapper extends BaseMapper<IUser> {}

IUserMapper继承BaseMapper<~>后就可以不用编写XML来实现了

二、使用

测试须知

本文直接在测试类中注入IUserMapper、编写测试方法进行测试。service层、controller层就不写了

  1. @Autowired
  2. private IUserMapper userMapper;

可以看到,自己并没有新建方法,而userMapper可以调用BaseMapper提供的众多方法。

可以看到BaseMapper提供的方法需要的参数有字符串、实体类、map、条件构造器等。下文将使用一些用例来测试这些方法。为了增加观感、只展示如何使用、执行结果、SQL日志就不截图占用篇幅了。

2.1、基础增删改查

        2.1.1 新增一条User数据

  1. @Test
  2. public void insert(){
  3. IUser user = new IUser();
  4. user.setUserName("韩信");
  5. user.setPassWord("123");
  6. user.setEmail("123@qin.com");
  7. userMapper.insert(user);
  8. }

        2.1.2 根据条件删除User

根据ID删除

  1. @Test
  2. public void deleteById(){
  3. userMapper.deleteById(84);
  4. }

根据某列精准匹配删除

  1. @Test
  2. public void deleteByMap(){
  3. Map<String, Object> map = new HashMap<>();
  4. map.put("user_name","韩信");
  5. userMapper.deleteByMap(map);
  6. }

        2.1.3 修改数据User信息

根据ID修改

  1. @Test
  2. public void updateById(){
  3. IUser user = new IUser();
  4. user.setUserName("李白");
  5. user.setUId(81);
  6. userMapper.updateById(user);
  7. }

        2.1.3 根据条件查询用户

查询全部用户

  1. @Test
  2. public void selectList(){
  3. userMapper.selectList(null);
  4. }

根据ID查询

  1. @Test
  2. public void selectById(){
  3. userMapper.selectById(81);
  4. }

 根据某列精确匹配

  1. @Test
  2. public void selectByMap(){
  3. Map<String, Object> map = new HashMap<>();
  4. map.put("user_name","李白");
  5. userMapper.selectByMap(map);
  6. }

2.2、批量操作

        2.2.1 批量新增

  1. @Test
  2. public void batchUpdate(){
  3. IUser user1 = new IUser();
  4. IUser user2 = new IUser();
  5. IUser user3 = new IUser();
  6. user1.setUserName("彭于晏");
  7. user2.setUserName("吴彦祖");
  8. user3.setUserName("胡歌");
  9. user1.setPassWord("123");
  10. user2.setPassWord("123");
  11. user3.setPassWord("123");
  12. ArrayList<IUser> userList = new ArrayList<>();
  13. userList.add(user1);
  14. userList.add(user2);
  15. userList.add(user3);
  16. userList.forEach(user -> {
  17. userMapper.insert(user);
  18. });
  19. }

        2.2.2 批量删除

  1. @Test
  2. public void deleteBatchIds(){
  3. List<Integer> ids = new ArrayList<>();
  4. ids.add(85);
  5. ids.add(86);
  6. ids.add(87);
  7. ids.add(89);
  8. userMapper.deleteBatchIds(ids);
  9. }

        2.2.3 批量查询

根据ids

  1. @Test
  2. public void selectBatchIds(){
  3. List<Integer> ids = new ArrayList<>();
  4. ids.add(85);
  5. ids.add(86);
  6. ids.add(87);
  7. ids.add(89);
  8. userMapper.selectBatchIds(ids);
  9. }

2.3、查询条件构造器【QueryWrapper】使用

       条件构造器就是通过链式编程的形式构造where后面的SQL

可选项有

 比如:查询user_name="李白" and email like "123" 的用户

  1. @Test
  2. public void selectListByQueryWrapper(){
  3. QueryWrapper<IUser> queryWrapper = new QueryWrapper<>();
  4. queryWrapper.eq("user_name","李白")
  5. .like("email","123");
  6. userMapper.selectList(queryWrapper);
  7. }

  比如:查询user_name="李白" and pass_word like "123" 的用户

  1. @Test
  2. public void selectMapsByQueryWrapper(){
  3. QueryWrapper<IUser> queryWrapper = new QueryWrapper<>();
  4. queryWrapper.eq("user_name","李白")
  5. .like("pass_word","123");
  6. userMapper.selectMaps(queryWrapper);
  7. }

但是存在许多硬编码

2.4、修改条件构【UpdateWrapper】造器使用

也是通过链式编程的方式拼接修改条件;

比如,将用户名为张三的密码修改为456@qq.cpm

  1. @Test
  2. public void updateByUpdateWrapper(){
  3. UpdateWrapper<IUser> updateWrapper = new UpdateWrapper<>();
  4. IUser user = new IUser();
  5. updateWrapper.eq("user_name","张三")
  6. .set("email","456@qq.cpm");
  7. userMapper.update(user,updateWrapper);
  8. }

也是存在字段的硬编码

以上可否已经感觉到了mybatis-plus的强大之处?可还记得实体类做了数据库字段和实体属性的映射。那用使用条件构造器和修改构造器的时候还要再确认数据库字段是否显得字段映射有点多余?

开个玩笑,修改一个构造器就可以减少硬编码了。

三、减少硬编码

【LambdaQueryWrapper】来减少硬编码、直接通过类获取属性的方式得到字段

比如查询姓"张"的所有用户

  1. @Test
  2. public void updateByLambdaQueryWrapper(){
  3. LambdaQueryWrapper<IUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  4. lambdaQueryWrapper.like(IUser::getUserName,"张");
  5. userMapper.selectList(lambdaQueryWrapper);
  6. }

【LambdaUpdateWrapper】减少硬编码

将张三的邮箱修改为45679@qq.com

  1. @Test
  2. public void updateByLambdaUpdateWrapper(){
  3. LambdaUpdateWrapper<IUser> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
  4. IUser user = new IUser();
  5. lambdaUpdateWrapper.eq(IUser::getUserName,"张三")
  6. .set(IUser::getEmail,"45679@qq.cpm");
  7. userMapper.update(user,lambdaUpdateWrapper);
  8. }

上述就是springboot整合mybatis-plus的大部分内容了。

四、代码生成器

任何重复、有结构的数据都可以用代码生成。这里的代码生成器是指通过表名一键生成项目的目录结构、实体类、xxx.xml等。

 准备一个springboot空项目:

 准备一张数据库表:

  1. CREATE TABLE `t_user` (
  2. `u_id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
  3. `user_name` varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '用户登录名',
  4. `email` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '邮箱',
  5. `pass_word` varchar(30) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL COMMENT '密码',
  6. `birth` date DEFAULT NULL COMMENT '生日',
  7. `start_date` date DEFAULT NULL COMMENT '注册时间',
  8. `update_date` date DEFAULT NULL COMMENT '最后修改时间',
  9. `gender` bigint NOT NULL DEFAULT '2' COMMENT '性别,0:男,1:女,2:保密',
  10. `is_action` int DEFAULT NULL COMMENT '逻辑删除字段',
  11. `version` int DEFAULT NULL COMMENT '乐观锁配置',
  12. PRIMARY KEY (`u_id`) USING BTREE
  13. ) ENGINE=InnoDB AUTO_INCREMENT=88 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;

引入依赖:mybatis-plus的版本不一样配置也有所不同

  1. <!--数据库驱动-->
  2. <dependency>
  3. <groupId>mysql</groupId>
  4. <artifactId>mysql-connector-java</artifactId>
  5. </dependency>
  6. <!-- MP 起步依赖-->
  7. <dependency>
  8. <groupId>com.baomidou</groupId>
  9. <artifactId>mybatis-plus-boot-starter</artifactId>
  10. <version>3.4.0</version>
  11. </dependency>
  12. <!-- 模板引擎 -->
  13. <dependency>
  14. <groupId>org.apache.velocity</groupId>
  15. <artifactId>velocity-engine-core</artifactId>
  16. <version>2.0</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>com.baomidou</groupId>
  20. <artifactId>mybatis-plus-generator</artifactId>
  21. <version>3.4.0</version>
  22. <!-- <scope>test</scope> -->
  23. </dependency>

yml

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://localhost:3308/generate?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&AllowPublicKeyRetrieval=True
  4. username: root
  5. password: root
  6. driver-class-name: com.mysql.cj.jdbc.Driver

测试工具类

  1. /**
  2. * @author Alex
  3. */
  4. public class GeneratorUtils {
  5. public static void main(String[] args) {
  6. autoGenerator();
  7. }
  8. public static void autoGenerator() {
  9. AutoGenerator autoGenerator = new AutoGenerator();
  10. autoGenerator.setDataSource(getDataSourceConfig());
  11. autoGenerator.setGlobalConfig(getGlobalConfig());
  12. autoGenerator.setPackageInfo(getPackageInfo());
  13. autoGenerator.setStrategy(getStrategyConfig());
  14. autoGenerator.execute();
  15. }
  16. /**
  17. * 设置数据源
  18. * @return
  19. */
  20. public static DataSourceConfig getDataSourceConfig(){
  21. DataSourceConfig dsc = new DataSourceConfig();
  22. dsc.setUrl("jdbc:mysql://localhost:3308/generate?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&AllowPublicKeyRetrieval=True");
  23. dsc.setSchemaName("public");
  24. dsc.setDriverName("com.mysql.cj.jdbc.Driver");
  25. dsc.setUsername("root");
  26. dsc.setPassword("root");
  27. dsc.setDbType(DbType.MYSQL);
  28. return dsc;
  29. }
  30. /**
  31. * 设置全局配置
  32. * @return
  33. */
  34. public static GlobalConfig getGlobalConfig(){
  35. GlobalConfig gc = new GlobalConfig();
  36. String path = System.getProperty("user.dir");
  37. gc.setOutputDir(path+"/src/main/java");//参数是一个目录,所以需要获取当前系统目录
  38. gc.setAuthor("Alex");
  39. gc.setOpen(true);//是否打开资源管理器
  40. gc.setFileOverride(true);//是否覆盖已经生成的
  41. gc.setServiceName("%sService");//去service的I前缀
  42. gc.setIdType(IdType.INPUT);// id生成策略
  43. gc.setDateType(DateType.ONLY_DATE);
  44. return gc;
  45. }
  46. /**
  47. *包配置
  48. * @return
  49. */
  50. public static PackageConfig getPackageInfo(){
  51. PackageConfig pc = new PackageConfig();
  52. pc.setModuleName("common");
  53. pc.setParent("com.example.demo");
  54. pc.setEntity("entity");
  55. pc.setMapper("mapper");
  56. pc.setService("service");
  57. pc.setController("controller");
  58. return pc;
  59. }
  60. /**
  61. * 策略配置
  62. * @return
  63. */
  64. public static StrategyConfig getStrategyConfig(){
  65. StrategyConfig strategy = new StrategyConfig();
  66. strategy.setNaming(NamingStrategy.underline_to_camel);// 下划线转驼峰命名
  67. strategy.setColumnNaming(NamingStrategy.underline_to_camel);
  68. // 设置映射的表名,多张表
  69. strategy.setInclude("t_user");
  70. strategy.setEntityLombokModel(true);// 是否启用lombok开启注解
  71. strategy.setLogicDeleteFieldName("isAction");//设置逻辑删除字段
  72. // 时间自动填充配置
  73. TableFill startDate = new TableFill("startDate", FieldFill.INSERT);
  74. TableFill updateDate = new TableFill("updateDate", FieldFill.UPDATE);
  75. ArrayList<TableFill> list = new ArrayList<>();
  76. list.add(startDate);
  77. list.add(updateDate);
  78. strategy.setTableFillList(list);
  79. // 乐观锁配置
  80. strategy.setVersionFieldName("version");
  81. // rustful 格式
  82. strategy.setRestControllerStyle(true);
  83. return strategy;
  84. }
  85. }

生成目录:生成common模块的项目项目结构

调整:

  • 移动下xxxMapper.xml的位置,并在xxxxMapper的接口上加上@Mapper注解
  • 启动类上添加:@MapperScan("com.example.demo.mapper")

测试使用:

新增一个用户:

  1. @Autowired
  2. private TUserMapper userMapper;
  3. @Test
  4. public void insert(){
  5. TUser user = new TUser();
  6. user.setUserName("王维");
  7. user.setPassWord("qwe@qwe");
  8. userMapper.insert(user);
  9. }

结果:

补充:由于配置的参数都可以是固定的、需要手动改变的只有数据库的表名。因此将将其打包成工具、连接数据库后指定下表名。即可生成结构相同的目录结构、具体需要什么是什么目录根据实际情况而定。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/665645
推荐阅读
相关标签
  

闽ICP备14008679号