sql代码:SELECT * FROM表WHERE列

时间:2017-12-19 11:35:39

标签: java sql jdbc

我有一个表名“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不在第一列,它给了我例外。 有什么建议?

2 个答案:

答案 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类型。