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