add MybatisFlexBootstrap.getMapper() MybatisFlexBootstrap.tx()

This commit is contained in:
开源海哥 2023-03-30 11:45:28 +08:00
parent dc26385552
commit 4023ee1ba5
3 changed files with 75 additions and 8 deletions

View File

@ -27,25 +27,30 @@ import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.apache.ibatis.util.MapUtil;
import javax.sql.DataSource;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* MybatisFlex 的启动类
*
* <code>
* MybatisFlexBootstrap.getInstance()
* .setDatasource(...)
* .addMapper(...)
* .start();
* .setDatasource(...)
* .addMapper(...)
* .start();
* <p>
* <p>
* MybatisFlexBootstrap.getInstance()
* .execute(...)
* .execute(...)
* </code>
*/
public class MybatisFlexBootstrap {
@ -62,6 +67,8 @@ public class MybatisFlexBootstrap {
protected DbType dbType;
protected SqlSessionFactory sqlSessionFactory;
protected Class<? extends Log> logImpl;
private Map<Class<?>, Object> mapperObjects = new ConcurrentHashMap<>();
private ThreadLocal<SqlSession> sessionThreadLocal = new ThreadLocal<>();
/**
* 虽然提供了 getInstance但也允许用户进行实例化
@ -132,6 +139,7 @@ public class MybatisFlexBootstrap {
}
@Deprecated
public <R, T> R execute(Class<T> mapperClass, Function<T, R> function) {
try (SqlSession sqlSession = openSession()) {
DialectFactory.setHintDbType(dbType);
@ -143,11 +151,66 @@ public class MybatisFlexBootstrap {
}
private SqlSession openSession() {
protected SqlSession openSession() {
SqlSession sqlSession = sessionThreadLocal.get();
if (sqlSession != null) {
return sqlSession;
}
return sqlSessionFactory.openSession(configuration.getDefaultExecutorType(), true);
}
/**
* 直接获取 mapper 对象执行
* @param mapperClass
* @return mapperObject
*/
public <T> T getMapper(Class<T> mapperClass) {
Object mapperObject = MapUtil.computeIfAbsent(mapperObjects, mapperClass, clazz ->
Proxy.newProxyInstance(MybatisFlexBootstrap.class.getClassLoader()
, new Class[]{mapperClass}
, (proxy, method, args) -> {
try (SqlSession sqlSession = openSession()) {
DialectFactory.setHintDbType(dbType);
T mapper1 = sqlSession.getMapper(mapperClass);
return method.invoke(mapper1, args);
} finally {
DialectFactory.clearHintDbType();
}
}));
return (T) mapperObject;
}
/**
* 执行事务操作不支持嵌套事务
*
* @param supplier
* @return false 回滚事务true 正常执行
*/
public boolean tx(Supplier<Boolean> supplier) {
SqlSession sqlSession = sqlSessionFactory.openSession(configuration.getDefaultExecutorType());
boolean success = false;
boolean rollback = true;
try {
sessionThreadLocal.set(sqlSession);
success = supplier.get();
} catch (Throwable e) {
rollback = false;
sqlSession.rollback();
} finally {
sessionThreadLocal.remove();
if (!success && rollback) {
sqlSession.rollback();
} else if (success) {
sqlSession.commit();
}
}
return success;
}
public String getEnvironmentId() {
return environmentId;
}

View File

@ -39,10 +39,13 @@ public class EntityTestStarter {
// //查询 ID 1 的数据
Account account = bootstrap.execute(AccountMapper.class, accountMapper ->
accountMapper.selectOneById(1));
System.out.println(account);
// Account account = bootstrap.execute(AccountMapper.class, accountMapper ->
// accountMapper.selectOneById(1));
// System.out.println(account);
AccountMapper accountMapper = bootstrap.getMapper(AccountMapper.class);
Account account = accountMapper.selectOneById(1);
System.out.println(account);
//
// List<Account> allAccount = bootstrap.execute(AccountMapper.class, accountMapper ->
// accountMapper.selectListByQuery(QueryWrapper.create()));

View File

@ -52,6 +52,7 @@ public class RowTestStarter {
.set("user_name", "lisi")
.set("age", 22)
.set("birthday", new Date());
bootstrap.execute(RowMapper.class, rowMapper ->
rowMapper.insert("tb_account", newRow));