我有一个表名“Coupon”,我在eclipse上使用java。
我有一个方法getCoupon(long id);这给了我id的优惠券,我这样写道:
public Coupon getCoupon(long id) {
Connection con = ConnectionPool.getInstance().getConnection();
String sql = "SELECT * FROM Coupon WHERE TYPE=?";
Coupon coupon = new Coupon();
try (PreparedStatement pstmt = con.prepareStatement(sql);){
pstmt.setLong(1, id);
try (ResultSet rs = pstmt.executeQuery();) {
if (rs.next()) {
coupon.setId(rs.getLong(1));
coupon.setTitle(rs.getString(2));
coupon.setStartDate(rs.getDate(3));
coupon.setEndDate(rs.getDate(4));
coupon.setAmount(rs.getInt(5));
coupon.setType(CouponType.valueOf(rs.getString(6)));
coupon.setMessage(rs.getString(7));
coupon.setPrice(rs.getDouble(8));
coupon.setImage(rs.getString(9));
} else {
System.out.println("Coupon ID: " + id + " could not be found\n");
}
}
} catch (SQLException e) {
CouponSystemException ex = new CouponSystemException("Coupon ID: " + id + " could not be retrieved\n", e);
System.out.println(ex.getMessage());
System.out.println(e);
}
ConnectionPool.getInstance().returnConnection(con);
return coupon;
}
我想制作另一种方法,它通过它的类型给我优惠券!但TYPE COLUMN不在第一列,它给了我例外。 有什么建议?
答案 0 :(得分:0)
您可以尝试按名称而不是序号位置引用列:
rs.getLong("type")
而不是:
rs.getLong(1)
有时会以更改列顺序的方式重新创建表,因此依赖列的序号位置会失败。
作为进一步的辩护,我总是列出我想要的列,而不是编码;
select * ...
这也更有效,因为您的Java程序不会撤回所有列,只会回收它所需的列。
答案 1 :(得分:0)
第一: 看起来您的代码中存在问题,如下所示
String sql = "SELECT * FROM Coupon WHERE TYPE=?";
我认为TYPE=?
应该被理解为ID=?
第二:
我看到TYPE
列是字符串(因为coupon.setType(CouponType.valueOf(rs.getString(6)));
),因此您必须将pstmt.setLong(1, id);
更改为pstmt.setString(1, couponType.getValue());
第三:
始终避免SELECT *
而是键入所需的所有列。
第四:
尝试概括两种方法getCouponByID(long id)
和getCouponByType(CouponType couponType)
,以便将来的维护更容易。
第五:
将ConnectionPool.getInstance().returnConnection(con);
放在finally
子句中,这样您就可以确保返回与池的连接。
第六:
如果您使用PreparedStatement
少于多次(即100次),则使用Statement
的性能会降低,而您只使用它一次。在这种情况下使用long
具有更好的性能,但如果插入用户类型String,请小心SQL注入。在这种情况下,请不要担心它是np.char.find
类型。