Model中有这样一个方法, 是不是考虑开放?
/**
* Find model.
*/
private List<M> find(Connection conn, String sql, Object... paras) throws Exception {
Class<? extends Model> modelClass = getClass();
if (DbKit.devMode)
checkTableName(modelClass, sql);
PreparedStatement pst = conn.prepareStatement(sql);
for (int i=0; i<paras.length; i++) {
pst.setObject(i + 1, paras[i]);
}
ResultSet rs = pst.executeQuery();
List<M> result = ModelBuilder.build(rs, modelClass);
DbKit.closeQuietly(rs, pst);
return result;
}
因为我在使用每次查询之前可能都需要执行“set names latin1”来进行编码转换, 而执行这个语句和执行查询的语句,要求使用同一个数据库连接。看了下,貌似只能通过这个方法来进行。
这个方法开放之后,我就可以自己通过Dbkit来获取数据库连接,做我想做的事, 然后再用同一个连接,做其他事。
Db.execute(new ICallback() {
@Override
public void run(Connection connection) throws SQLException {
Statement statement = connection.createStatement();
statement.execute("set names latin1;");
List<Abc> abcList = Abc.dao.find(connection, sql, params);
}
});
Connection connection = DbKit.getConnection();
Statement statement = connection.createStatement();
statement.execute("set names latin1;");
List<Abc> abcList = Abc.dao.find(connection, sql, params);
因为ActiveRecordPlugin
需要的只是一个DataSource
对象,可以自己实现一个,在构造函数的地方把真正的DataSource
传入,只需要在两个getConnection()
方法实现的地方执行完set names latin1
再返回。其他方法全部直接用封装在内部的DataSource处理。
这样就可以既不破坏作者原有的想法,也不用在每个数据库操作之前都要重复写set names latin1的代码。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。