从 H2DB 读取结果
Posted
技术标签:
【中文标题】从 H2DB 读取结果【英文标题】:Read results from H2DB 【发布时间】:2018-01-14 11:35:09 【问题描述】:我在读取数据库中的行内容时遇到问题。 我想显示有关具有给定职位和姓名的员工的信息(暂时在控制台中)。我已经建立了路径,在 H2 中启动了数据库,但我不确定我是否正确使用了 PreparedStatement。
找不到表“MyTable”
为了更具可读性,我删除了 try/catch。
static public void Search (JButton a , JFormattedTextField name, JComboBox<String> b )
a.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent e )
Connection con = null;
con = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test" + "sa" + "");
Statement stm = null;
String ime = name.getText();// reads the name
String poz = (String) b.getSelectedItem();// reads the position
Class.forName("org.h2.Driver");
String sql1 = String.format("SELECT * FROM RABOTNICI WHERE IME = '%s' OR POZICIA = '%s'", ime, poz);
PreparedStatement prstm = null;
prstm = con.prepareStatement(sql1);
ResultSet rs = null;
rs = prstm.executeQuery(sql1);
);
【问题讨论】:
【参考方案1】:jdbc:h2:tcp:...
您正在使用 TCP 连接,但没有像这样启动 H2 TCP 服务器: http://www.h2database.com/html/tutorial.html#using_server
通常 H2 数据库在没有 TCP 服务器的情况下作为嵌入式使用,如下所示: http://www.h2database.com/html/tutorial.html#connecting_using_jdbc
jdbc:h2:/path/to/dbfile
【讨论】:
【参考方案2】:我认为您有一些信息来源,但后来出了点问题。
您创建preparedStatement 的方式,即使它被正确解析,也容易发生SQL 注入。 您应该首先创建语句,然后才注入值。
String sql1 = "SELECT * FROM RABOTNICI WHERE IME = ? OR POZICIA = ?"
PreparedStatement prstm = con.prepareStatement(sql1);
prstm.setString(1, ime);
prstm.setString(2, poz);
请参阅doc page 以正确使用 PreparedStatements
另外,getConnection 的参数看起来有点乱。
con = DriverManager.getConnection("jdbc:h2:tcp://localhost/~/test" + "sa" + "");
以下行应出现在连接创建之前。
Class.forName("org.h2.Driver");
我建议使用此tutorial 来获取有关连接 H2 DB 的说明
最后,我不知道你是如何得到关于“MyTable”的错误,它从未在你的代码 sn-p 中提及。
我的代码引用没有经过测试,但我相信它足够清晰,可以理解。
【讨论】:
谢谢!我会看看你给的链接。我以“我的桌子”为例:)。我知道我只需要一些指导方针 另外,正如@haba713 在另一个答案中提到的那样:您应该在您的应用程序之外启动一个 H2 DB,或者从您的应用程序中启动它。但无论是来自 TCP 还是 in-mem,它都应该是活跃的且可访问的 是的,我从终端启动它,然后将应用程序连接到它。在我将数据写入数据库的其他应用程序中,我没有问题,一切正常。以上是关于从 H2DB 读取结果的主要内容,如果未能解决你的问题,请参考以下文章
从 Laravel 4 中的 MSSQL 存储过程读取多个结果集