首页 > 编程语言 > MyBatis-Plus+Druid配置及应用详解
2020
11-16

MyBatis-Plus+Druid配置及应用详解

Mybatis-Plus的配置

1.Maven插件

velocity-engine-core是mybatis-plus自动生成代码所依赖的模板(不用自动生成代码功能可不用)

  <dependency>
  <groupId>com.baomidou</groupId>
   <artifactId>mybatis-plus-boot-starter</artifactId>
   <version>3.0.6</version>
 </dependency>
 <dependency>
  <groupId>org.apache.velocity</groupId>
  <artifactId>velocity-engine-core</artifactId>
  <version>2.2</version>
 </dependency>

2.application.properties配置

和普通mysql配置相同,没有额外配置

#mysql 连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

3.Mapper相关注解

@MapperScan中直接mapper文件所在的package

@SpringBootApplication
@EnableTransactionManagement
@EnableEurekaClient
@MapperScan("com.example.demo.dao")
public class DemoApplication {

 public static void main(String[] args) {
 SpringApplication.run(DemoApplication.class, args);
 }
}

4.创建数据库表


5.创建JavaBean(推荐使用Lombok插件方式) - Model层

@Data
@TableName("area")
@ToString(callSuper=true, includeFieldNames=true)
@AllArgsConstructor
@NoArgsConstructor
public class Area implements Serializable{
 
 private static final long serialVersionUID = 1L;
 private String id;
 private String name;
 private int sort; 
}

6.创建Mapper - DAO层

只有自定义SQL时,mapper中才有内容, 使用mybatis-plus自带CRUD语句或者构造器拼接语句时, mapper通常为空

public interface AreaMapper extends BaseMapper<Area> {
 
 //通过mybatis-plus提供的注解,直接自定义SQL
 @Select("select name from area where sort > ${sort}")
 List<String> getBySort2(@Param("sort")int sort);
}

8.创建逻辑接口 - Service层

public interface IAreaService {
 
 public Area getById(String id);
 
 public List<Area> selectAll();
 
 public int updateByPrimaryKeySelective(Area record);
 
 public int deleteByPrimaryKey(String id);
 
 public int insertSelective(Area record);
 
 public List<Area> getBySort();
 
 public List<String> getBySort2(int sort);

}

9.创建逻辑类 - Service层

Mybatis-Plus使用SQL的3种常见方法:
a. 使用mybatis-plus自带CRUD方法: 直接用mapper的自带方法
b. 使用mybatis-plus提供的条件构造器,拼接where条件
c. 使用@Select,@Update等注解, 自己写SQL+参数

@Service
public class AreaServiceImpl implements IAreaService {

 @Autowired
 public AreaMapper areaMapper;

 //使用mybatis-plus自带CRUD方法
 @Override
 public Area getById(String id) {
 return areaMapper.selectById(id);
 } 
 
 @Override
 public List<Area> selectAll() {
 return areaMapper.selectList(null);
 }
 
 @Override
 @Transactional
 public int updateByPrimaryKeySelective(Area record) {
 return areaMapper.updateById(record);
 }
 
 @Override
 public int deleteByPrimaryKey(String id) {
 return areaMapper.deleteById(id);
 }
 
 @Override
 public int insertSelective(Area record) {
 return areaMapper.insert(record);
 }
 
 //使用mybatis-plus提供的条件构造器,拼接条件
 @Override
 public List<Area> getBySort(){
 QueryWrapper<Area> queryWrapper = new QueryWrapper<>();
 queryWrapper.lambda().gt(Area::getSort, 40)
  .lt(Area::getSort, 80);
 return areaMapper.selectList(queryWrapper);
 }
 
 //通过mybatis-plus提供的注解,直接自定义SQL(定义在mapper中)
 @Override
 public List<String> getBySort2(int sort){
 return areaMapper.getBySort2(sort);
 
 }

}

10.创建接口 - Controller层

@RestController
@RequestMapping("/area")
public class AreaController {

 @Autowired
 private IAreaService areaService;
 
 @Autowired
 private DbpropertiesService dbproService;
 
 @Autowired
 private Area area;
 
 @Resource
 protected HttpServletRequest request;

 @RequestMapping(value = "/getAreaInfo",method=RequestMethod.GET)
 public Area getAreaInfo(@RequestParam(value="id") String id) {
 area = areaService.getById(id);
 return area;
 }
 
 @RequestMapping(value = "/getAreaAllInfo",method=RequestMethod.GET)
 public List<Area> getAreaInfo() {
 List<Area> arlist = areaService.selectAll();
 return arlist;
 }
 
 @RequestMapping(value ="/updateAreaName",method=RequestMethod.PUT)
 public int updateAreaInfo(@RequestParam(value="id") String id,@RequestParam(value="name",required=false) String name,@RequestParam(value="sort",required=false) Integer sort) {
 area.setId(id);
 area.setName(name); 
 area.setSort(sort);
 int ar = areaService.updateByPrimaryKeySelective(area);
 return ar;
 }
 
 @RequestMapping(value ="/deleteAreaName",method=RequestMethod.DELETE)
 public int deleteAreaInfo(@RequestParam(value="id") String id) {
 int ar = areaService.deleteByPrimaryKey(id);
 return ar;
 }
 
// @RequestMapping(value ="/insertAreaName",method=RequestMethod.POST)
// public int insertAreaInfo(@RequestParam(value="id") String id,@RequestParam(value="name",required=false) String name,@RequestParam(value="sort",required=false) Integer sort) {
// area.setId(id);
// area.setName(name); 
// area.setSort(sort);
// int ar = areaService.insertSelective(area);
// return ar;
// } 
 
 @RequestMapping(value ="/insertAreaName",method=RequestMethod.POST)
 public int insertAreaInfo(@RequestBody Area area) {
 int ar = areaService.insertSelective(area);
 return ar;
 }
 
 @RequestMapping(value ="/selectBySort",method=RequestMethod.GET)
 public List<Area> selectAreaSort() {
 List<Area> arList = areaService.getBySort();
 return arList;
 }
 
 @RequestMapping(value ="/selectBySort2",method=RequestMethod.GET)
 public List<String> selectAreaSort2(@RequestParam(value="sort") int sort) {
 List<String> arList = areaService.getBySort2(sort);
 return arList;
 }
}

参考文档:
https://mp.baomidou.com/

数据源datasource

数据源是数据库连接的规范接口

Springboot默认支持4种数据源类型,定义在 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration 中,分别是:

org.apache.tomcat.jdbc.pool.DataSource
 com.zaxxer.hikari.HikariDataSource
 org.apache.commons.dbcp.BasicDataSource
 org.apache.commons.dbcp2.BasicDataSource

在不指定数据源类型时, SpringBoot默认使用tomcat.jdbc

如果需要使用第三方数据源, 比如Druid, 步骤如下:

Druid的配置

1.Maven配置

 <dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid</artifactId>
   <version>1.1.3</version>
  </dependency>

2.application.properties配置

spring.datasource.type需要指定为Druid
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

其他的Druid自有属性,可以写在properties中也可以写在Druid的配置类中

@ConfigurationProperties(prefix = "spring.datasource")
public class DruidConfiguration {
 
 private String url;
 private String username;
 private String password;
 private String driverClassName;
 private int initialSize = 5;
 private int minIdle = 5;
 private int maxActive = 10;
 private int maxWait = 2;
 private int timeBetweenEvictionRunsMillis = 1000 * 60;
 private int minEvictableIdleTimeMillis = 1000 * 60 * 30;
 private String validationQuery;
 private boolean testWhileIdle = false;
 private boolean testOnBorrow = true;
 private boolean testOnReturn = false;
 private boolean poolPreparedStatements = false;
 private int maxPoolPreparedStatementPerConnectionSize = -1;
 private String filters;
 private boolean useGlobalDataSourceStat = false;
 private String connectionProperties;

3.定义数据源

@Configuration
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSource2Config {
 
 private String url;
 private String username;
 private String password;
 
 @Bean
 public DataSource getDataSource() {
 DruidDataSource dataSource = new DruidDataSource();
 dataSource.setUrl(url);
 dataSource.setUsername(username);// 用户名
 dataSource.setPassword(password);// 密码
 return dataSource;
 }
 
 public String getUrl() {
 return url;
 }
 
 public void setUrl(String url) {
 this.url = url;
 }
 
 public String getUsername() {
 return username;
 }
 
 public void setUsername(String username) {
 this.username = username;
 }
 
 public String getPassword() {
 return password;
 }
 
 public void setPassword(String password) {
 this.password = password;
 }
}

4.配置Druid的监控器和为事务管理器指定Druid数据源, 最终Configuration文件如下:

Druid监控配置:

ServletRegistrationBean
FilterRegistrationBean

事务管理器配置:
PlatformTransactionManager

package com.example.demo.dao.druid;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Qualifier;
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 org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;


@Configuration
public class DruidConfiguration {
 
 @Bean
 public ServletRegistrationBean druidServlet() {
  //logger.info("init Druid Servlet Configuration ");
  ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
  servletRegistrationBean.setServlet(new StatViewServlet());
  servletRegistrationBean.addUrlMappings("/druid/*");
  Map<String, String> initParameters = new HashMap<String, String>();
  initParameters.put("loginUsername", "admin");
  initParameters.put("loginPassword", "admin");
  initParameters.put("resetEnable", "false");
  initParameters.put("allow", ""); 
  initParameters.put("deny", "");
  servletRegistrationBean.setInitParameters(initParameters);
  return servletRegistrationBean;
 }

 @Bean
 public FilterRegistrationBean filterRegistrationBean() {
  FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
  filterRegistrationBean.setFilter(new WebStatFilter());
  filterRegistrationBean.addUrlPatterns("/*");
  filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
  return filterRegistrationBean;
 }
 
 @Bean
 @Primary
 public PlatformTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) {
  DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
  dataSourceTransactionManager.setDataSource(dataSource);
  return dataSourceTransactionManager;
 }
 
 
}

//Druid配置Bean
@Component
@ConfigurationProperties(prefix = "spring.datasource")
class DruidDataSourceProperties {
 
 private String url;
 private String username;
 private String password;
 private String driverClassName;
 private int initialSize = 5;
 private int minIdle = 5;
 private int maxActive = 10;
 private int maxWait = 2;
 private int timeBetweenEvictionRunsMillis = 1000 * 60;
 private int minEvictableIdleTimeMillis = 1000 * 60 * 30;
 private String validationQuery;
 private boolean testWhileIdle = false;
 private boolean testOnBorrow = true;
 private boolean testOnReturn = false;
 private boolean poolPreparedStatements = false;
 private int maxPoolPreparedStatementPerConnectionSize = -1;
 private String filters = "stat";
 private boolean useGlobalDataSourceStat = false;
 private String connectionProperties;
 
 @Bean  //声明其为Bean实例,将数据源设置为druid
 @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.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;
 }
 
 public String getUrl() {
  return url;
 }

 public void setUrl(String url) {
  this.url = url;
 }

 public String getUsername() {
  return username;
 }

 public void setUsername(String username) {
  this.username = username;
 }

 public String getPassword() {
  return password;
 }

 public void setPassword(String password) {
  this.password = password;
 }

 public String getDriverClassName() {
  return driverClassName;
 }

 public void setDriverClassName(String driverClassName) {
  this.driverClassName = driverClassName;
 }

 public int getInitialSize() {
  return initialSize;
 }

 public void setInitialSize(int initialSize) {
  this.initialSize = initialSize;
 }

 public int getMinIdle() {
  return minIdle;
 }

 public void setMinIdle(int minIdle) {
  this.minIdle = minIdle;
 }

 public int getMaxActive() {
  return maxActive;
 }

 public void setMaxActive(int maxActive) {
  this.maxActive = maxActive;
 }

 public int getMaxWait() {
  return maxWait;
 }

 public void setMaxWait(int maxWait) {
  this.maxWait = maxWait;
 }

 public int getTimeBetweenEvictionRunsMillis() {
  return timeBetweenEvictionRunsMillis;
 }

 public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) {
  this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
 }

 public int getMinEvictableIdleTimeMillis() {
  return minEvictableIdleTimeMillis;
 }

 public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) {
  this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
 }

 public String getValidationQuery() {
  return validationQuery;
 }

 public void setValidationQuery(String validationQuery) {
  this.validationQuery = validationQuery;
 }

 public boolean isTestWhileIdle() {
  return testWhileIdle;
 }

 public void setTestWhileIdle(boolean testWhileIdle) {
  this.testWhileIdle = testWhileIdle;
 }

 public boolean isTestOnBorrow() {
  return testOnBorrow;
 }

 public void setTestOnBorrow(boolean testOnBorrow) {
  this.testOnBorrow = testOnBorrow;
 }

 public boolean isTestOnReturn() {
  return testOnReturn;
 }

 public void setTestOnReturn(boolean testOnReturn) {
  this.testOnReturn = testOnReturn;
 }

 public boolean isPoolPreparedStatements() {
  return poolPreparedStatements;
 }

 public void setPoolPreparedStatements(boolean poolPreparedStatements) {
  this.poolPreparedStatements = poolPreparedStatements;
 }

 public int getMaxPoolPreparedStatementPerConnectionSize() {
  return maxPoolPreparedStatementPerConnectionSize;
 }

 public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) {
  this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
 }

 public String getFilters() {
  return filters;
 }

 public void setFilters(String filters) {
  this.filters = filters;
 }


 public boolean isUseGlobalDataSourceStat() {
  return useGlobalDataSourceStat;
 }

 public void setUseGlobalDataSourceStat(boolean useGlobalDataSourceStat) {
  this.useGlobalDataSourceStat = useGlobalDataSourceStat;
 }

 public String getConnectionProperties() {
  return connectionProperties;
 }

 public void setConnectionProperties(String connectionProperties) {
  this.connectionProperties = connectionProperties;
 }
}

5.Druid性能监控台
http://localhost:8092/druid/index.html

到此这篇关于MyBatis-Plus+Druid配置及应用详解的文章就介绍到这了,更多相关MyBatis-Plus Druid配置内容请搜索自学编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持自学编程网!

编程技巧