写本文章的目的
网上有很多这样类似的文章,但很多是基于的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配置类
- 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控制台
- 添加用户
2)分页查询用户
image- 查看后台日志输出(日志拦截器)
4)查看druid控制台,输入DruidStatViewServlet 配置的登账账号密码
image使用说明
代码发布到码云上:https://gitee.com/nature-edu/edu-parent
请关注我的微信公众号:
image
网友评论