美文网首页开源项目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