springboot与mybatisPlus整合

SpringBoot整合MybatisPlus(详细版) ​MybatisPlus是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它继承了 MyBatis 的所有特性,并且加入了强大的功能,例如自动填充、逻辑删除、乐观锁、性能分析等。 阅读详情

整合之前说一下mybatisPlus的特征,也是官网原文:官网

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

框架结构:
在这里插入图片描述
整合项目结构图:
在这里插入图片描述
下面直接上代码:

1,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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>springboot_mybatisplus_demo</groupId>
    <artifactId>mybatisplus_demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mybatisplus_demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <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>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--引入swagger -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>

        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>

        <!-- 使用数据源 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.6</version>
        </dependency>
        <!-- Druid 依赖 log4j包 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!-- mybatis分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.12</version>
        </dependency>

        <!-- mybatisplus集成,引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差异导致的问题。 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>3.1.2</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2,UserController.java

package springboot.mybatisplus.demo.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageHelper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import springboot.mybatisplus.demo.model.User;
import springboot.mybatisplus.demo.services.UserService;

import java.util.Date;
import java.util.List;

/**
 * @desc:
 * @author: hwm
 * @date: 2019/7/24 18:23
 */
@Api(description = "用户操作")
@Controller
@RequestMapping("/user")
public class UserController {

    /**
     * MyBatis-Plus官网地址
     * https://mp.baomidou.com
     */

    @Autowired
    private UserService userService;

    @ApiOperation("自定义查询")
    @GetMapping("/getUserListLikeName")
    @ResponseBody
    public List<User> getUserListLikeName(int num, int size, String nickname) {

        PageHelper.startPage(num, size);
        return userService.getUserListLikeName(nickname);
    }

    @ApiOperation("分页查询条件")
    @GetMapping("/getPageParam")
    @ResponseBody
    public List<User> getPageParam(int num, int size, String nickname) {

        PageHelper.startPage(num, size);
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.like("nickname", nickname);
        List<User> list = userService.list(queryWrapper);
        return list;
    }

    @ApiOperation("分页查询")
    @GetMapping("/getPage")
    @ResponseBody
    public List<User> getPage(int num, int size) {

        PageHelper.startPage(num, size);
        List<User> list = userService.list();
        return list;
    }

    @ApiOperation("按照id查询")
    @GetMapping("/getUserById")
    @ResponseBody
    public User getUserById(Integer userId) {

        User user = userService.getById(userId);
        return user;
    }

    @ApiOperation("保存信息(检测事务是否生效)")
    @GetMapping("/addUser2")
    @ResponseBody
    @Transactional
    public User addUser2(String nickname, String userToken) {
        User user = new User();
        user.setNickname(nickname);
        user.setUserToken(userToken);
        user.setCreateTime(new Date());
        user.setValid(1);
        userService.save(user);

        int i = 3 / 0;

        return user;
    }

    @ApiOperation("保存信息")
    @GetMapping("/addUser")
    @ResponseBody
    public User addUser(String nickname, String userToken) {
        User user = new User();
        user.setNickname(nickname);
        user.setUserToken(userToken);
        user.setCreateTime(new Date());
        user.setValid(1);
        userService.save(user);

        return user;
    }
}

3,UserService.java

package springboot.mybatisplus.demo.services;


import com.baomidou.mybatisplus.extension.service.IService;
import springboot.mybatisplus.demo.model.User;

import java.util.List;

/**
 * @desc:
 * @author: hwm
 * @date: 2019/7/24 18:19
 */
public interface UserService extends IService<User> {

    List<User> getUserListLikeName(String nickName);

}

4,UserServiceImpl.java

package springboot.mybatisplus.demo.services.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import springboot.mybatisplus.demo.mappers.UserMapper;
import springboot.mybatisplus.demo.model.User;
import springboot.mybatisplus.demo.services.UserService;

import java.util.List;

/**
 * @desc:
 * @author: hwm
 * @date: 2019/7/24 18:21
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> getUserListLikeName(String nickName) {

        return userMapper.getUserListLikeName(nickName);
    }
}

5,UserMapper.java

package springboot.mybatisplus.demo.mappers;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import springboot.mybatisplus.demo.model.User;

import java.util.List;

/**
 * @desc:
 * @author: hwm
 * @date: 2019/7/24 18:18
 */
public interface UserMapper extends BaseMapper<User> {
    List<User> getUserListLikeName(String nickName);
}

6,UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="springboot.mybatisplus.demo.mappers.UserMapper">

    <select id="getUserListLikeName" resultType="springboot.mybatisplus.demo.model.User">
        SELECT user_id,nickname,user_token,create_time,valid
         FROM `user`
         WHERE nickname LIKE concat('%', nickName, '%')
    </select>

</mapper>

7,User.java

package springboot.mybatisplus.demo.model;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

@Data
@TableName("user")
public class User implements Serializable {

    @TableId(type = IdType.AUTO)
    private Integer userId;

    private String nickname;

    private String userToken;

    private Date createTime;

    private Integer valid;

}

8,MybatisplusDemoApplication.java

package springboot.mybatisplus;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("springboot.mybatisplus.demo.mappers") // 扫码mapper包
public class MybatisplusDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(MybatisplusDemoApplication.class, args);
    }
}

9,application.properties 配置文件:


#运行端口
server.port=8080

#日志配置
log.level=debug
log.out.path=C:\\www\\logs\\mybatisplus_demo

#数据库连接信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.2.200:3306/springboot_mybatisplus_demo?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&useSSL=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456

#阿里druid连接池驱动配置信息
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#连接池的配置信息
#初始化大小,最小,最大
spring.datasource.initialSize=2
spring.datasource.minIdle=2
spring.datasource.maxActive=3
#配置获取连接等待超时的时间
spring.datasource.maxWait=6000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.timeBetweenEvictionRunsMillis=60000
#是否自动回收超时连接
spring.dataSource.removeAbandoned=true
#超时时间(以秒数为单位)
spring.dataSource.removeAbandonedTimeout=180
#是否在自动回收超时连接的时候打印连接的超时错误
spring.dataSource.logAbandoned=true
#配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
#打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
#配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.filters=stat,wall,log4j
#通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#druid登陆账号密码
spring.datasource.login.name=admin
spring.datasource.login.pass=123456

#mybatisplus配置
mybatis-plus.mapper-locations=classpath*:mappers/*Mapper.xml
mybatis-plus.typeAliasesPackage=springboot.mybatisplus.demo.model

#mapper文件目录
#mybatis.mapper-locations=classpath*:mappers/*Mapper.xml
##新增数据后自动获取数据库自增主键, 需要使用 keyProperty 指定主键
#mybatis.configuration.use-generated-keys=true
##开启自动驼峰命名转换
#mybatis.configuration.map-underscore-to-camel-case=true

#pagehelper分页插件配置
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.params=count=countSql

#时间戳统一转换
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
# 此配置会返回时间戳
#spring.jackson.serialization.write-dates-as-timestamps=true

#swagger配置
swagger.base.package=springboot.mybatisplus.demo.controller
#swagger映射目录
swagger.path.mapping=/
#是否激活 swagger true or false
swagger.is.enable=true

10,logback-spring.xml 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">

    <!-- 加载日志环境相关配置 -->
    <springProperty scope="context" name="logLevel" source="log.level" />
    <springProperty scope="context" name="logOutPath" source="log.out.path" />

    <!-- 日志输出格式:%d表示日期,%X{requestId}表示mdcid,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
    <property name="logPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] [%thread] %-5level %logger{50} - %msg%n"/>

    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${logPattern}</pattern>
        </encoder>
    </appender>
    <!-- 按照每天生成日志文件(输出到文件) -->
    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${logOutPath}/info.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${logPattern}</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>

        <!-- 日志文件只输出INFO以上级别日志,控制台按照配置logLevel级别输出 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>${logLevel}</level>
        </filter>
    </appender>

    <!-- 配置定时任务启动时找不到默认的定时任务报错而使用info级别(不影响使用) -->
    <logger name="org.springframework.scheduling">
        <level value="info" />
    </logger>

    <!--myibatis log configure-->
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>

    <!-- 日志输出级别 -->
    <root level="${logLevel}">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>

</configuration>

11,MySwagger2Config.java

package springboot.mybatisplus.demo.swagger;


import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.List;

@Configuration
@EnableSwagger2 // 开启swagger
public class MySwagger2Config extends WebMvcConfigurerAdapter {

    @Value("${swagger.is.enable:true}")
    private boolean swagger_is_enable;
    @Value("${swagger.base.package}")
    private String swaggerBasePackage;
    @Value("${swagger.path.mapping:/}")
    private String swaggerPathMapping;

    @Bean
    public Docket createRestApi() {

        return new Docket(DocumentationType.SWAGGER_2)
                // swagger 状态:true 启动, false 禁用
                .enable(swagger_is_enable)
                .apiInfo(apiInfo()).select()
                //扫描指定包中的swagger注解
                .apis(RequestHandlerSelectors.basePackage(swaggerBasePackage))
                .paths(PathSelectors.any())
                .build()
                .pathMapping(swaggerPathMapping)
                .globalOperationParameters(buildHeaderParam());
    }

    /**
     * 设置在swagger里面的公共参数,如果有需要重写此方法
     * 设置公共的参数。
     * 如:设置在请求头里面的token,userId等
     *
     * @return
     */
    protected List<Parameter> buildHeaderParam() {

        // demo:设置在请求头里面公共参数token

        /*List<Parameter> pars = new ArrayList<>();
        ParameterBuilder tokenPar = new ParameterBuilder();
        tokenPar.name("token").description("token").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
        pars.add(tokenPar.build());*/

        return null;
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("基础平台 RESTful APIs")
                .description("基础平台 RESTful 风格的接口文档,内容详细,极大的减少了前后端的沟通成本,同时确保代码与文档保持高度一致,极大的减少维护文档的时间。")
                .version("1.0.0")
                .build();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");

    }
}

12,DruidDBConfig.java

package springboot.mybatisplus.demo.druid;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;
import java.sql.SQLException;

@Configuration
public class DruidDBConfig {

    private static final Logger logger = LoggerFactory.getLogger(DruidDBConfig.class);

    private static final String DB_PREFIX = "spring.datasource";

    @Value("${spring.datasource.login.name}")
    private String spring_datasource_login_name;
    @Value("${spring.datasource.login.pass}")
    private String spring_datasource_login_pass;

    @Bean
    public ServletRegistrationBean druidServlet() {
        logger.info("init Druid Servlet Configuration ");
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
        // IP白名单
        servletRegistrationBean.addInitParameter("allow", "");
        // IP黑名单(共同存在时,deny优先于allow)
        servletRegistrationBean.addInitParameter("deny", "");
        //控制台管理用户
        servletRegistrationBean.addInitParameter("loginUsername", spring_datasource_login_name);
        servletRegistrationBean.addInitParameter("loginPassword", spring_datasource_login_pass);
        //是否能够重置数据 禁用HTML页面上的“Reset All”功能
        servletRegistrationBean.addInitParameter("resetEnable", "false");
        return servletRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }

    // 解决 spring.datasource.filters=stat,wall,log4j 无法正常注册进去
    @ConfigurationProperties(prefix = DB_PREFIX)
    @Data
    class IDataSourceProperties {
        private String url;
        private String username;
        private String password;
        private String driverClassName;
        private int initialSize;
        private int minIdle;
        private int maxActive;
        private boolean removeAbandoned;
        private int removeAbandonedTimeout;
        private boolean logAbandoned;
        private int maxWait;
        private int timeBetweenEvictionRunsMillis;
        private int minEvictableIdleTimeMillis;
        private String validationQuery;
        private boolean testWhileIdle;
        private boolean testOnBorrow;
        private boolean testOnReturn;
        private boolean poolPreparedStatements;
        private int maxPoolPreparedStatementPerConnectionSize;
        private String filters;
        private String connectionProperties;

        @Bean     //声明其为Bean实例
        @Primary  //在同样的DataSource中,首先使用被标注的DataSource
        public DataSource dataSource() {
            DruidDataSource datasource = new DruidDataSource();
            datasource.setUrl(url);
            datasource.setUsername(username);
            datasource.setPassword(password);
            datasource.setDriverClassName(driverClassName);

            //configuration
            datasource.setInitialSize(initialSize);
            datasource.setMinIdle(minIdle);
            datasource.setMaxActive(maxActive);
            datasource.setRemoveAbandoned(removeAbandoned);
            datasource.setRemoveAbandonedTimeout(removeAbandonedTimeout);
            datasource.setLogAbandoned(logAbandoned);
            datasource.setMaxWait(maxWait);
            datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
            datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
            datasource.setValidationQuery(validationQuery);
            datasource.setTestWhileIdle(testWhileIdle);
            datasource.setTestOnBorrow(testOnBorrow);
            datasource.setTestOnReturn(testOnReturn);
            datasource.setPoolPreparedStatements(poolPreparedStatements);
            datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
            try {
                datasource.setFilters(filters);
            } catch (SQLException e) {
                System.err.println("druid configuration initialization filter: " + e);
            }
            datasource.setConnectionProperties(connectionProperties);
            return datasource;
        }
    }

}


最后在上一下demo sql脚本:

CREATE TABLE `user` (
  `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
  `nickname` varchar(126) DEFAULT NULL COMMENT '昵称',
  `user_token` varchar(250) DEFAULT NULL COMMENT '用户token(token记录方式更改,不在系统保存字段弃用)',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `valid` int(2) DEFAULT '1' COMMENT '有效标志:0无效,1有效',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8mb4;

/*Data for the table `user` */

insert  into `user`(`user_id`,`nickname`,`user_token`,`create_time`,`valid`) values (1,'丹','5D3BFC0A-29bcc00ac8ff483cbcf19315e0d90e6b-0f9f4098c0c3b74bd90408f45848bbe7','2019-03-25 16:21:16',1),(2,'hwm','5D4D7F9D-45ec908c7c49427b9b3a69b9694c0b7c-15e16ae002d9d9f9141973a8e8e797ef','2019-07-01 15:47:01',1),(3,NULL,'40471561661e5c76c0a395f73ae5d057','2019-03-25 16:34:35',1),(4,'林慧珊','8b821fa9dfad781e3b106f58ccbbe126','2019-03-26 17:50:00',1),(5,'Memory Limit Exceeded','2eea1f234b220876efce13a062db95de','2019-03-28 10:50:00',1),(6,'~Suarez~','48a31f2d0723cdc7d6b7c6ec8fa5059b','2019-03-30 01:47:07',1),(7,'乘着叶片飞舞的蜗牛','35f83f7f08ff0d490155e875248a88ae','2019-03-30 03:10:45',1),(8,'一苇渡杭','c87adb9bc95321990e2026454e8a7419','2019-03-31 08:30:36',1),(9,'木树','c8da8aa6251b831b7531b8e4be62ff15','2019-04-01 20:12:27',1),(10,'Lignorance','5D478488-634051dca4d84e5883b69ae51793d233-bef7f23a46dc8c51db4f8f586a12052b','2019-04-01 20:48:00',1),(11,'credapple','2048efcf71d34181db119bb986eb8e50','2019-04-01 23:30:06',1),(12,'。陳燁','0da651a735cdfa5afcea3a8c9973b7bb','2019-04-03 07:54:20',1),(13,'张淑书','db3ae339df25f6342be68c8d9a40294c','2019-04-03 09:40:35',1),(14,'zch','212e6da760631364812574e6af40fc2f','2019-04-05 20:53:55',1),(15,'佪の࿐ོ忔','1374fe7b3161f672f64cd70412cdec8b','2019-04-05 23:56:54',1),(16,'HBin','e5b2d64877491a6f649403b47b71d54f','2019-04-06 20:39:51',1),(17,'浩','644b550f59e5a5700a28a09e8a780266','2019-04-07 00:41:54',1),(18,'KCº·º生活+态度','e72644bf76ccbf9f30d492596d2e65ce','2019-04-07 03:02:06',1),(19,NULL,'2aa91587233bbebcb2b94e824b5d2ea9','2019-04-08 10:01:49',1),(20,'成茹','715e3515db8f077e197de95047623d9e','2019-04-08 13:19:49',1),(21,'测试测试','测试测试','2019-07-25 15:00:34',1),(22,'测试测试2','测试测试2','2019-07-25 15:00:55',1),(23,'测试测试3','测试测试3','2019-07-25 15:01:26',1);

最终整合效果:
在这里插入图片描述

在这里整个整合就已经完成了,可以成功跑起来项目,也可以直接在
https://gitee.com/hwm0717/springboot_mybatisplus_demo
下载整个项目运行
如果需要面试题目复习可以扫码微信小程序二维码:
在这里插入图片描述

Spring Boot框架集成Mybatis-plus 国产的开源框架,基于mybatis,相当于对mybatis进行了二次的封装,是2019年开源中国里面排行第一的框架,它的核心功能就是简化mybatis开发,提高效率。官网:(https://mp.baomidou.com/)依赖的官网:(https://mvnrepository.com/) 阅读详情

相关推荐

解决MybatisPlus3.5.5与pagehelper starter2.1.0冲突

原因是它们同时都引用了jsqlparser的依赖,然而,mybatis plus用的是jsqlparser4.6版本,而pagehelper用的是4.7。项目升级的时候,MybatisPlus与PageHelper又双叕打架了。我们覆盖掉这个方法,使用官方提供的4.5兼容包,并重新注册即可。这个类是用来管理注册方言的,它在MySql的方言中默认使用了。类,而MySqlDialect类继承自。那么会出现什么情况?

jamesleel的专栏 4147

springboot整合mybatis-plus

springboot整合mybatis-plus,自此告别基础SQL的编写;

听钱塘信来的博客 3万+

Springboot整合MybatisPlus完整详解(最新)~

新建springboot项目 开发工具:idea2019.2,maven3 pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependen

程序员资料站 2万+

Springboot整合Mybatis Plus【超详细】

springboot整合mybatis plus

玩转Java 1万+

MAX30102传感器实战:从寄存器配置到Arduino心率血氧监测

本文详细介绍了MAX30102传感器在Arduino平台上的实战应用,从寄存器配置到心率血氧监测的全过程。通过清晰的代码示例和实用技巧,帮助开发者快速实现脉搏血氧仪功能,包括I2C通信、FIFO数据处理及算法实现,适用于健康监测和可穿戴设备开发。

weixin_29182481的博客 511

LLM推理服务中的SLO感知调度优化实践

在AI服务架构中,服务级别目标(SLO)是衡量服务质量的核心指标,特别是在大型语言模型(LLM)推理场景下。SLO通常涉及TTFT(首token时间)、TPOT(每token生成时间)和端到端延迟等关键维度,这些指标直接影响用户体验和系统效率。传统FCFS调度策略由于缺乏SLO感知能力,在混合负载下往往导致资源利用率低下和SLO达标率骤降。通过引入基于模拟退火的动态调度算法和精准的延迟预测模型,可以实现对不同优先级请求的智能调度,显著提升GPU利用率和SLO达标率。这种技术方案特别适用于需要同时处理实时对话

weixin_42549154的博客 368

SpringBoot整合MybatisPlus【超详细】

SpringBoot整合MybatisPlus【超详细】创建个SpringBoot项目写个HelloController测试下使用代码生成器生成代码添加所需的依赖CodeGenerator运行代码生成器,在控制台输入想要生成的表 创建个SpringBoot项目 勾选生所需的依赖: 我把application的后缀改为.yml了,方便些。 pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave

『愚』的博客 6894

保姆级教程:用GEE(Google Earth Engine)复现CASA模型计算NPP,附完整数据集清单与Python代码

本文提供了一份详细的保姆级教程,指导如何使用GEE(Google Earth Engine)复现CASA模型计算NPP(净初级生产力)。教程涵盖环境准备、关键数据集获取与处理、Python代码实现全流程,以及结果验证与常见问题解决方案,帮助生态学研究者高效完成NPP计算。

weixin_28707365的博客 333

【MybatisPlus】SpringBoot3整合MybatisPlus

【MybatisPlus】SpringBoot3整合MybatisPlus、逻辑删除

Leslie_Lei的博客 1176

【社区分享】从零开始学习 TinyML,建立 TensorFlow 深度学习模型(技术优化篇)

本文来自社区投稿与征集,作者王玉成,ML&IoT Google Developers Expert,温州大学智能锁具研究院总工程师。 了解更多:https://blog.csdn.net/wfing 经过前面几章的讨论,我们了解了TinyML 的概念,完成了一个最简单的TinyML 的模型并且运行在微控制器上,得出最基本的结果。但是在实际的工程应用中,模型建立之后,也需要再进一步结合许多优化方面的技术,这就是我们接下来想要探讨的。 5. 优化 TinyML 这本书也详细的向我...

tensorflowforum的博客 1万+

别再手动巡检了!用Zabbix 5.0 + SNMPv2自动监控华为S系列交换机(附完整命令集)

本文详细介绍了如何利用Zabbix 5.0与SNMPv2实现华为S系列交换机的自动化监控,告别低效的手动巡检。通过配置SNMPv2c安全基线、核心功能启用及Zabbix Server端深度配置,构建7×24小时监控体系,实时预警接口状态、流量波动等关键指标,大幅提升运维效率与故障响应速度。

weixin_30940783的博客 628

SpringBoot快速整合MyBatisPlus

MyBatis Plus 是 MyBatis 的增强工具,在 MyBatis 的基础上进行扩展和增强,主要目标是简化开发、提高效率。它提供了一系列功能,包括 CRUD 封装、条件构造器、批量操作、自动填充、逻辑删除、代码生成器等,旨在让开发者不需要写繁琐的 SQL 语句即可实现常见的数据库操作。Lombok提供了多种注解,每种注解都有其特定的功能。例如,@Getter和@Setter注解可以自动为类生成getter和setter方法;@ToString注解可以自动生成对象的字符串表示形式;@Data注解则会

墨辰JC的博客 1394

基于PYNQ-Z2复现yolov2

基于PYNQ-Z2复现Yolo_v2 参考资料:源项目工程 开发板配置 0 使用说明 0.1 简介 本文档主要分为三个部分: [1] 搭建HLS工程生成Yolo_v2的IP。 [2] 在Vivado中使用生成好的IP进行block design,导出bit文件和tcl文件。 [3] 将相关文件导入至PYNQ-Z2板中,在Jupyter Notebook上进行编程实现。 0.2 所需硬件  PYNQ-Z2开发板、USB数据线、网线  SD卡、读卡器 0.3 所需软件  Vivado 2018.3  V

谦豫 1万+

【SpringBoot】整合 MybatisPlus

1、log4j2 第一步,导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions><!-- 去掉springboot默认配置 --> <exclusion>

athicket 2679

RS422总线

①.RS422发送驱动器无高阻三态(浮空)状态RS422收发芯片,发送脚固定强驱动输出,永远钳位 A/B 差分电平,不能关断、不能悬空,只要芯片上电,TX+、TX - 就强制输出互补电压(一路高、一路低)。多条发送并联在同一组差分线上:两个驱动器一个拉 A 高、一个拉 A 低,B 线反向拉扯 → 电源→地大电流对灌,瞬间芯片过流发烫烧毁、总线电平短路错乱。注意:RS485 带DE/RE 收发使能脚:不用发送时可关闭驱动器,输出变成高阻浮空,让出总线,因此能多节点分时发送。③.多点通信方式,一主多从方式;

zhuimeng_1234的博客 222

ROS2入门到精通—— 1-1 Linux和ROS2基础

本文介绍了Linux的一般指令以及ROS2的常见理论和操作

BigDavid123的博客 3799

MyBatisPlus01_SpringBoot与MybatisPlus整合

MyBatisPlus01_SpringBoot与MybatisPlus整合 创建SpringBoot项目,选择以下工具包: Lombok Spring Web Thymeleaf MySQL Driver 添加MybatisPlus的依赖: <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId>

BLU_111的博客 5万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SpringBoot整合MybatisPlus

Mybatis-plus官方网站 SpringBoot整合MybatisPlus一,MybatisPlus比Mybatis的优势一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 一,MybatisPlus比Mybatis的优势 摘自Mybatis-Plus和Mybatis的区别 Mybatis-Plus是一个Mybatis的增强工具,它在Mybatis的基础上做了增强,却不做改变。我们在使用Mybatis-Plus之后既可以使用Mybatis-Plus的特有功能,又能够正常使用Mybatis

Artisan_w 344

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

springboot整合mybatisplus+shardingsphere

shardingsphere+mybatisplus分库分表操作

huzi_1998的博客 3946

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SpringBoot之整合MyBatisPlus

在Java开发中,MyBatis作为主流ORM框架被广泛使用,但原生写XML映射文件或注解SQL仍需大量重复工作,MyBatisPlus(简称MP)在MyBatis基础上增强了CRUD操作,通过内置接口实现无SQL开发,大幅提升开发效率。本文我将详细讲解SpringBoot整合MyBatisPlus的完整流程,包括环境搭建、核心功能使用、高级特性及实战示例等要点。

aa_hdkf_vg的博客 1541

SpringBoot整合MyBatisPlus框架

1. 简介 这里我们将MyBatisPlus(以下简称mp)框架整合到SpringBoot项目中, mp框架相对于基础版mybatis和通用版mybatis 有如下几个优点: xml文件零配置: 对于单表查询几乎实现零xml文件配置. 丰富的查询条件: 对于多条件查询利用Wrapper接口可以实现和Hibernate相媲美的查询. 自带分页功能: 通过将PaginationIntercept...

inconspicuousy-start 2431

springBoot整合mybatisPlus

如果添加了mybatis-spring-boot-starter坐标那么在启动类中设置mapper接口扫描包@MapperScan或在dao接口上配置@Mapper,具体原因请查看springboot整合mybatis:http://t.csdn.cn/xbYWc。或者在创建的时候指定创建项目的路径为https://start.aliyun.com。第四步:在启动类所在的包中创建entry.Book类和dao.bookDao接口。第三步:配置数据源相关信息。第六步:在测试类中测测试。

weixin_57726902的博客 816

SpringBoot整合JUnit、MyBatis、MyBatisPlus、Druid

SpringBoot版本低于2.4.3(不含),Mysql驱动版本大于8.0时,需要在url连接串中配置时区。注意事项: 由于SpringBoot中未收录MyBatis-Plus的坐标版本,需要指定对应的Version。①:手动添加SpringBoot整合MyBatis-Plus的坐标,可以通过mvnrepository获取。①:创建新模块,选择Spring初始化,并配置模块相关基础信息。或在MySQL数据库端配置时区解决此问题。⑦:测试类中注入dao接口,测试功能。④:测试类中注入dao接口,测试功能。

weixin_51405802的博客 167

springboot和MybatisPlus整合

springboot和MybatisPlus整合 1.介绍 使用SpringBoot + Mybatis + MybatisPlus(MP) 全新注解方式,自动产生SQL语句,替代旧的通用Mapper。旧的通用Mapper是基于Mybatis拦截器的机制,而新的MybatisPlus是基于注解扫描机制,在启动服务时就进行加载,所以性能比旧的通用Mapper方式高很多。 MyBatisPlus官网:...

smileLs的博客 2162

springboot整合MybatisPlus,所需导入依赖

springboot整合MybatisPlus,所需导入依赖 <!-- 这里将版本统一提取,方便更新和修改jar 包冲突 --> <properties> <spring.version>5.2.3.RELEASE</spring.version> <aspectjweaver.version>1...

this_service的博客 1万+

spring boot项目中整合mybatisPlus和pageHelper

1 首先导入相关jar包 <!--spring boot整合mybatisPlus和pageHelper--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <versio

意田天的博客 1万+
上一篇: uniapp安卓应用于微信小程序相互跳转并且传递参数
下一篇: java面试宝典
hwmhehe
博客等级 码龄13年 86粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值