package com.bosssoft.nontax.framework.sqlsession;
import com.bosssoft.nontax.framework.datasource.DynamicDataSourceHolder;
import org.apache.ibatis.exceptions.PersistenceException;
import org.apache.ibatis.executor.BatchResult;
import org.apache.ibatis.session.*;
import org.mybatis.spring.MyBatisExceptionTranslator;
import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.support.PersistenceExceptionTranslator;
import org.springframework.util.Assert;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static java.lang.reflect.Proxy.newProxyInstance;
import static org.apache.ibatis.reflection.ExceptionUtil.unwrapThrowable;
import static org.mybatis.spring.SqlSessionUtils.*;
/**
* 自定义SqlSessionTemplate
*
* @author Ron
*/
public class CustomSqlSessionTemplate extends SqlSessionTemplate {
private static final Logger log = LoggerFactory.getLogger(CustomSqlSessionTemplate.class);
private final SqlSessionFactory sqlSessionFactory;
private final ExecutorType executorType;
private final SqlSession sqlSessionProxy;
private final PersistenceExceptionTranslator exceptionTranslator;
private Map<Object, SqlSessionFactory> targetSqlSessionFactorys;
private SqlSessionFactory defaultTargetSqlSessionFactory;
public void setTargetSqlSessionFactorys(Map<Object, SqlSessionFactory> targetSqlSessionFactorys) {
this.targetSqlSessionFactorys = targetSqlSessionFactorys;
}
public void setDefaultTargetSqlSessionFactory(SqlSessionFactory defaultTargetSqlSessionFactory) {
this.defaultTargetSqlSessionFactory = defaultTargetSqlSessionFactory;
}
public CustomSqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
this(sqlSessionFactory, sqlSessionFactory.getConfiguration().getDefaultExecutorType());
}
public CustomSqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType) {
this(sqlSessionFactory, executorType, new MyBatisExceptionTranslator(sqlSessionFactory.getConfiguration().getEnvironment().getDataSource(), true));
}
public CustomSqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType, PersistenceExceptionTranslator exceptionTranslator) {
super(sqlSessionFactory, executorType, exceptionTranslator);
this.sqlSessionFactory = sqlSessionFactory;
this.executorType = executorType;
this.exceptionTranslator = exceptionTranslator;
this.sqlSessionProxy = (SqlSession) newProxyInstance(SqlSessionFactory.class.getClassLoader(), new Class[]{SqlSession.class}, new SqlSessionInterceptor());
this.defaultTargetSqlSessionFactory = sqlSessionFactory;
}
@Override
public SqlSessionFactory getSqlSessionFactory() {
log.debug("当前持有的DataSourceKey: " + DynamicDataSourceHolder.getDataSourceKey());
SqlSessionFactory targetSqlSessionFactory = targetSqlSessionFactorys.get(DynamicDataSourceHolder.getDataSourceKey());
if (targetSqlSessionFactory != null) {
return targetSqlSessionFactory;
} else if (defaultTargetSqlSessionFactory != null) {
return defaultTargetSqlSessionFactory;
} else {
Assert.notNull(targetSqlSessionFactorys, "Property 'targetSqlSessionFactorys' or 'defaultTargetSqlSessionFactory' are required");
Assert.notNull(defaultTargetSqlSessionFactory, "Property 'defaultTargetSqlSessionFactory' or 'targetSqlSessionFactorys' are required");
}
return this.sqlSessionFactory;
}
/**
* @description 获取所有数据源Key
* @param
* @return java.util.Set<java.lang.Object>
* @throws
*/
public Set<Object> getDataSourceKeySet() {
log.debug("项目所有数据源Key:" + targetSqlSessionFactorys.keySet());
return targetSqlSessionFactorys.keySet();
}
@Override
public Configuration getConfiguration() {
return this.getSqlSessionFactory().getConfiguration();
}
@Override
public ExecutorType getExecutorType() {
return this.executorType;
}
@Override
public PersistenceExceptionTranslator getPersistenceExceptionTranslator() {
return this.exceptionTranslator;
}
/**
* {@inheritDoc}
*/
@Override
public <T> T selectOne(String statement) {
return this.sqlSessionProxy.<T>selectOne(statement);
}
/**
* {@inheritDoc}
*/
@Override
public <T> T selectOne(String statement, Object parameter) {
return this.sqlSessionProxy.<T>selectOne(statement, parameter);
}
/**
* {@inheritDoc}
*/
@Override
public <K, V> Map<K, V> selectMap(String statement, String mapKey) {
return this.sqlSessionProxy.<K, V>selectMap(statement, mapKey);
}
/**
* {@inheritDoc}
*/
@Override
public <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey) {
return this.sqlSessionProxy.<K, V>selectMap(statement, parameter, mapKey);
}
/**
* {@inheritDoc}
*/
@Override
public <K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds) {
return this.sqlSessionProxy.<K, V>selectMap(statement, parameter, mapKey, rowBounds);
}
/**
* {@inheritDoc}
*/
@Override
public <E> List<E> selectList(String statement) {
return this.sqlSessionProxy.<E>selectList(statement);
}
/**
* {@inheritDoc}
*/
@Override
public <E> List<E> selectList(String statement, Object parameter) {
return this.sqlSessionProxy.<E>selectList(statement, parameter);
}
/**
* {@inheritDoc}
*/
@Override
public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
return this.sqlSessionProxy.<E>selectList(statement, parameter, rowBounds);
}
/**
* {@inheritDoc}
*/
@Override
public void select(String statement, ResultHandler handler) {
this.sqlSessionProxy.select(statement, handler);
}
/**
* {@inheritDoc}
*/
@Override
public void select(String statement, Object parameter, ResultHandler handler) {
this.sqlSessionProxy.select(statement, parameter, handler);
}
/**
* {@inheritDoc}
*/
@Override
public void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler) {
this.sqlSessionProxy.select(statement, parameter, rowBounds, handler);
}
/**
* {@inheritDoc}
*/
@Override
public int insert(String statement) {
return this.sqlSessionProxy.insert(statement);
}
/**
* {@inheritDoc}
*/
@Override
public int insert(String statement, Object parameter) {
return this.sqlSessionProxy.insert(statement, parameter);
}
/**
* {@inheritDoc}
*/
@Override
public int update(String statement) {
return this.sqlSessionProxy.update(statement);
}
/**
* {@inheritDoc}
*/
@Override
public int update(String statement, Object parameter) {
return this.sqlSessionProxy.update(statement, parameter);
}
/**
* {@inheritDoc}
*/
@Override
public int delete(String statement) {
return this.sqlSessionProxy.delete(statement);
}
/**
* {@inheritDoc}
*/
@Override
public int delete(String statement, Object parameter) {
return this.sqlSessionProxy.delete(statement, parameter);
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
使用Atomikos支持分布式事务,Spring+Mybatis+Druid+AtomikosDataSource 使用手册: https://www.yuque.com/itman/wosfkn/mreame
资源推荐
资源详情
资源评论
收起资源包目录
多数据源动态切换及XA分布式事务Java实现v1.0.zip (117个子文件)
style.css 194KB
bootstrap.css 160KB
bootstrap.min.css 120KB
animate.css 67KB
datepicker3.css 34KB
font-awesome.css 32KB
sweetalert.css 19KB
chosen.css 13KB
bootstrap-datetimepicker.css 13KB
bootstrap-datetimepicker.min.css 11KB
toastr.min.css 7KB
footable.core.css 6KB
dataTables.bootstrap.css 5KB
fileinput.min.css 5KB
datepicker.css 4KB
datepicker.css 4KB
jquery.gritter.css 3KB
tree-multiselect.min.css 2KB
green.css 2KB
jquery.tagsinput.css 1KB
WdatePicker.css 231B
多数据源动态切换及XA分布式事务实现说明文档v1.0.docx 1016KB
img.gif 2KB
img.gif 2KB
datePicker.gif 1KB
loading.gif 847B
.gitignore 391B
.gitignore 11B
favicon.ico 8KB
CustomSqlSessionTemplate.java 11KB
DataSourceAspect.java 3KB
XaTestServiceImpl.java 2KB
MultiDataSourceTest.java 2KB
DataSourceEnum.java 882B
XaTestService.java 868B
DynamicDataSourceHolder.java 812B
XaTestMapper.java 613B
DynamicDataSource.java 399B
DataSource.java 338B
SqlMapper.java 123B
p_big1.jpg 548KB
p_big2.jpg 441KB
p1.jpg 146KB
p3.jpg 123KB
lou.jpg 95KB
profile.jpg 38KB
404.jpg 26KB
a2.jpg 19KB
a8.jpg 17KB
profile_small.jpg 12KB
a7.jpg 11KB
a3.jpg 7KB
a4.jpg 6KB
a5.jpg 4KB
a6.jpg 4KB
a1.jpg 3KB
bg.jpg 307B
echarts.js 355KB
fileinput.js 150KB
bootstrap-datetimepicker.js 84KB
jquery-2.1.1.js 82KB
bootstrap.js 76KB
fileinput.min.js 70KB
bootstrap-datepicker.js 65KB
chosen.jquery.js 53KB
bootstrap-datetimepicker.min.js 38KB
footable.all.min.js 36KB
bootstrap.min.js 35KB
calendar.js 22KB
jquery.validate.min.js 21KB
WdatePicker.js 17KB
sweetalert.min.js 16KB
jquery.tagsinput.js 15KB
line.js 13KB
pace.min.js 12KB
bar.js 10KB
wuling.js 8KB
tree-multiselect.min.js 6KB
icheck.min.js 5KB
jquery.slimscroll.min.js 5KB
toastr.min.js 5KB
rslide.js 4KB
validate-cn.js 4KB
fileinput_locale_zh.js 4KB
jquery.metisMenu.js 3KB
zh-tw.js 1KB
zh-cn.js 1KB
opentable.js 1KB
jquery.loading.js 1KB
bootstrap-datetimepicker.zh-TW.js 882B
bootstrap-datetimepicker.zh-CN.js 876B
en.js 716B
user4.png 21KB
user2.png 21KB
user1.png 21KB
user3.png 18KB
user5.png 17KB
logo_icon.png 17KB
user-avatar.png 15KB
header-profile.png 6KB
共 117 条
- 1
- 2
资源评论
- 小卡拉米!2024-04-03非常有用的资源,可以直接使用,对我很有用,果断支持!
- valleyG2021-09-02用户下载后在一定时间内未进行评价,系统默认好评。
flash&
- 粉丝: 136
- 资源: 132
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 多机调度问题贪心算法:理论探索与实践应用.zip
- 探索tecreate:软件开发的未来之星.zip
- 打标机项目C#源码连接扫码
- 基于SSM的房屋租赁系统的设计与实现
- xyctf:从入门到精通的实用指南.zip
- mmqrcode1714153659780.png
- Screenshot_2024-04-27-06-08-58-486_com.baidu.xin.aiqicha.jpg
- 基于Javaweb+Tomcat+MySQL的大学生公寓管理系统+sql文件.zip
- 实训作业基于javaweb的订单管理系统源码+数据库+实训报告.zip
- 多机调度问题贪心算法基于最小堆和贪心算法求解多机调度问题.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功