用了一段时间SpringBoot,之前配置MYBATIS ,在打包WAR 放到tomcat下正常,但是WAR已经过时了,现在流行直接打包JAR 丢到DOCKER 里,无奈JAR 启动的时候MAPPER 扫描有问题,只能说之前整合MYBATIS 的方式不对.

这次的整合应该是不存在加载顺序引起的问题,使用了一段时间,妥妥的,记录下来

pom.xml

    <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>

application.yml,支持多个数据源,有多少就写多少个,但这是静态的多数据源方式,也可以动态往Spring的数据源路由里面丢

spring:
datasource:
# readSize: 1
# name: writeDataSource
type: com.alibaba.druid.pool.DruidDataSource
write:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&useSSL=true
username: root
password: 123
initialSize: 10
maxActive: 100
maxWait: 60000
minIdle: 5
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
DataSourceConfig.java
/**
* Created by ZhenWeiLai on 2016/11/20.
*/
@Configuration
@EnableTransactionManagement
@MapperScan("com.lzw.**.dao")//mybatis扫描
public class DataSourceConfig implements TransactionManagementConfigurer {
@Value("${spring.datasource.type}")
private Class<? extends DataSource> dataSourceType; @Primary
@Bean(name = "writeDataSource")
@ConfigurationProperties(prefix = "spring.datasource.write")
public DataSource writeDataSource() {
return DataSourceBuilder.create().type(dataSourceType).build();
} /**
* 有多少个从库就要配置多少个
* @return
*/
// @Bean(name = "readDataSource")
// @ConfigurationProperties(prefix = "spring.datasource.read")
// public DataSource readDataSourceOne() {
// return DataSourceBuilder.create().type(dataSourceType).build();
// } /**
* AbstractRoutingDataSource 这破玩意 继承了AbstractDataSource ,AbstractDataSource又实现了DataSource
* 所以可以直接丢去构建 SqlSessionFactory
* @return
*/
@Bean("routingDataSource")
// @Bean(name="routingDataSource",initMethod = "init",destroyMethod = "close")
public MyRoutingDataSource dataSourceProxy(){
// int size = Integer.parseInt(dataSourceSize);
MyRoutingDataSource proxy = new MyRoutingDataSource();
Map<Object,Object> dataSourceMap = new HashMap<>();
DataSource writeSource = writeDataSource();
// DataSource readSource = getReadDataSource(); dataSourceMap.put(TargetDataSource.WRITE.getCode(),writeSource);
// dataSourceMap.put(TargetDataSource.READ.getCode(),readSource); proxy.setDefaultTargetDataSource(dataSourceMap.get(TargetDataSource.WRITE.getCode()));
proxy.setTargetDataSources(dataSourceMap);
return proxy;
} @Bean
public SqlSessionFactory sqlSessionFactory() {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSourceProxy());
bean.setTypeAliasesPackage("com.lzw");
bean.setVfs(SpringBootVFS.class);
//添加XML目录
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
try {
bean.setMapperLocations(resolver.getResources("classpath:**/mapper/**/*.xml"));
return bean.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
} /**
* 事务配置,考虑多数据源情况下
* @return
*/
@Bean
public PlatformTransactionManager txManager() {
return new DataSourceTransactionManager(dataSourceProxy());
} @Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return txManager();
} }
MyRoutingDataSource.java
/**
* Created by ZhenWeiLai on 2016/11/22.
*/
public class MyRoutingDataSource extends AbstractRoutingDataSource {
/**
* 这里可以做简单负载均衡,暂时用不上
*/
// private int dataSourceOrder;
// private AtomicInteger count = new AtomicInteger(0);
public MyRoutingDataSource() {
} // public MyRoutingDataSource(int _dataSourceOrder){
// this.dataSourceOrder = _dataSourceOrder;
// } /**
* 这个方法会根据返回的key去配置文件查找数据源
*
* @return
*/
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getTargetDataSource();
}
}
TargetDataSource.java
/**
* Created by ZhenWeiLai on 2016/11/22.
* 配置读写分离或者多数据源
*/
public enum TargetDataSource { WRITE("write","主库"), READ("read","从库"), CREATE("create","建库"); final private String code; final private String name; TargetDataSource(String _code,String _name) {
this.code = _code;
this.name = _name;
} public String getCode() {
return code;
} public String getName(){
return name;
} public static String getNameByCode(String _code){
for(TargetDataSource item : TargetDataSource.values()){
if(item.getCode().equals(_code)){
return item.getName();
}
}
return "";
}
}

喜欢的话,可以使用AOP 注解切换数据源,但是要注意滥用AOP,加上全局统一AOP异常拦截,以及Spring AOP事务,顺序问题,处理不好可能会引起事务失效,或者异常拦截失效,也可能是数据源切换失效.

AOP事务如果先开启了,那么AOP切换数据源将无效

/**
* Created by ZhenWeiLai on 2016/11/22.
* 切换数据源的注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DataSourceSwitch {
String targetDataSource() default "";
}
DataSourceContextHolder.java
/**
* Created by ZhenWeiLai on 2016/11/22.
* 多数据源/读写分离
*/
public class DataSourceContextHolder {
private static final ThreadLocal<String> dataSourceLocal = new ThreadLocal<>(); public static ThreadLocal<String> getDataSourceLocal() {
return dataSourceLocal;
} /**
* 从库 可以有多个
*/
public static void read() {
dataSourceLocal.set(TargetDataSource.READ.getCode());
} /**
* 主库 只有一个
*/
public static void write() {
dataSourceLocal.set(TargetDataSource.WRITE.getCode());
} public static String getTargetDataSource() {
return dataSourceLocal.get();
}
}

SpringBoot整合Mybatis,多数据源,事务,支持java -jar 启动.的更多相关文章

  1. SpringBoot整合Mybatis多数据源 (AOP+注解)

    SpringBoot整合Mybatis多数据源 (AOP+注解) 1.pom.xml文件(开发用的JDK 10) <?xml version="1.0" encoding=& ...

  2. 三、SpringBoot 整合mybatis 多数据源以及分库分表

    前言 说实话,这章本来不打算讲的,因为配置多数据源的网上有很多类似的教程.但是最近因为项目要用到分库分表,所以让我研究一下看怎么实现.我想着上一篇博客讲了多环境的配置,不同的环境调用不同的数据库,那接 ...

  3. SpringBoot整合mybatis多数据源,支持分布式事务

    编码工具:IDEA SpringBoot版本:2.0.1 JDK版本:1.8 1.使用IDEA构建一个Maven工程 ,添加依赖: <?xml version="1.0" e ...

  4. spring-boot整合Mybatis多数据源案例

    1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springBo ...

  5. SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源、配置 MyBatis、事务控制、druid 监控)

    1.概念:SpringBoot 整合 MyBatis 2.背景 SpringBoot 得到最终效果是一个简化到极致的 WEB 开发,但是只要牵扯到 WEB 开发,就绝对不可能缺少数据层操作,所有的开发 ...

  6. SpringBoot整合Mybatis之项目结构、数据源

    已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...

  7. springboot整合mybatis的时候报错Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required

    今天闲来无事,学习springboot整合mybatis,在bilibili看视频学的,视频中在dao层的interface上面加上org.apache.ibatis.annotations.Mapp ...

  8. SpringBoot整合Mybatis,并实现事务控制

    SpringBoot整合Mybatis,并实现事务控制 1. 在pom文件里添加相关maven文件 <parent> <groupId>org.springframework. ...

  9. Java开发学习(三十九)----SpringBoot整合mybatis

    一.回顾Spring整合Mybatis Spring 整合 Mybatis 需要定义很多配置类 SpringConfig 配置类 导入 JdbcConfig 配置类 导入 MybatisConfig ...

随机推荐

  1. Linux指令--mkdir

    本篇博客参照http://www.cnblogs.com/peida/archive/2012/10/25/2738271.html. linux mkdir 命令用来创建指定的名称的目录,要求创建目 ...

  2. java编程中常用英语单词

    JAVA 省略语与名词解释 -------------------------------- J2EETM----JavaTM 2PlatformEnterpriseEdition : J2EE(JA ...

  3. MS SQL 模仿ORACLE的DESC

    前言: 在ORACLE数据库的SQL*PLUS里面有个DES(DESCRIBE)命令,它可以返回数据库所存储对象的描述,如下所示 SQL> DESC STUDENT_SCORE   Name T ...

  4. <select>设置multiple="multiple"属性后 下拉框全部展开了 不再是折叠的怎么回事

    1 <select multiple="multiple" size="5"> <option>1</option> < ...

  5. notepad++代码输出电话号

    在网上看到一个程序员找合租的消息,希望找一个程序员合租,所以电话号码以代码的形式输出,闲来没事打出来玩玩.首先新建一个test.java文件,并敲入下面代码: 1 public class test{ ...

  6. 文本与二进制关于\n的问题

    文本文件中: text = open(path, "r");windows中的换行符\n,在文件中windows在存储的时候会将它看成\r\n存储,用r在读取大小时会忽略\r的大小 ...

  7. C#使用Redis

    一,引入dll 1.ServiceStack.Common.dll 2.ServiceStack.Interfaces.dll 3.ServiceStack.Redis.dll 4.ServiceSt ...

  8. Trusted Execution Technology (TXT) --- 启动控制策略(LCP)篇

    版权声明:本文为博主原创文章,未经博主允许不得转载.http://www.cnblogs.com/tsec/p/8428631.html 在TXT平台中,启动控制策略(Launch Control P ...

  9. RChain的Casper共识算法

    RChain的Casper共识算法是基于Vlad Zamfir的correct-by-construction共识协议和CTO Greg Meredith和其他RChain成员讨论而来的.他们还为Ca ...

  10. 洛谷 [P1282] 多米诺骨牌

    这道题是一道背包问题,考虑一个背包, 显然如果我们直接设dp[i]表示前i个使差值最小所需的最少翻转次数,是具有后效性的. 所以我们将直接求最值,改为求某个值是否可行,这种求最值转变为求可行性的思想是 ...