sql 代码:SELECT * FROM table WHERE 列

Posted

技术标签:

【中文标题】sql 代码:SELECT * FROM table WHERE 列【英文标题】:sql code : SELECT * FROM table WHERE column 【发布时间】:2017-12-19 11:35:39 【问题描述】:

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

【问题讨论】:

第一个建议...格式化您的问题 您遇到了什么异常?按其他列获取行有什么问题?提供更多细节。 【参考方案1】:

您可以尝试按名称而不是顺序位置来引用列:

rs.getLong("type")

而不是:

rs.getLong(1)

有时会以更改列顺序的方式重新创建表,因此依赖列的序数位置会失败。

作为进一步的防御,我总是列出我想要的列,而不是编码;

select * ...

这也更有效,因为您的 Java 程序不会拉回所有列,只拉回它需要的列。

【讨论】:

好的。我想提供帮助,您需要先告诉我更多信息。我认为您在上面向我们展示的代码正在运行,并且您想做类似的事情,对吗?如果是这样,您能否向我们展示失败的代码。我们还需要您获得的例外情况。拥有表定义(包含列和数据类型)和您正在使用的数据库品牌也会有所帮助。【参考方案2】:

首先: 看起来你的代码有问题如下

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 具有更好的性能,但如果您插入用户类型字符串,请注意 SQL 注入。在这种情况下,请不要担心,因为它是 long 类型。

【讨论】:

以上是关于sql 代码:SELECT * FROM table WHERE 列的主要内容,如果未能解决你的问题,请参考以下文章

哪个最快? SELECT SQL_CALC_FOUND_ROWS FROM `table`,或 SELECT COUNT(*)

SQLSTATE[HY000] [1045] 用户'homestead'@'localhost'的访问被拒绝(使用密码:YES)(SQL:select * from `table`)

SQL 语句 select sum(a) from table1 where b=3

在 FROM 子句中引用别名为表的其他 SQL SELECT 语句

SQL SELECT Union SELECT FROM (选择...)

Access SQL select count number of specific field from a table join another table