2019独角兽企业重金招聘Python工程师标准>>>

1.本篇作为对前一篇的补充,可参考

https://my.oschina.net/swiftloop/blog/1031404

2.具体实现

1)pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.sorata.datasource</groupId><artifactId>mybatis-pagehelper-mapper</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>mybatis-pagehelper-mapper</name><description>集成mybatis多数据源与分页插件和通用mapper的使用</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><!-- 这里是配置主从库的包,当生成不同的数据库下的dao、mapper、entity需要更改此包,或者是直接在generator.xml文件下硬编码--><!--存放生成的dao和entity--><targetJavaProject>${basedir}/src/main/java</targetJavaProject><!--end--><!--  XML生成路径  --><targetResourcesProject>${basedir}/src/main/resources</targetResourcesProject><targetXMLPackage>mapper/master</targetXMLPackage><!--end--><!--存放dao的包--><targetMapperPackage>com.sorata.datasource.dao.master</targetMapperPackage><!--end--><!--存放entity的包--><targetModelPackage>com.sorata.datasource.entity.master</targetModelPackage><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.29</version></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.1.1</version></dependency><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>1.1.1</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-commons</artifactId><version>1.13.1.RELEASE</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.2</version><configuration><configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile><overwrite>true</overwrite><verbose>true</verbose></configuration><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.30</version></dependency><dependency><groupId>tk.mybatis</groupId><artifactId>mapper</artifactId><version>3.4.0</version></dependency></dependencies></plugin></plugins></build></project>

2)generator.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><properties resource="application.yml"/><context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat"><property name="beginningDelimiter" value="`"/><property name="endingDelimiter" value="`"/><plugin type="tk.mybatis.mapper.generator.MapperPlugin"><!-- 这里是项目包下的一个类--><property name="mappers" value="com.sorata.datasource.webmvc.MyMapper"/></plugin><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/test1"userId="root"password="root"></jdbcConnection><javaModelGenerator targetPackage="${targetModelPackage}" targetProject="${targetJavaProject}"/><sqlMapGenerator targetPackage="${targetXMLPackage}"  targetProject="${targetResourcesProject}"/><javaClientGenerator targetPackage="${targetMapperPackage}" targetProject="${targetJavaProject}" type="XMLMAPPER" /><table tableName="test" domainObjectName="CustomTest"><!--mysql 配置--><generatedKey column="id" sqlStatement="Mysql" identity="true"/><!--oracle 配置--><!--<generatedKey column="id" sqlStatement="select SEQ_{1}.nextval from dual" identity="false" type="pre"/>--></table></context>
</generatorConfiguration>

3)MyMapper.java

package com.sorata.datasource.webmvc;import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;/*** Created by: Sorata 17/4/12 下午12:03*/
public interface MyMapper<T> extends Mapper<T>,MySqlMapper<T> {
}

4)MasterDataSourceConfig.java

package com.sorata.datasource.config;import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;/*** Created by :  Sorata   2017/6/27 0027 下午 3:56.*/
@Configuration
@MapperScan(basePackages = MasterDataSourceConfig.MASTER_PACKAGE,sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {private Logger logger = LoggerFactory.getLogger(MasterDataSourceConfig.class);static final String  MASTER_PACKAGE = "com.sorata.datasource.dao.master";private static final String MASTER_MAPPER_LOCAL = "classpath:mapper/master/*.xml";/** 配置一个主库* @return  DruidDataSource*/@Bean(name = "masterDataSource")@Primary@ConfigurationProperties(prefix = "druid.datasource")public DruidDataSource masterDruidDataSource(){return new DruidDataSource();}@Bean(name = "masterSqlSessionFactory")@Primarypublic SqlSessionFactory masterSqlSessionFactory(){final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();sessionFactoryBean.setDataSource(masterDruidDataSource());try {sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MASTER_MAPPER_LOCAL));return sessionFactoryBean.getObject();} catch (Exception e) {logger.error("配置主库的SqlSessionFactory失败,error:{}",e.getMessage());throw new RuntimeException(e.getMessage());}}@Bean(name = "masterTransactionManager")@Primarypublic DataSourceTransactionManager masterTransactionManager(){return new DataSourceTransactionManager(masterDruidDataSource());}}

5)CustomDataSourceConfig.java

package com.sorata.datasource.config;import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;/*** Created by :  Sorata   2017/6/27 0027 下午 3:56.*/
@Configuration
@MapperScan(basePackages = CustomDataSourceConfig.CUSTOM_PACKAGE,sqlSessionFactoryRef = "customSqlSessionFactory")
public class CustomDataSourceConfig {private Logger logger = LoggerFactory.getLogger(CustomDataSourceConfig.class);static final String CUSTOM_PACKAGE = "com.sorata.datasource.dao.custom";private static final String CUSTOM_MAPPER_LOCAL = "classpath:mapper/custom/*.xml";/** 配置一个从库* @return DruidDataSource*/@Bean(name = "customDataSource")@ConfigurationProperties(prefix = "custom.datasource")public DruidDataSource customDruidDataSource(){return new DruidDataSource();}@Bean(name = "customSqlSessionFactory")public SqlSessionFactory customSqlSessionFactory(){final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();sessionFactoryBean.setDataSource(customDruidDataSource());try {sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(CUSTOM_MAPPER_LOCAL));return sessionFactoryBean.getObject();} catch (Exception e) {logger.error("配置从库的SqlSessionFactory失败,error:{}",e.getMessage());throw new RuntimeException(e.getMessage());}}@Bean(name = "customTransactionManager")public DataSourceTransactionManager customTransactionManager(){return new DataSourceTransactionManager(customDruidDataSource());}}

6)DataSourcesAutoConfiguration.java

package com.sorata.datasource.config;import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.transaction.ChainedTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;import javax.annotation.Resource;/*** Created by :  Sorata   2017/6/27 0027 下午 1:38.*/
@Configuration
@EnableTransactionManagement
@ConditionalOnBean({MasterDataSourceConfig.class,CustomDataSourceConfig.class})
public class DataSourcesAutoConfiguration  implements TransactionManagementConfigurer{@Resourceprivate MasterDataSourceConfig masterDataSourceConfig;@Resourceprivate CustomDataSourceConfig customDataSourceConfig;//  配置分布式事务管理 @Overridepublic PlatformTransactionManager annotationDrivenTransactionManager() {return  new  ChainedTransactionManager(masterDataSourceConfig.masterTransactionManager(),customDataSourceConfig.customTransactionManager());}}

说明:此处解决了,存在两个事务管理器的时候,使用注解时需要显示注明从库的事务管理器的问题

7)Druid  注意在启动类上加上@ServletComponentScan

package com.sorata.datasource.config;import com.alibaba.druid.support.http.StatViewServlet;import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;/*** Created by: guobo 17/1/19 下午5:20** alibaba druid 页面监控配置   访问url  http://localhost:8080/项目名/druid/index.html** 在使用springboot的时候,需要在启动类使用 @ServletComponentScan注解*/@SuppressWarnings("serial")
@WebServlet(urlPatterns = "/druid/*",initParams = {//@WebInitParam(name = "allow",value = "127.0.0.1,192.168.1.142"),//白名单@WebInitParam(name = "deny",value = "126.12.22.1"),//黑名单 (存在共同时,deny优先于allow)@WebInitParam(name="loginUsername",value="admin"),// 用户名@WebInitParam(name="loginPassword",value="123456"),// 密码@WebInitParam(name="resetEnable",value="false")// 禁用HTML页面上的“Reset All”功能})public class DruidStateViewServlet extends StatViewServlet {
}
package com.sorata.datasource.config;import com.alibaba.druid.support.http.WebStatFilter;import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;/*** Created by: guobo 17/1/19 下午5:27** alibaba druid的过滤*/
@WebFilter(filterName="druidWebStatFilter",urlPatterns="/*",initParams={@WebInitParam(name="exclusions",value="*.mp4,*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")// 忽略资源})
public class DruidStatFilter extends WebStatFilter {}

8)application.yml

druid:datasource:name: mydatabasesurl: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: roottype: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverfilters: stat,wall,log4jmaxActive: 20initialSize: 1maxWait: 60000minIdle: 1timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: select 'x'testWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: false  #如果是oracle 则可以设置为true  如果是mysql则设置false 分库分表较多的数据库,建议配置为false。maxOpenPreparedStatements: 20custom:datasource:name: mydatabases2url: jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: roottype: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverfilters: stat,wall,log4jmaxActive: 20initialSize: 1maxWait: 60000minIdle: 1timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: select 'x'testWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: false  #如果是oracle 则可以设置为true  如果是mysql则设置false 分库分表较多的数据库,建议配置为false。maxOpenPreparedStatements: 20pagehelper:helperDialect: mysqlreasonable: truesupportMethodsArguments: trueparams: count=countSql

3.总结

引入通用Mapper的依赖,与PageHelper的依赖之后,它们都是有自动的配置,Pagehelper在多数据源上有自动配置所以不需要在配置SqlSessionFactory的时候添加插件,添加的话会报添加多个分页插件的异常。而且使用ChainedTransactionManager管理多个事务管理器后不需要再显示的注明从库的管理器。

附:

Pagehelper:https://github.com/pagehelper/Mybatis-PageHelper

Mapper:http://git.oschina.net/free/Mapper/blob/master/wiki/mapper3/2.Integration.md

本项目:http://git.oschina.net/lencer93/mybatis-pagehelper-mapper

转载于:https://my.oschina.net/swiftloop/blog/1036943

Springboot集成通用Mapper与Pagehelper,实现mybatis+Druid的多数据源配置相关推荐

  1. springboot集成通用mapper与分页助手时报错,java.lang.NoSuchMethodException: com.github.abel533.provider.....

    java.lang.NoSuchMethodException: com.github.abel533.provider.MapperProvider.<init>()... 在启动类中 ...

  2. 通用Mapper和PageHelper 快速开始

    文章目录 一.什么是通用mapper 二.什么是pagehelper 三.MyBatis之分页插件(PageHelper)工作原理 四.mapper.pagehelper maven引入配置 1. 和 ...

  3. 一看就会一学就废之SpringBoot整合通用Mapper以及常用方法

    本文适合初次学习通用Mapper新鸟阅览,老生常谈,从三个大方向入手----是什么?能干什么?怎么用? 目录 一.通用Mapper是什么? 二.通用Mapper能干什么? 三.怎么使用通用Mapper ...

  4. SpringBoot整合通用mapper实现泛型BaseController增删改

    SpringBoot整合通用mapper实现泛型BaseController增删改 前言:目前写项目做需求时增删改查一直用得比较频繁,但是在做开发的时候,却并不想一次一次写重复的代码,尝试着整合了一下 ...

  5. 搭建SSM环境整合通用Mapper和PageHelper

    新建Maven工程 填写项目的Maven坐标 创建父工程依赖 ssm-parent 修改ssm-parent 的 pom.xml <project xmlns="http://mave ...

  6. SpringBoot+JdbcTemplate通用Mapper的实现

    文章目录 SpringBoot+JdbcTemplate通用Mapper的实现 通用Mapper 针对User的jdbcMapper 针对 User的Service 相应的Controller Spr ...

  7. Spring Boot 入门系列(二十三)整合Mybatis,实现多数据源配置!

    d之前介绍了Spring Boot 整合mybatis 使用注解方式配置的方式实现增删改查以及一些复杂自定义的sql 语句 .想必大家对spring boot 项目中,如何使用mybatis 有了一定 ...

  8. SpringBoot整合Mybatis,使用通用mapper和PageHelper进行分页

    乐哉码农 上节介绍了如何整合Security,这节就说下如何再Springboot下使用持久层框架mybatis和牛人封装的通用mapper与mybatis的整合,直接进入正题吧! 1.首先引入我们需 ...

  9. SpringBoot整合通用Mapper

    添加依赖 添加通用Mapper的依赖,注意还需要搭配MyBatis和对应数据库的驱动: <dependency><groupId>org.mybatis.spring.boot ...

  10. 【解析】spring-boot整合通用mapper

    问题描述: Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the m ...

最新文章

  1. 关于epel源的配置
  2. python清空列表clear_如何在Python中清空列表?
  3. 企业软件介绍主页html模板
  4. 漫步线性代数二十六——特征值和特征向量(续)
  5. 小福利,PMP考试真题刷起来,人人都当项目管理大师!
  6. 通俗易懂解释信源编码与信道编码的区别与联系
  7. VRay3.4 for SketchUp之次表面散射材质(3S材质)
  8. 最新版MySQL 8.0.22(Windows 64位)下载安装详细方法
  9. 坚果pro2刷回官方_坚果Pro2刷机教程刷TWRP面具详细步骤_软件开发_IT综合服务
  10. [集训队作业2018]喂鸽子
  11. 定点 浮点 神经网络 量化_定点量化
  12. Octane帮助文档中英双语版免费下载、oc用户手册、oc帮助手册
  13. .locked勒索病毒来势汹汹该怎么办?
  14. 自动驾驶车辆控制(车辆运动学模型)
  15. (计算机组成原理)CPU的功能
  16. matlab实现聚类分析
  17. 互联网之子 Aaron Swarts 想要看到的世界
  18. 相机芯片尺寸及选型公式
  19. 线性拟合2-正交回归
  20. 电信运营商重组出台内幕

热门文章

  1. C#基础知识回顾-- 反射(1)
  2. HTML中meta的作用
  3. SPOJ PHRASES Relevant Phrases of Annihilation(后缀数组 + 二分)题解
  4. Laravel nginx 伪静态规则
  5. 菜鸟认知--DIP,Ioc,DI,Ioc容器
  6. WinForm sender初级应用
  7. NSString copy or not (strong)?
  8. ORACLE PATCH 版本的查询 PL/SQL
  9. PHP中的的一个挺好用的函数 array_chunk
  10. 动态添加table表格内容,填充审批意见。