Hei那里,我正在研究Primefaces 5 / JSF 2 / Mybatis webapp。我的问题是。要知道每次做什么(在应用程序上)我们必须执行方法setUser(...)。我现在正在工作的公司有一个我们正在构建的应用程序的C#版本但是没有连接池,所以他们只需要在用户登录时执行该过程。
(现在我们只是在getSQLFactory方法中调用该方法,我知道这不是最佳实践......但这似乎是唯一可行的解决方案,不能在所有200多个Mappers中手动添加它)
public static SqlSessionFactory getSqlSessionFactory() {
HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
ManagedNavUtils navyUtils = (ManagedNavUtils) session.getAttribute("navy");
if (navyUtils != null && navyUtils.getLoggedInUser() != null)
setLoggedInUser(navyUtils.getLoggedInUser());
return factory;
}
每次在DB上执行某些操作时,有没有办法调用该过程?
我的mybatis-config.xml文件及相关配置:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${database.driver}" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
<!-- CONNECTION POOLING PROPERTIES -->
<property name="poolMaximumActiveConnections" value="20" />
<property name="poolMaximumIdleConnections" value="5" />
<property name="poolPingEnabled" value="false" />
</dataSource>
</environment>
</environments>
答案 0 :(得分:1)
您可以创建mybatis plugin来拦截所有查询。
但是对于您的情况,更好的选择是在连接检索期间仅设置一次用户。某些连接池允许在从池中借用连接时进行自定义初始化。另一种可能的选择是包装mybatis使用的DataSource
。
对于使用mybatis附带的数据源的情况,最简单的方法是使用自定义DataSource
打包DataSourceFactory
。
首先像这样延伸PooledDataSource
:
class MyPooledDataSource extends PooledDataSource {
// all constructors should be defined but omitted for brevity
public Connection getConnection() throws SQLException {
Connection connection = super.getConnection();
setLoggedInUser(connection);
return connection;
}
public Connection getConnection(String username, String password) throws SQLException {
Connection connection = super.getConnection(username, password);
setLoggedInUser(connection);
return connection;
}
private void setLoggedInUser(Connection connection) {
// actual setting of logged in user
}
}
然后你需要定义工厂:
public class MyDataSourceFactory extends PooledDataSourceFactory {
public MyDataSourceFactory() {
this.dataSource = new MyPooledDataSource();
}
}
修改mybatis-config.xml
以使mybatis使用您的数据源工厂:
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="org.myproject.MyDataSourceFactory">
<property name="driver" value="${database.driver}" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
<!-- CONNECTION POOLING PROPERTIES -->
<property name="poolMaximumActiveConnections" value="20" />
<property name="poolMaximumIdleConnections" value="5" />
<property name="poolPingEnabled" value="false" />
</dataSource>
</environment>
</environments>