开发者社区> 问答> 正文

关于Model中Find方法

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);

展开
收起
小旋风柴进 2016-06-08 11:18:34 2696 0
1 条回答
写回答
取消 提交回答
  • 因为ActiveRecordPlugin需要的只是一个DataSource对象,可以自己实现一个,在构造函数的地方把真正的DataSource传入,只需要在两个getConnection()方法实现的地方执行完set names latin1再返回。其他方法全部直接用封装在内部的DataSource处理。

    这样就可以既不破坏作者原有的想法,也不用在每个数据库操作之前都要重复写set names latin1的代码。

    2019-07-17 19:31:29
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Walmart eCommerce Search 立即下载
AutoAlerts-From Data to Action 立即下载
OPEN SOURCE IN A DATA-DRIVEN WORLD 立即下载