美文网首页开源项目springboot2企业级开发
第5篇 springboot2 集成mybatis-plus3

第5篇 springboot2 集成mybatis-plus3

作者: allen1683 | 来源:发表于2019-08-13 15:02 被阅读117次

    写本文章的目的

    网上有很多这样类似的文章,但很多是基于的mybatis-plus2的版本,还有就是关键的点没有写出来。
    这里我根据实际的工作,基于springboot2.1.6 和 mybatis-plus 3.1.2写出来分享给大家
    

    基本概念

    阅读本文前,可以先了解下什么是druid连接池、什么是mybatis-plus
    1)druid常见问题:https://github.com/alibaba/druid/wiki
    2)mybatis-plus官网:https://mp.baomidou.com/guide/
    

    具体实现步骤

    本文重点不在于介绍概念,而是集成实现的步骤以及源码实现,集成分为五步:
    步骤1:创建maven工程,集成springboot、slf4j以及log4j2
    步骤2:增加web工程基础配置、druid的配置、mybatis-plus配置
    步骤3:增加druid配置类和mybatis-plus配置类
    步骤4:执行sql语句,自动生成代码,实现单表增删改查
    步骤5:启动工程测试,查看日志以及druid控制台的sql监控
    

    步骤1:创建maven工程,集成springboot

    使用ideal创建edu-parent工程,工程包括edu-api和edu-web两个模块:

    1)edu-api为业务接口api,可能需要提供给内部调用的业务接口,以jar的形式打包
    
    2)edu-web模块web服务的实现,包括controller、service、dao等
    

    如下图工程结构:

    image.png

    步骤2:增加web工程的基础配置、druid的配置、mybatis-plus配置

    #server config
    spring.application.name=edu-web
    server.port=7010
    server.servlet.context-path=/
    server.tomcat.uri-encoding=UTF-8
    logging.config=classpath:log4j2.xml
    #datasource config
    spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
    spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.druid.url =jdbc:mysql://127.0.0.1:3306/nature-edu?useSSL=false
    spring.datasource.druid.username=root
    spring.datasource.druid.password=root
    spring.datasource.druid.initialSize=5
    spring.datasource.druid.minIdle=5
    spring.datasource.druid.maxActive=20
    spring.datasource.druid.maxWait=60000
    spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
    spring.datasource.druid.minEvictableIdleTimeMillis=300000
    spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL
    spring.datasource.druid.testWhileIdle=true
    spring.datasource.druid.testOnBorrow=false
    spring.datasource.druid.testOnReturn=false
    spring.datasource.druid.poolPreparedStatements=true
    spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
    spring.datasource.druid.filters=stat,wall,slf4j
    spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    spring.datasource.druid.useGlobalDataSourceStat=true
    #mybatis-plus
    mybatis-plus.mapper-locations=classpath:mapper/edu/mysql/*Mapper.xml
    mybatis-plus.type-aliases-package=com.nature.edu.entity
    mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.log4j2.Log4j2Impl
    mybatis-plus.configuration.call-setters-on-nulls=true
    mybatis-plus.configuration.cache-enabled=true
    mybatis-plus.configuration.map-underscore-to-camel-case=true
    mybatis-plus.global-config.db-column-underline=true
    
    

    步骤3:增加druid配置类和mybatis-plus配置类

    1. druid和mybatis-plus配置类
    
    package com.nature.edu.config;
    
    import com.alibaba.druid.pool.DruidDataSource;
    
    import com.baomidou.mybatisplus.extension.incrementer.OracleKeyGenerator;
    
    import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
    
    import org.mybatis.spring.annotation.MapperScan;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    import org.springframework.boot.web.servlet.ServletComponentScan;
    
    import org.springframework.context.annotation.Bean;
    
    import org.springframework.context.annotation.Configuration;
    
    import javax.sql.DataSource;
    
    /**
    
    * 读取druid连接池配置初始化datasource
    
    *
    
    * @author wangck
    
    * @date 2019/8/6
    
    */
    
    @Configuration
    
    @ServletComponentScan
    
    @MapperScan("com.nature.edu.dao")
    
    public class DruidConfig {
    
    /**
    
        * 加载时读取指定的配置信息,前缀为spring.datasource.druid
    
    *
    
        * @return
    
        */
    
        @Bean("dataSource")
    
    @ConfigurationProperties(prefix ="spring.datasource.druid")
    
    public DataSource druidDataSource() {
    
    return new DruidDataSource();
    
    }
    
    /**
    
        * 分页插件
    
        */
    
        @Bean
    
        public PaginationInterceptor paginationInterceptor() {
    
    // paginationInterceptor.setLimit(你的最大单页限制数量,默认 500 条,小于 0 如 -1 不受限制);
    
            PaginationInterceptor paginationInterceptor =new PaginationInterceptor();
    
    return paginationInterceptor;
    
    }
    
    }
    
    

    2)druid监控过滤器

    
    package com.nature.edu.config;
    
    import javax.servlet.annotation.WebFilter;
    
    import javax.servlet.annotation.WebInitParam;
    
    import com.alibaba.druid.support.http.WebStatFilter;
    
    /**
    
    * druid过滤器
    
    * @author wangck
    
    * @date 2019/8/6
    
    */
    
    @WebFilter(
    
    filterName ="druidWebStatFilter",
    
    urlPatterns = {"/*" },
    
    initParams = {
    
    @WebInitParam(
    
    name ="exclusions",
    
    value ="*.js,*.jpg,*.png,*.gif,*.ico,*.css,/druid/*")
    
    })
    
    public class DruidStatFilterextends WebStatFilter {
    
    }
    
    

    3)druid监控控制台servlet,支持配置访问控制台账号和密码验证

    
    package com.nature.edu.config;
    
    import javax.servlet.Servlet;
    
    import javax.servlet.annotation.WebInitParam;
    
    import javax.servlet.annotation.WebServlet;
    
    import com.alibaba.druid.support.http.StatViewServlet;
    
    /**
    
    * druid控制台servlet,支持设置账号和密码访问登录
    
    *
    
    * @author wangck
    
    * @date 2019/8/6
    
    */
    
    @WebServlet(
    
    urlPatterns = {"/druid/*"},
    
    initParams = {
    
    @WebInitParam(name ="allow", value =""),
    
    @WebInitParam(name ="loginUsername", value ="admin"),
    
    @WebInitParam(name ="loginPassword", value ="admin"),
    
    @WebInitParam(name ="resetEnable", value ="false")
    
    })
    
    public class DruidStatViewServletextends StatViewServletimplements Servlet {
    
    private static final long serialVersionUID =8782104600990278875L;
    
    }
    
    

    4)webmvc配置类,支持跨域增加日志拦截器

    
    package com.nature.edu.config;
    
    import com.nature.edu.interceptor.LogInterceptor;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    import org.springframework.context.annotation.Bean;
    
    import org.springframework.context.annotation.Configuration;
    
    import org.springframework.http.MediaType;
    
    import org.springframework.web.servlet.config.annotation.*;
    
    import java.util.ArrayList;
    
    import java.util.List;
    
    /**
    
    * webmvc配置
    
    *
    
    * @author wangck
    
    * @date 2019/7/16
    
    */
    
    @Configuration
    
    public class WebMvcConfigimplements WebMvcConfigurer {
    
    /**
    
        * 日志拦截器
    
        */
    
        @Autowired
    
        private LogInterceptorlogInterceptor;
    
    @Bean
    
        LogInterceptor getLogInterceptor() {
    
    return new LogInterceptor();
    
    }
    
    /**
    
        * 重写添加拦截器方法并添加配置拦截器
    
        *
    
        * @param registry
    
        */
    
        @Override
    
        public void addInterceptors(InterceptorRegistry registry) {
    
    List excludePatternsList =new ArrayList<>();
    
    // 静态资源放开不拦截
    
            excludePatternsList.add("/static/**");
    
    excludePatternsList.add("/favicon.ico");
    
    excludePatternsList.add("*.css");
    
    excludePatternsList.add("*.js");
    
    excludePatternsList.add("*.jpg");
    
    excludePatternsList.add("*.png");
    
    // 日志拦截器
    
            registry.addInterceptor(logInterceptor).addPathPatterns("/**").excludePathPatterns(excludePatternsList);
    
    }
    
    /**
    
        * 跨域配置
    
        */
    
        @Override
    
        public void addCorsMappings(CorsRegistry registry) {
    
    registry.addMapping("/**");
    
    }
    
    @Override
    
        public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    
    configurer.mediaType("json", MediaType.APPLICATION_JSON);
    
    configurer.mediaType("xml", MediaType.APPLICATION_XML);
    
    }
    
    /**
    
        * 配置静态资源映射
    
        */
    
        @Override
    
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
    
    registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    
    }
    
    }
    
    

    步骤4:执行sql语句、自动生成代码,实现单表增删改查

    1)执行创建库、创建表的sql语句

    
    CREATE DATABASE `nature-edu`CHARACTER SET 'utf8mb4';
    
    CREATE TABLE `bas_user`  (
    
    `user_id` varchar(32)CHARACTER SET utf8mb4COLLATE utf8mb4_0900_ai_ciNOT NULL COMMENT'用户Id,主键',
    
    `user_no` varchar(10)CHARACTER SET utf8mb4COLLATE utf8mb4_0900_ai_ciNULL DEFAULT NULL COMMENT'账号',
    
    `user_name` varchar(20)CHARACTER SET utf8mb4COLLATE utf8mb4_0900_ai_ciNULL DEFAULT NULL COMMENT'登录名',
    
    `user_head` varchar(255)CHARACTER SET utf8mb4COLLATE utf8mb4_0900_ai_ciNULL DEFAULT NULL COMMENT'头像',
    
    `nick_name` varchar(20)CHARACTER SET utf8mb4COLLATE utf8mb4_0900_ai_ciNULL DEFAULT NULL COMMENT'昵称',
    
    `person_name` varchar(90)CHARACTER SET utf8mb4COLLATE utf8mb4_0900_ai_ciNULL DEFAULT NULL COMMENT'姓名',
    
    `piny_name` varchar(255)CHARACTER SET utf8mb4COLLATE utf8mb4_0900_ai_ciNULL DEFAULT NULL COMMENT'姓名全拼音',
    
    PRIMARY KEY (`user_id`)USING BTREE
    
    ) ENGINE = InnoDBCHARACTER SET = utf8mb4COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
    
    SET FOREIGN_KEY_CHECKS =1;
    
    

    2)根据util包下的工具类AutoGeneratorHelper 自动生成数据库dao、entity、mapper文件,生成后拷贝到自己目录即可,如下图

    
    package com.nature.edu.util;
    
    import com.baomidou.mybatisplus.annotation.DbType;
    
    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;
    
    import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
    
    /**
    
    * @Description: 代码生成器 ,指定表名自动生成dao层、service层,controller层
    
    *              dao层包括mapper的java类、xml文件, servier包括接口类和空实现类,
    
    *              controller包括对应的controller空实现 对应的模块响应修改包名 以及数据库连接信息即可,指定要生成的表名
    
    *
    
    * @author: wangck
    
    * @date: 2018/8/2 12:57
    
    */
    
    public class AutoGeneratorHelper {
    
    public static void main(String[] args) {
    
    String packageName ="com.nature.edu";
    
    boolean serviceNameStartWithI=true;
    
    generateByTables(serviceNameStartWithI, packageName,"bas_user");
    
    }
    
    private static void generateByTables(boolean serviceNameStartWithI, String packageName, String... tableNames) {
    
    GlobalConfig config =new GlobalConfig();
    
    String url ="jdbc:mysql://localhost:3306/nature-edu?useSSL=false";
    
    String username ="root";
    
    String password ="root";
    
    String driverClassName ="com.mysql.jdbc.Driver";
    
    DataSourceConfig dataSourceConfig =new DataSourceConfig();
    
    dataSourceConfig.setDbType(DbType.MYSQL).setUrl(url).setUsername(username).setPassword(password).setDriverName(driverClassName);
    
    StrategyConfig strategyConfig =new StrategyConfig();
    
    strategyConfig.setCapitalMode(true).setEntityLombokModel(false).setNaming(NamingStrategy.underline_to_camel)
    
    .setInclude(tableNames);
    
    // 修改替换成你需要的表名,多个表名传数组
    
          config.setActiveRecord(false).setAuthor("auto").setOutputDir("D:\\mumu-gen").setFileOverride(true);
    
    if (!serviceNameStartWithI) {
    
    config.setServiceName("%sService");
    
    }
    
    new AutoGenerator().setGlobalConfig(config).setDataSource(dataSourceConfig).setStrategy(strategyConfig)
    
    .setPackageInfo(new PackageConfig().setParent(packageName).setEntity("entity").setMapper("dao").setService("service")
    
    .setController("controller").setXml("mapper.edu.mysql"))
    
    .execute();
    
    }
    
    }
    
    

    3)增加IUserService实现单表的增删改查

    IUserService

    
    package com.nature.edu.service;
    
    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    
    import com.nature.Response;
    
    import com.nature.edu.vo.UserVO;
    
    /**
    
    * 用户相关业务类
    
    *
    
    * @author wangck
    
    * @date 2019/7/25
    
    */
    
    public interface IUserService {
    
    /**
    
        * 添加用户
    
        *
    
        * @param user
    
        * @return
    
        */
    
        public Response addUser(UserVO user);
    
    /**
    
        * 修改用户
    
        *
    
        * @param user
    
        * @return
    
        */
    
        public Response modifyUser(UserVO user);
    
    /**
    
        * 删除用户
    
        *
    
        * @param userId
    
        * @return
    
        */
    
        public Response deleteUser(String userId);
    
    /**
    
        * 查询用户
    
        *
    
        * @param userId
    
        * @return
    
        */
    
        public Response getUser(String userId);
    
    /**
    
        * 分页查询用户
    
        * @param searchName 支持根据姓名模糊搜索
    
        * @param page 分页参数
    
        * @return
    
        */
    
        public Response> getUserPage(String searchName,Page page);
    
    }
    
    

    UserServiceImpl

    
    package com.nature.edu.service.impl;
    
    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    
    import com.nature.edu.dao.BasUserMapper;
    
    import com.nature.edu.entity.BasUser;
    
    import com.nature.Response;
    
    import com.nature.edu.service.IUserService;
    
    import com.nature.edu.vo.UserVO;
    
    import com.xuanner.seq.utils.UUIDUtils;
    
    import org.apache.commons.lang.StringUtils;
    
    import org.slf4j.Logger;
    
    import org.slf4j.LoggerFactory;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    /**
    
    * @author wangck
    
    * @date 2019/7/25
    
    */
    
    @Service("userService")
    
    public class UserServiceImplimplements IUserService {
    
    private static final Loggerlogger = LoggerFactory.getLogger(UserServiceImpl.class);
    
    @Autowired
    
        private BasUserMapperbasUserMapper;
    
    @Override
    
        public Response addUser(UserVO user) {
    
    if (user ==null) {
    
    logger.error("添加用户时,用户信息不能为空'");
    
    return Response.failResult("用户信息不能为空");
    
    }
    
    String personName = user.getPersonName();
    
    if (StringUtils.isBlank(personName)) {
    
    logger.error("添加用户时,personName不能为空'");
    
    return Response.failResult("用户姓名不能为空");
    
    }
    
    BasUser basUser =new BasUser();
    
    basUser.setUserId(UUIDUtils.uuid());
    
    basUser.setUserNo(user.getUserNo());
    
    basUser.setUserName(user.getUserName());
    
    basUser.setPersonName(user.getPersonName());
    
    Integer count =basUserMapper.insert(basUser);
    
    if (count >0) {
    
    logger.info("添加用户成功,用户信息:{}", basUser);
    
    return Response.successResult("添加用户成功",true);
    
    }else {
    
    logger.error("添加用户失败,用户信息:{}", basUser);
    
    return Response.failResult("添加用户失败",false);
    
    }
    
    }
    
    @Override
    
        public Response modifyUser(UserVO user) {
    
    if (user ==null) {
    
    logger.error("修改用户时,用户信息不能为空'");
    
    return Response.failResult("用户信息不能为空");
    
    }
    
    String userId = user.getUserId();
    
    if (StringUtils.isBlank(userId)) {
    
    logger.error("修改用户时,userId不能为空'");
    
    return Response.failResult("用户Id不能为空");
    
    }
    
    BasUser basUser =new BasUser();
    
    basUser.setUserId(userId);
    
    basUser.setUserNo(user.getUserNo());
    
    basUser.setUserName(user.getUserName());
    
    basUser.setPersonName(user.getPersonName());
    
    Integer count =basUserMapper.updateById(basUser);
    
    if (count >0) {
    
    logger.info("修改用户成功,用户信息:{}", basUser);
    
    return Response.successResult("修改用户成功",true);
    
    }else {
    
    logger.error("修改用户失败,用户信息:{}", basUser);
    
    return Response.failResult("修改用户失败",false);
    
    }
    
    }
    
    @Override
    
        public Response deleteUser(String userId) {
    
    if (StringUtils.isBlank(userId)) {
    
    logger.error("删除用户时,userId不能为空'");
    
    return Response.failResult("用户Id不能为空");
    
    }
    
    Integer count =basUserMapper.deleteById(userId);
    
    if (count >0) {
    
    logger.info("删除用户成功,用户Id:{}", userId);
    
    return Response.successResult("删除用户成功",true);
    
    }else {
    
    logger.error("删除用户失败,用户id:{}", userId);
    
    return Response.failResult("删除用户失败",false);
    
    }
    
    }
    
    @Override
    
        public Response getUser(String userId) {
    
    if (StringUtils.isBlank(userId)) {
    
    logger.error("查询用户信息时,userId不能为空'");
    
    return Response.failResult("用户Id不能为空");
    
    }
    
    BasUser basUser =basUserMapper.selectById(userId);
    
    if (basUser !=null) {
    
    UserVO user =new UserVO();
    
    user.setUserId(basUser.getUserId());
    
    user.setUserNo(basUser.getUserNo());
    
    user.setUserName(basUser.getUserName());
    
    user.setUserHead(basUser.getUserHead());
    
    user.setPersonName(basUser.getPersonName());
    
    user.setPinyName(basUser.getPinyName());
    
    logger.info("查询用户成功,用户Id:{}", userId);
    
    return Response.successResult("查询用户成功", user);
    
    }else {
    
    logger.error("查询用户失败,用户Id:{}", userId);
    
    return Response.failResult("查询用户失败",null);
    
    }
    
    }
    
    @Override
    
        public Response> getUserPage(String searchName, Page page) {
    
    List list =basUserMapper.selectUserPage(searchName, page);
    
    page.setRecords(list);
    
    return Response.successResult("查询成功", page);
    
    }
    
    }
    
    

    步骤五:启动工程测试,查看日志以及druid控制台

    1. 添加用户
    image

    2)分页查询用户

    image
    1. 查看后台日志输出(日志拦截器)
    image

    4)查看druid控制台,输入DruidStatViewServlet 配置的登账账号密码

    image

    使用说明

    代码发布到码云上:https://gitee.com/nature-edu/edu-parent

    请关注我的微信公众号:

    image

    相关文章

      网友评论

        本文标题:第5篇 springboot2 集成mybatis-plus3

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