我正在通过我的方法 InsertQuery
用户通过 Scanner
.
我怎样填写表格 iName
, iType
等进入我的 iQuery
这样我就可以把它们插入数据库了?
public void InsertQuery (String iName, String iType, int health_Problem, Date date2, String aRemind, String docName, String docType, String docAdress)
{
final String url = "jdbc:mysql://localhost/ehealthdb?serverTimezone=UTC";
final String DBUSER = "root";
final String DBPSWD = "root";
try {
Connection con = DriverManager.getConnection(url,DBUSER,DBPSWD);
Statement stmt = con.createStatement();
String iQuery = "INSERT into appointment"
+ "(ID, PatientID, Insurance_Name, Insurance_Type, Health_Problem, Appointment_Date, Appointment_Remind, Doctor_Name,Doctor_Type,Doctor_Adress)"
+ "values ('1','1',,'Gesetzlich','5','15.01.2020','1 Week','Musterarzt','Hausarzt','Musterstraße')";
stmt.executeUpdate(iQuery);
} catch (Exception e) {
System.out.println("Something went wrong @InsertQuery");
}
}
4条答案
按热度按时间u2nhd7ah1#
不要用陈述,用陈述
PreparedStatement
. 否则,你会被黑客攻击。一般来说,jdbc是一个棘手的野兽,不是一个特别好的api。有很好的理由-它被设计成最小的公分母,它更关注于暴露所有现存数据库的所有细节,而不是给你,想要与数据库交互的程序员,一个很好的体验。
试试jdbc或jooq。
您的异常处理也是错误的。如果捕获到异常,要么处理它,要么确保抛出一些东西。记录它(或者更糟,打印它)绝对不算数。添加
throws
你的方法签名。如果这是不可能的(而且通常是可能的,先尝试一下),throw new RuntimeException("Uncaught", e)
是你想要的。不是e.printStackTrace()
,或者更糟的是,你做了什么:你只是把所有相关的信息都扔掉了。别那么做。eimct9ow2#
我用这种方法,它是非常有效的
对我来说
wlwcrazw3#
最简单的方法可能是使用
PreparedStatement
:e4eetjau4#
建议的方法是
PreparedStatement
除了许多其他好处外,它还解决了以下两个重要问题:它可以帮助您保护应用程序不受sql注入的影响。
您不必自己将文本值括在单引号中。
典型用法如下:
请注意,对于每个
?
,您必须使用pstmt.setXXX
. 另一件需要了解的事情是,在方法调用中,pstmt.setString(1, Id)
,1
指第一个?
而不是表中的第一列。其他一些要点:
我使用了try with resources语句,这是在程序完成后关闭资源的一种更简单、更推荐的方法。从oracle的it教程中了解更多信息。
始终遵循java命名约定,例如。
Insurance_Name
应命名为insuranceName
.