mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-07 00:58:24 +08:00
add MybatisFlexBootstrap.getMapper() MybatisFlexBootstrap.tx()
This commit is contained in:
parent
dc26385552
commit
4023ee1ba5
@ -27,12 +27,17 @@ 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 的启动类
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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()));
|
||||
|
||||
@ -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));
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user