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

来源:脚本之家  责任编辑:小易  

mybatis 配置2113连接池<!-- 配置数据源 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><!-- 基本属性 url、user、password --><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/ssmhello" /><property name="username" value="root" /><property name="password" value="2424246258" /><property name="initialSize" value="1" /><property name="minIdle" value="1" /><property name="maxActive" value="20" /><property name="maxWait" value="60000" /><!-- 超过5261时间限4102制是否回收 --><property name="removeAbandoned" value="true" /><!-- 超过时间限制多长;1653 --><property name="removeAbandonedTimeout" value="180" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="300000" /><!-- 用来检测连接是否有效的sql,要求是一个查询语句--><property name="validationQuery" value="SELECT 1" /><!-- 申请连接的时候检测 --><property name="testWhileIdle" value="true" /><!-- 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 --><property name="testOnBorrow" value="false" /><!-- 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能 --><property name="testOnReturn" value="false" /></bean>www.zgxue.com防采集请勿采集本网。

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=UTCspring.datasource.username=rootspring.datasource.password=passwordspring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.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@NoArgsConstructorpublic 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+参数

@Servicepublic 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需要指定为Druidspring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTCspring.datasource.username=rootspring.datasource.password=passwordspring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.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;@Configurationpublic 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配置内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网! 您可能感兴趣的文章:MyBatis-Plus集成Druid环境搭建的详细教程

mybatis是警察.druid是武2113器库(有很5261多枪).jdbc是武器商(他们造枪给武器库).当你需要一次"除暴4102安良"时,你需要去找1653警察,警察从武器库拿枪干活.以往的开发,是你使用jdbc直接造枪,然后自己干活.jdbc整合了:加载数据库驱动,创建连接,写原生语句,执行,关闭这些东西.而mybatis是对jdbc的封装,他允许你通过配置的形式,配置数据库参数,并且允许你通过xml来写动态sql语句.<if:test>让你可以把sql变得灵活起来.并且还能将你的查询结果直接映射到你想要的实体上面.然后你就去配置你的用户名,密码,连接超时,等等.等你下次使用mybatis时,他后面会根据你的配置,帮你加载数据库驱动,创建连接,写原生语句,执行,关闭.但是mybatis发现,在你每次访问都要重新创建创建连接,写,关.很麻烦,所以mybatis说,我可以接受你再汪大配置一个连接池,比如druid.mybatis让你指定连接池是谁,如druid.之后将原来自己需要搞的东西都交给druid.什么账号了,密码了.都给他,让druid帮你创建一批连接,在你需要用的时候,mybatis从druid里面拿一个就行.下面是一次简单的访问流程: controller->service->dao->mapper1.首先项目启动时druid就已经使用jdbc创建橡陵咐好一堆连接了,留待后用.2.当请求到mapper时,mybatis框架创建临时类.3.然后将动态sql进行替换重写,变成梁纯原始的native sql.4.从druid拿到一个连接.5.将sql通过连接交给数据库执行.6.然后获取执行结果.7.mybatis进行将结果进行映射,返回数据.说的有点乱,希望能说清楚吧...更多追问追答追问谢谢你的回答, 这些流程,我都知道的,我想知道更加具体点;mybatis是怎么加载sql的, mybatis怎么获取到druid池中的连接的, druid:是怎么获取到数据库的连接的,只要把这三个问题回答清楚就可以了, 如果能结合源码讲那就更好了再次对你的回答表示感谢追答额...那我可能帮不到你,我只了解宏观的流程,具体的源码细节就看过一次,然后就没再记着.mybatis加载sql是在你调用dao方法时要创建临时类,创建临时类的过程中,使用sql解析器解析mapper文件,创建对应的类方法.之后的执行和JDBC一样,将解析后的sql语句交给数据库执行,获取返回集ResultSet,然后封装.druid连接池也是,你可以自己根据JDBC写一个连接池,创建好几个数据库连接,放入一个集合中,下次需要执行sql时,先从集合中拿取,拿到了就直接使用拿到的链接执行,没拿到就创建新的,然后放入集合.druid获取数据库连接和JDBC的过程一模一样...你问这个问题,可能是对JDBC不太熟吧...你可以先从JDBC的操作开始,先完全从JDBC操作一次数据库就知道了...而具体源码我爱莫能助了...您看看别的论坛有没有解析...追问好的. 谢谢你内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • java值传递之swap()方法不能交换的解决
  • spring整合redis缓存并以注解(@cacheable、@cacheput、@cacheevi
  • spring boot中使用rabbitmq的示例代码
  • java8 stream sort自定义复杂排序案例
  • scala+redis实现分布式锁的示例代码
  • java实现图片验证码具体代码
  • java i/o深入学习之file和randomaccessfile
  • java lock接口详解及实例代码
  • springsecurity权限控制实现原理解析
  • java多线程之readwritelock读写分离的实现代码
  • mybatis+druid+jdbc 原理介绍
  • Mybatis如何配置连接池
  • 如何搭建maven+druid+mybatis+spring
  • mybatis druid 数据库执行完需要收到关闭连接吗
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全c#教程vbvb.netc 语言java编程delphijavaandroidiosswiftscala易语言汇编语言其它相关首页javamybatis-plus集成druid环境搭建的详细教程java值传递之swap()方法不能交换的解决spring整合redis缓存并以注解(@cacheable、@cacheput、@cacheevispring boot中使用rabbitmq的示例代码java8 stream sort自定义复杂排序案例scala+redis实现分布式锁的示例代码java实现图片验证码具体代码java i/o深入学习之file和randomaccessfilejava lock接口详解及实例代码springsecurity权限控制实现原理解析java多线程之readwritelock读写分离的实现代码java使double保留两位小数的多方intellij idea 2020最新激活码(亲java8 十大新特性详解java.net.socketexception: connjava写入文件的几种方法分享java环境变量的设置方法(图文教程java 十六进制与字符串的转换java list用法示例详解java中file类的使用方法java 字符串截取的三种方法(推荐springboot整合mongodb的示例java模拟hibernate一级缓存示例分享springboot热部署springloaded实现过程解spring aop定义before增加实战案例详解java 使用poi把数据库中数据导入excel的解java读取txt文件代码片段idea实现远程调试步骤详解java单例模式和多例模式实例分析spring jpa配置文件eclipse报错如何解决java字符串比较方法equals的空指针异常的
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved