1.在通用类里面定义MysqlCoreConfig类 代码如下:
点击查看代码
package com.flydream.common.mysql.core;
import com.zaxxer.hikari.HikariDataSource;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
import java.io.IOException;
@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "mysql.core")
@PropertySource("classpath:mysql-core-jdbc.properties")
@MapperScan(basePackages = "com.flydream.model.mappers",sqlSessionFactoryRef = "mysqlCoreSessionFactory")
public class MysqlCoreConfig {
String jdbcUrl;
String jdbcUserName;
String jdbcPassword;
String jdbcDriver;
String rootMapper;//mapper文件在classpath下存放的根路径
String aliasesPackage;//别名包
/**
* 设置一个数据库的连接池
*/
@Bean("mysqlCoreDataSource")
public DataSource mysqlCoreDataSource(){
HikariDataSource dataSource = new HikariDataSource();
dataSource.setUsername(this.getJdbcUserName());
dataSource.setPassword(this.getRealPassword());
dataSource.setJdbcUrl(this.getJdbcUrl());
dataSource.setDriverClassName(this.getJdbcDriver());
//最大连接数
dataSource.setMaximumPoolSize(50);
//最小连接数
dataSource.setMinimumIdle(5);
return dataSource;
}
/**
* 密码反转操作
*/
public String getRealPassword(){
String jdbcPassword = this.getJdbcPassword();//123456
String reverse = StringUtils.reverse(jdbcPassword);//654321
return reverse;
}
/**
* 整合mybatis SqlSessionFactoryBean
*/
@Bean("mysqlCoreSessionFactory")
public SqlSessionFactoryBean mysqlCoreSessionFactory(@Qualifier("mysqlCoreDataSource") DataSource dataSource) throws IOException {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
//数据源
factoryBean.setDataSource(dataSource);
//别名
// factoryBean.setTypeAliasesPackage(this.getAliasesPackage());
//mapper文件存储的位置
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources(this.getMapperFilePath());
factoryBean.setMapperLocations(resources);
//开启驼峰标识 user_name -- 》 userName
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
factoryBean.setConfiguration(configuration);
return factoryBean;
}
/**
* 拼接mapper.xml文件的存储位置
*/
public String getMapperFilePath(){
return new StringBuffer("classpath:").append(this.getRootMapper()).append("/**/*.xml").toString();
}
}
2.增加事务处理类
点击查看代码
package com.flydream.common.mysql.core;
import lombok.Getter;
import lombok.Setter;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.aop.Advisor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.interceptor.DefaultTransactionAttribute;
import org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import javax.sql.DataSource;
@Setter
@Getter
@Aspect
@EnableAspectJAutoProxy
@EnableTransactionManagement
@Configuration
@ConfigurationProperties(prefix="mysql.core")
@PropertySource("classpath:mysql-core-jdbc.properties")
public class TransactionConfig {
String txScanPackage;
/**
* 初始化事务管理器
* @param dataSource
* @return
*/
@Bean
public DataSourceTransactionManager mysqlCoreDataSourceTransactionManager(@Qualifier("mysqlCoreDataSource") DataSource dataSource){
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
/**
* 设置事务拦截器
* @param dataSourceTransactionManager
* @return
*/
@Bean("mysqlCoreDataSourceTxAdvice")
public TransactionInterceptor mysqlCoreDataSourceTxAdvice(@Qualifier("mysqlCoreDataSourceTransactionManager") DataSourceTransactionManager dataSourceTransactionManager) {
// 默认事务
DefaultTransactionAttribute defAttr = new DefaultTransactionAttribute(TransactionDefinition.PROPAGATION_REQUIRED);
// 查询只读事务
DefaultTransactionAttribute queryAttr = new DefaultTransactionAttribute(TransactionDefinition.PROPAGATION_REQUIRED);
queryAttr.setReadOnly(true);
// 设置拦截的方法
NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource();
source.addTransactionalMethod("save*", defAttr);
source.addTransactionalMethod("insert*", defAttr);
source.addTransactionalMethod("delete*", defAttr);
source.addTransactionalMethod("update*", defAttr);
source.addTransactionalMethod("exec*", defAttr);
source.addTransactionalMethod("set*", defAttr);
source.addTransactionalMethod("add*", defAttr);
source.addTransactionalMethod("get*", queryAttr);
source.addTransactionalMethod("query*", queryAttr);
source.addTransactionalMethod("find*", queryAttr);
source.addTransactionalMethod("list*", queryAttr);
source.addTransactionalMethod("count*", queryAttr);
source.addTransactionalMethod("is*", queryAttr);
return new TransactionInterceptor(dataSourceTransactionManager, source);
}
@Bean
public Advisor txAdviceAdvisor(@Qualifier("mysqlCoreDataSourceTxAdvice") TransactionInterceptor mysqlCoreDataSourceTxAdvice) {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
pointcut.setExpression(txScanPackage);
return new DefaultPointcutAdvisor(pointcut, mysqlCoreDataSourceTxAdvice);
}
}
3.其他模块引用事务
点击查看代码
package com.flydream.behavior.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("com.flydream.common.mysql.core")
public class MysqlConfig {
}
4.注意点 需要有对应的mappers 文件 不然会报错