sql 与java之间的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 与java之间的问题相关的知识,希望对你有一定的参考价值。

public static List select_bn(String name1,String date,String name2/*,int money*/)
List list=new ArrayList();
String sql="select * from borrowinfo where 1=1";
PreparedStatement pstam=null;
ResultSet rs=null;
try
if(name1!=null)
sql=sql+"and"+name1;

if(date!=null)
sql=sql+"and"+date;

if(name2!=null)
sql=sql+"and"+name2;

pstam=con.prepareStatement(sql);
pstam.setString(1, name1);
pstam.setString(2, date);
pstam.setString(3, name2);
// pstam.setInt(4, money);

// if(String.valueOf(money)!=null)
// sql=sql+"and"+money;
//
rs = pstam.executeQuery();
while(rs.next())
borrowinfo bb=new borrowinfo();
bb.setId(rs.getInt("id"));
bb.setBorrowname(rs.getString("borrownanme"));
bb.setLendname(rs.getString("lendname"));
bb.setHowmoney(rs.getInt("howmoney"));
bb.setYihuanmoney(rs.getInt("yihuanmoney"));
bb.setDate(rs.getString("date"));
list.add(bb);

catch (SQLException e)
System.out.println("查询出错了。。。。。"+e.getMessage());

return list;

出现查询出错了。。。。。索引 1 超出范围。 的错误,没分了不好意思

你的SQL有问题
表里面只有borrownanme,lendname,howmoney,yihuanmoney,date这些列

String sql="select * from borrowinfo where 1=1";

sql=sql+"and"+name1;
比方说你的name1为"张三";
出来的结果为"select * from borrowinfo where 1=1 and 张三";
这就不是sql,并且没有预编译,哪有参数设到SQL中呢
应该是这样的"select * from borrowinfo where 1=1 and borrownanme =?";追问

现在我已经把那个改过来了,出现了新的问题:查询出错了。。。。。对象名 \'borrowinfo\' 无效。
您知道是为什么吗?
我之前也是这样写的,这次出错了

追答

去数据库看看有没有这张表。用PreparedStatement的时候要写数据库的表名称,不能用HIBERNATE的对象HQL语句。

参考技术A pstam=con.prepareStatement(sql);
pstam.setString(1, name1);
pstam.setString(2, date);
pstam.setString(3, name2);
这几行,SQL中都没有参数
参考技术B 楼上说的很清楚了,你的sql语句写的不对,应该是name1=? and name2=? and date=?
这样你才可以用下面的set语句将那些问号替换成你的变量值,不然没有可替换的占位符当然会报超出范围的错误。
参考技术C sql=sql+"and"+name1; 最好把and 前后加空格 sql=sql+" and "+name1;

在 LocalDate 和 sql.Date 之间转换 [重复]

【中文标题】在 LocalDate 和 sql.Date 之间转换 [重复]【英文标题】:Convert between LocalDate and sql.Date [duplicate] 【发布时间】:2015-06-27 08:29:59 【问题描述】:

在 Java 8(或更高版本)中,在 java.sql.DateLocalDate(双向)之间转换的正确方法是什么?

【问题讨论】:

问题本身的措辞对于那些也/专门寻找从 java.sql.Date 转换为 java.time.LocalDate 的人来说是好的,即使其他问题有类似的答案。 【参考方案1】:

java.sql.Date 的 Java 8 版本(及更高版本)内置了对LocalDate 的支持,包括toLocalDatevalueOf(LocalDate)

要将LocalDate 转换为java.sql.Date,您可以使用

java.sql.Date.valueOf( localDate );

以及从java.sql.Date 转换为LocalDate

sqlDate.toLocalDate();

时区:

LocalDate 类型不存储时区信息,而 java.sql.Date 存储。因此,使用上述转换时,结果取决于系统的默认时区(如 cmets 中所指出的)。

如果不想依赖默认时区,可以使用如下转换:

Date now = new Date();
LocalDate current = now.toInstant()
                       .atZone(ZoneId.systemDefault()) // Specify the correct timezone
                       .toLocalDate();

【讨论】:

请注意,这使用系统默认时区来解释日期,这可能是也可能不是您想要的。通常最好明确指定时区! @marc82ch 你是对的。 The default time zone affects the conversion, as proved by this question。您可以在转换时使用 yyyy-mm-dd 格式:java.time.LocalDate.parse(sqlDate.toString())@maja,您可以相应地更新您的答案吗? 替代方法不正确,因为 java.sql.Date.toInstant() 会抛出 UnsupportedOperationException(在 Java 8 中) UnsupportedOperationException 在 java.util.Date 中抛出,而不是在 java.sql.Date 中抛出,为避免此异常,请在 sqlDate.toLocalDate() 之前使用 if (sqlDate instanceof java.sql.Date),如果日期是 java.util.Date 使用 sqlDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); 在这些 java.sql.Date 方法中不知何故对我进行了不需要的时区转换 - 我输入了今天的 LocalDate,并在数据库中最终得到了昨天的日期值跨度>

以上是关于sql 与java之间的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 JOOQ 在 java.sql.Timestamp 和 java.time.Instant 之间转换时遇到问题

在 LocalDate 和 sql.Date 之间转换 [重复]

需要日期之间的数据 SQL + Java

在 java.util.Date 或 java.sql.Date 之间进行选择

jdbc-java.sql.date和java.util.date之间转换

JDBC