美文网首页
Springboot整合mybatis-Plus(注解版)

Springboot整合mybatis-Plus(注解版)

作者: 顶级蜗牛 | 来源:发表于2020-08-13 15:52 被阅读0次

    环境:

    开发工具:idea
    Java version: 1.8.0

    新建工程:

    新建一个maven工程 新建maven工程

    先看看我的工程结构吧,列出了几个用到的类和配置文件


    工程结构

    我们需要导入什么包呢?看看pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.myspringboot</groupId>
      <artifactId>collection</artifactId>
      <version>1.0-SNAPSHOT</version>
      <name>collection</name>
      <!-- FIXME change it to the project's website -->
      <url>http://www.example.com</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <mybatis-plus.version>3.1.1</mybatis-plus.version>
      </properties>
      
      <!-- spring-boot -->
      <parent>
         <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
      </parent>
    
      <dependencies>
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    
        <!-- springboot开发工具 -->
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
        </dependency>
    
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
    
        <!-- mybatisPlus插件 -->
        <dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>mybatis-plus-boot-starter</artifactId>
          <version>${mybatis-plus.version}</version>
        </dependency>
    
        <!--阿里 Druid Spring Boot Starter依赖-->
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid-spring-boot-starter</artifactId>
          <version>1.1.18</version>
        </dependency>
    
        <!-- 分页 -->
        <dependency>
          <groupId>com.github.pagehelper</groupId>
          <artifactId>pagehelper</artifactId>
          <version>5.1.6</version>
        </dependency>
        <dependency>
          <groupId>com.github.pagehelper</groupId>
          <artifactId>pagehelper-spring-boot-starter</artifactId>
          <version>1.2.13</version>
        </dependency>
    
        <!-- 实体类 -->
        <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.8</version>
          <scope>provided</scope>
        </dependency>
    
        <!-- mysql数据库驱动 -->
        <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <version>8.0.16</version>
          <scope>runtime</scope>
        </dependency>
    
        <!--阿里 FastJson依赖-->
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>1.2.58</version>
        </dependency>
    
        <dependency>
          <groupId>com.fasterxml.jackson.datatype</groupId>
          <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>
    
        <!-- 打印 -->
        <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.17</version>
        </dependency>
    
      </dependencies>
    
      <build>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
          <plugins>
            <plugin>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
            <plugin>
              <artifactId>maven-clean-plugin</artifactId>
              <version>3.1.0</version>
            </plugin>
            <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
            <plugin>
              <artifactId>maven-resources-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.8.0</version>
            </plugin>
            <plugin>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>2.22.1</version>
            </plugin>
            <plugin>
              <artifactId>maven-jar-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-install-plugin</artifactId>
              <version>2.5.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-deploy-plugin</artifactId>
              <version>2.8.2</version>
            </plugin>
            <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
            <plugin>
              <artifactId>maven-site-plugin</artifactId>
              <version>3.7.1</version>
            </plugin>
            <plugin>
              <artifactId>maven-project-info-reports-plugin</artifactId>
              <version>3.0.0</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    
    </project>
    

    log4j.properties的配置:

    # Global logging configuration, 建议开发环境中要用DEBUG,生产环境设置成info或error
    log4j.rootLogger=DEBUG, stdout
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
    
    log4j.logger.Java.sql.Connection=DEBUG
    log4j.logger.java.sql.Statement=DEBUG
    log4j.logger.java.sql.PreparedStatement=DEBUG
    

    application.yml的配置:

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/mybatisPlus?characterEncoding=utf-8
        username: root
        password: 930614
    
    # Mybatis配置
    mybatis-plus:
      # 如果是放在src/main/java目录下 classpath:/com/yourpackage/*/mapper/*Mapper.xml
      # 如果是放在resource目录 classpath:/mapper/*Mapper.xml
      # 我们这里使用注解的方式:这句话可以注释掉:
      # mapper-locations: classpath:/mapper/**/*Mapper.xml
    
      #实体扫描,多个package用逗号或者分号分隔
      type-aliases-package: com.myspringboot.model
      #枚举扫描,多个package用逗号或者分号分隔
      type-enums-package: com.myspringboot.enums
      
      global-config:  #全局配置mybatis
        db-config:
          #主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
          id-type: id_worker
          #字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
          field-strategy: not_empty
          #逻辑删除配置(下面3个配置)
          #逻辑删除全局值
          logic-delete-value: 1
          #逻辑未删除全局值
          logic-not-delete-value: 0
          # sql-injector: com.baomidou.mybatisplus.extension.injector.LogicSqlInjector
          #自定义填充策略接口实现
          #meta-object-handler: com.baomidou.springboot.MyMetaObjectHandler
      configuration:
        #配置返回数据库(column下划线命名&&返回java实体是驼峰命名),自动匹配无需as(没开启这个,SQL需要写as: select user_id as userId)
        map-underscore-to-camel-case: true
        cache-enabled: false
        #当查询数据为空时字段返回为null,不加这个查询数据为空时,字段将被隐藏
        call-setters-on-nulls: true
    
    #pagehelper
    pagehelper:
      helperDialect: mysql
      reasonable: true
      supportMethodsArguments: true
      params: count=countSql
      returnPageInfo: check
    

    关于mybatis的一些插件配置,还有扫描mapper接口实体我们放在一个MybatisPlusConfig配置类里做,并且将其加入到spring容器中,更方便维护。
    MybatisPlusConfig配置类内容

    package com.myspringboot.config;
    
    import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
    import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
    import com.myspringboot.commos.interceptor.MyInterceptor;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @MapperScan("com.myspringboot.dao") // 设置mapper接口的扫描包,会自动生成实例
    public class MybatisPlusConfig {
        /**
         * 配置mybatis拦截器(插件)
         */
        @Bean
        public MyInterceptor myInterceptor() {
            return new MyInterceptor();
        }
    
        /**
         * 配置乐观锁:当更新一条记录时,希望这条记录没有被别人更新
         *  实现方式: 1.取出记录时,获取当前的version 2.更新时,带上这个version 3.执行更新时,set version = newVersion where version = oldVersion
         *           4.若version不对,就更新失败
         *  仅支持:updateById()、update(entity wrapper)  注意这个wrapper不能复用!
         */
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor() {
            return new OptimisticLockerInterceptor();
        }
    
    
        // 分页插件(我们这里使用了pagehelper插件,所以没用mybatis自带插件)
    //    @Bean
    //    public PaginationInterceptor paginationInterceptor(){
    //        return new PaginationInterceptor();
    //    }
    }
    
    

    提及了一个MyInterceptor拦截器

    MyInterceptor

    我这里做简单的注释使用吧,不是今天的主菜。

    package com.myspringboot.commos.interceptor;
    
    import org.apache.ibatis.executor.Executor;
    import org.apache.ibatis.mapping.MappedStatement;
    import org.apache.ibatis.plugin.*;
    
    import java.util.Properties;
    
    /**
     * 配置mybatis拦截器,可以拦截mybatis的API,下面举例update
     * Mybatis允许使用插件拦截得方法调用包括:
     *  1.执行器的方法       Executor(update, query, flushStatements, commit, rollback, getTransaction)
     *  2.参数的处理        ParameterHandler(getParameterObject, setParameters)
     *  3.结果集的处理      ResultSetHandler(handleResultSets, handleOutputParameters)
     *  4.sql语法构建的处理 StatementHandler(prepare, parameterize, batch, update, query)
     */
    @Intercepts({
            @Signature(type = Executor.class, // 拦截执行器
                       method = "update", // 执行器中的update方法
                       args = {MappedStatement.class, Object.class})
    })
    public class MyInterceptor implements Interceptor {
    
        @Override
        public Object intercept(Invocation invocation) throws Throwable {
            // 拦截方法,具体业务编写的位置 - 这只有update操作才会拦截,因为上面注解已经限制了
            System.out.println("111111");
            return invocation.proceed();
        }
    
        @Override
        public Object plugin(Object target) {
            // 创建target对象的代理对象,目的是将当前拦截器加入到该对象中
            return Plugin.wrap(target, this); // 意思对target对象进行包装
        }
    
        @Override
        public void setProperties(Properties properties) {
            // 设置属性
        }
    }
    

    看看我们数据库的表结构

    表结构 随意插入了几条数据吧: 表数据

    接下来就是我们的MVC层的内容了:
    实体类User

    package com.myspringboot.model;
    
    
    import com.baomidou.mybatisplus.annotation.*;
    import com.baomidou.mybatisplus.extension.activerecord.Model;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @TableName("tb_user") // mybatis-plus 映射表名 默认是类名小写user,可以配置前缀
    public class User extends Model<User> { //ActiveRecord功能: extends Model<User>
        // 指定生成ID类型枚举类, 若在springboot配置文件上添加了全局主键生成策略,则不需要在这里写了
        @TableId(value = "id", type = IdType.AUTO)
        private Long id;
    
        private String userName;
    
        // 不想在查询的时候被查询出来时设置这个select
        // fill是在插入或更新或者两者都支持填充的时候,自动插入值,默认default就是不处理。ps:需要自定义MyMetaObjectHandler实现接口
        @TableField(select = false, fill = FieldFill.INSERT) // 这里指定在插入时,自动填充
        private String password;
    
        private String name;
    
        private Integer age;
    
        // 解决对象中的属性名和字段名不一致(非驼峰)
        @TableField(value = "email")
        private String mail;
    
        // 解决对象中的属性在表中不存在的问题
        @TableField(exist = false)
        private String address;
    
        // 乐观锁的版本字段(需要在MybatisPlusConfig配置乐观锁拦截器)
        // 当更新一条记录时,希望这条记录没有被别人更新
        @Version
        private Integer version;
    
        // 标记逻辑删除字段 0-正常 1-删除
        // 逻辑删除需要在application.yml中做配置
        // 实际上删除的数据是不会从物理上删除,只是做一个标记,等查询的时候不被查询出来
        @TableLogic
        private Integer deleted;
    }
    

    UserService接口

    package com.myspringboot.service;
    
    import com.github.pagehelper.PageInfo;
    import com.myspringboot.model.User;
    
    import java.util.Map;
    
    public interface UserService {
    
        User findById(long id);
    
        PageInfo<Map<String, Object>> allUsers(Integer pageSize, Integer pageNum);
    }
    

    UserServiceImpl实现类

    package com.myspringboot.service.impl;
    
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    import com.myspringboot.dao.UserMapper;
    import com.myspringboot.model.User;
    import com.myspringboot.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import java.util.List;
    import java.util.Map;
    
    @Service
    public class UserServiceImpl implements UserService {
        // 这个实体类生成是在MybatisPlusConfig配置类里扫描了mapper
        @Autowired
        private UserMapper userMapper; 
    
        @Override
        public User findById(long id) {
            return this.userMapper.findById(id);
        }
    
        @Override
        public PageInfo<Map<String, Object>> allUsers(Integer pageNum,Integer pageSize) {
            PageHelper.startPage(pageNum, pageSize);
            List<User> list = userMapper.selectList(null);
            PageInfo pageInfo =  new PageInfo(list);
            int pages = pageInfo.getPages(); // 注意如果pageNum > pages 产生的数值还是最大页码值
            System.out.println(pages);
            return pageInfo;
        }
    }
    

    UserController:

    package com.myspringboot.controller;
    
    import com.alibaba.fastjson.JSONObject;
    import com.myspringboot.commos.exception.ResultGenerator;
    import com.myspringboot.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @RequestMapping(value = "/user")
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        @PostMapping("/findAllUser")
        @ResponseBody
        Object findAllUser(@RequestBody JSONObject json) {
            Integer pageNum = json.getInteger("pageNum");
            Integer pageSize = json.getInteger("pageSize");
            return this.userService.allUsers(pageNum, pageSize);
        }
    
        @PostMapping("/findUserById")
        Object findUserById(@RequestParam("id") Integer id) {
            System.out.println(id);
            return this.userService.findById(id);
        }
    
        @GetMapping("/findById/{id}") // 支持RESTful规范
        Object findById(@PathVariable("id") Integer id) {
            System.out.println(id);
            return ResultGenerator.getSuccessResult(this.userService.findById(id));
        }
    }
    

    最后是我们的启动类App

    package com.myspringboot;
    
    import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cache.annotation.EnableCaching;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    @SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
    @EnableTransactionManagement
    @EnableCaching
    public class App
    {
        public static void main( String[] args )
        {
            SpringApplication.run(App.class, args);
        }
    }
    
    

    验证时刻:
    启动我们的App


    启动我们的App

    我们的springboot程序就跑起来了。
    最后打开我们的postman工具进行调试:由于我的本地ip地址是http://192.168.2.2

    调试Controller类里的
    get方式:


    get获取数据 get方式传参

    post方式:


    post获取数据 post方式传参

    看分页查询


    分页查询 分页查询结果 分页查询结果

    相关文章

      网友评论

          本文标题:Springboot整合mybatis-Plus(注解版)

          本文链接:https://www.haomeiwen.com/subject/mznbdktx.html