mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-07 09:08: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.session.SqlSessionFactory;
|
||||||
import org.apache.ibatis.transaction.TransactionFactory;
|
import org.apache.ibatis.transaction.TransactionFactory;
|
||||||
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
|
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
|
||||||
|
import org.apache.ibatis.util.MapUtil;
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
|
import java.lang.reflect.Proxy;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MybatisFlex 的启动类
|
* MybatisFlex 的启动类
|
||||||
@ -62,6 +67,8 @@ public class MybatisFlexBootstrap {
|
|||||||
protected DbType dbType;
|
protected DbType dbType;
|
||||||
protected SqlSessionFactory sqlSessionFactory;
|
protected SqlSessionFactory sqlSessionFactory;
|
||||||
protected Class<? extends Log> logImpl;
|
protected Class<? extends Log> logImpl;
|
||||||
|
private Map<Class<?>, Object> mapperObjects = new ConcurrentHashMap<>();
|
||||||
|
private ThreadLocal<SqlSession> sessionThreadLocal = new ThreadLocal<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 虽然提供了 getInstance,但也允许用户进行实例化,
|
* 虽然提供了 getInstance,但也允许用户进行实例化,
|
||||||
@ -132,6 +139,7 @@ public class MybatisFlexBootstrap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Deprecated
|
||||||
public <R, T> R execute(Class<T> mapperClass, Function<T, R> function) {
|
public <R, T> R execute(Class<T> mapperClass, Function<T, R> function) {
|
||||||
try (SqlSession sqlSession = openSession()) {
|
try (SqlSession sqlSession = openSession()) {
|
||||||
DialectFactory.setHintDbType(dbType);
|
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);
|
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() {
|
public String getEnvironmentId() {
|
||||||
return environmentId;
|
return environmentId;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -39,10 +39,13 @@ public class EntityTestStarter {
|
|||||||
|
|
||||||
|
|
||||||
// //查询 ID 为 1 的数据
|
// //查询 ID 为 1 的数据
|
||||||
Account account = bootstrap.execute(AccountMapper.class, accountMapper ->
|
// Account account = bootstrap.execute(AccountMapper.class, accountMapper ->
|
||||||
accountMapper.selectOneById(1));
|
// accountMapper.selectOneById(1));
|
||||||
System.out.println(account);
|
// 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 ->
|
// List<Account> allAccount = bootstrap.execute(AccountMapper.class, accountMapper ->
|
||||||
// accountMapper.selectListByQuery(QueryWrapper.create()));
|
// accountMapper.selectListByQuery(QueryWrapper.create()));
|
||||||
|
|||||||
@ -52,6 +52,7 @@ public class RowTestStarter {
|
|||||||
.set("user_name", "lisi")
|
.set("user_name", "lisi")
|
||||||
.set("age", 22)
|
.set("age", 22)
|
||||||
.set("birthday", new Date());
|
.set("birthday", new Date());
|
||||||
|
|
||||||
bootstrap.execute(RowMapper.class, rowMapper ->
|
bootstrap.execute(RowMapper.class, rowMapper ->
|
||||||
rowMapper.insert("tb_account", newRow));
|
rowMapper.insert("tb_account", newRow));
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user