
top.zeimao77.product.sql.SimpleSqlTemplate Maven / Gradle / Ivy
package top.zeimao77.product.sql;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import top.zeimao77.product.exception.BaseServiceRunException;
import top.zeimao77.product.factory.BeanFactory;
import top.zeimao77.product.factory.ComponentFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import static top.zeimao77.product.exception.ExceptionCodeDefinition.SQLEXCEPTION;
/**
* SQL客户端的构建工厂
* 可以通过
* @see ComponentFactory#initSimpleSqlTemplate(String, BeanFactory)
* 来创建它
* 每次调用 openSession 将开启一个新的会话
* @author zeimao77
* @since 2.1.1
*/
public class SimpleSqlTemplate {
private static Logger logger = LoggerFactory.getLogger(SimpleSqlTemplate.class);
DataSource dataSource;
protected PreparedStatementSetter preparedStatementSetter = DefaultPreparedStatementSetter.INSTANCE;
protected ResultSetResolve resultSetResolvel = DefaultResultSetResolve.INSTANCE;
private SimpleSqlClient simpleSqlClient;
public SimpleSqlTemplate(DataSource dataSource) {
this.dataSource = dataSource;
}
/**
* 创建一个连接客户端 每次调用都将通过一个新的会话开始;
* @param level 事务隔离级别
* Connection.TRANSACTION_READ_UNCOMMITTED 读未提交
* Connection.TRANSACTION_READ_COMMITTED 读已提交
* Connection.TRANSACTION_REPEATABLE_READ 可重复读
* Connection.TRANSACTION_SERIALIZABLE 串行化
* @param autoCommit 是否自动提交
* @return 连接
*/
public SimpleSqlClient openSession(int level, boolean autoCommit,boolean readOnly) {
Connection connection = null;
try {
connection = dataSource.getConnection();
connection.setAutoCommit(autoCommit);
connection.setTransactionIsolation(level);
connection.setReadOnly(readOnly);
logger.debug("获取一个新的连接:{}",connection);
} catch (SQLException e) {
throw new BaseServiceRunException(SQLEXCEPTION,"SQL错误",e);
}
ConnectionTransactionFactory threadExclusiveConnectionFactory = new ConnectionTransactionFactory(connection);
return new SimpleSqlClient(threadExclusiveConnectionFactory,preparedStatementSetter,resultSetResolvel);
}
/**
* 快速开启一个事务
* @param transaction 事务方法 如果该方法抛出RuntimeException将会回滚事务
* @return
*/
public T execute(Transaction transaction) {
SimpleSqlClient simpleSqlClient = openSession(Connection.TRANSACTION_READ_COMMITTED,false,false);
T apply = null;
try {
apply = transaction.doInTransaction(simpleSqlClient);
simpleSqlClient.commit();
} catch (BaseServiceRunException e) {
logger.error(String.format("[%s]%s",e.getCode(),e.getMessage()),e);
simpleSqlClient.rollback();
} catch (RuntimeException e) {
logger.error("错误",e);
simpleSqlClient.rollback();
} finally {
simpleSqlClient.close();
}
return apply;
}
public SimpleSqlClient createClient() {
if(this.simpleSqlClient == null) {
DataSourceTransactionFactory factory = new DataSourceTransactionFactory(this.dataSource);
this.simpleSqlClient = new SimpleSqlClient(factory,preparedStatementSetter,resultSetResolvel);
}
return this.simpleSqlClient;
}
public SimpleSqlClient openSession() {
return openSession(Connection.TRANSACTION_READ_COMMITTED,false,false);
}
@FunctionalInterface
public interface Transaction {
T doInTransaction(SimpleSqlClient client);
}
public PreparedStatementSetter getPreparedStatementSetter() {
return preparedStatementSetter;
}
public void setPreparedStatementSetter(PreparedStatementSetter preparedStatementSetter) {
this.preparedStatementSetter = preparedStatementSetter;
}
public ResultSetResolve getResultSetResolvel() {
return resultSetResolvel;
}
public void setResultSetResolvel(ResultSetResolve resultSetResolvel) {
this.resultSetResolvel = resultSetResolvel;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy