首先,我是
Java的新手.
我正在试图弄清楚从Java使用DB的好方法.我正在使用c3p0进行连接池.这次Hibernate或其他ORM不是一个选项,我们现在决定坚持使用“普通SQL”.
目前基本的数据检索如下所示:
private int getUserID(int sessionID, String userIP) {
int result = 0;
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
// Application.cpds is an instance of c3p0's ComboPooledDataSource
conn = Application.cpds.getConnection();
st = conn.prepareStatement("SELECT user_id, user_ip, is_timed_out FROM g_user.user_session WHERE id = ?");
st.setInt(1, sessionID);
rs = st.executeQuery();
if ( rs.next() ) {
if ( !rs.getBoolean("is_timed_out") && userIP.equals(rs.getString("user_ip")) ) {
result = rs.getInt("user_id");
}
}
}
catch (SQLException e) {
e.printStackTrace();
}
finally {
if ( rs != null ) {
try { rs.close(); } catch (SQLException e) { e.printStackTrace(); }
}
if ( st != null ) {
try { st.close(); } catch (SQLException e) { e.printStackTrace(); }
}
if ( conn != null ) {
try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }
}
}
return result;
}
对于这样的基本操作,代码看起来很长.另一个问题是大多数代码必须在许多地方重复(声明Connection,PreparedStatement,ResultSet,关闭它们,捕获异常).虽然,这是我在谷歌搜索时的大多数例子中看到的.
在PHP中,我将创建一个包装类,它将具有方法select(),它接受2个参数(字符串)sqlQuery和(数组)参数,并返回简单的数据数组.包装类也有几个更具体的方法,如:
> selectValue()表示单个值(例如,从用户选择count(*))
> selectRow()用于单行(例如,选择名称,来自用户的姓氏,其中id =:user_id)
> selectColumn for single column(例如,从用户中选择不同的remote_address)
在Java中实践过这样的东西吗?还是有什么更好/更方便的?或者我应该使用与上面的getUserID()示例相同的样式?正如我所说,这次ORM不是一个选择.
提前致谢 :)
编辑:目前编写DBConnection类.它从构造函数中的c3p0连接池获取连接.使用DB的公共方法很少:select()表示单个值,selectRow()表示单行或列的selectColumn(),以及insert(),update(),delete( )和ddl().方法接受String查询,Object [] params参数,params是可选的. insert(),update()和delete()返回Integer,它是PreparedStatement.executeUpdate()的结果. select方法返回不同的结果:
> ArrayCollection< HashMap< String,Object>>选择()
>对象selectValue()
> HashMap< String,Object> selectRow()
> ArrayCollection< Object> selectColumn()
最后一个问题是编译器警告 – “警告:[unchecked] unchecked cast”.这是因为所有方法都调用返回Object的单个私有方法,并将其结果转换为提到的类型.由于我是Java新手,我也不确定是否为选择选择了合适的类型.除此之外,一切似乎都按预期工作.