jdbc向数据库插入变量

ig9co6j1  于 2021-06-29  发布在  Java
关注(0)|答案(4)|浏览(382)

我正在通过我的方法 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");
    }
}
u2nhd7ah

u2nhd7ah1#

不要用陈述,用陈述 PreparedStatement . 否则,你会被黑客攻击。
一般来说,jdbc是一个棘手的野兽,不是一个特别好的api。有很好的理由-它被设计成最小的公分母,它更关注于暴露所有现存数据库的所有细节,而不是给你,想要与数据库交互的程序员,一个很好的体验。
试试jdbc或jooq。
您的异常处理也是错误的。如果捕获到异常,要么处理它,要么确保抛出一些东西。记录它(或者更糟,打印它)绝对不算数。添加 throws 你的方法签名。如果这是不可能的(而且通常是可能的,先尝试一下), throw new RuntimeException("Uncaught", e) 是你想要的。不是 e.printStackTrace() ,或者更糟的是,你做了什么:你只是把所有相关的信息都扔掉了。别那么做。

eimct9ow

eimct9ow2#

我用这种方法,它是非常有效的
对我来说

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',,'"+iName+"','5','15.01.2020','1 Week','Musterarzt','Hausarzt','Musterstraße')";

        stmt.executeUpdate(iQuery);

    } catch (Exception e) {
        System.out.println("Something went wrong @InsertQuery");
    }
}
wlwcrazw

wlwcrazw3#

最简单的方法可能是使用 PreparedStatement :

public void insertQuery
     (String iName, String iType, int healthProblem, Date date2, String aRemind, String docName, String docType, String docAddress)
     throws SQLException {

    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);
         PreparedStatement stmt = con.prepareStatement(
                 "INSERT into appointment" +
                         "(ID, PatientID, Insurance_Name, Insurance_Type, Health_Problem, Appointment_Date, Appointment_Remind, Doctor_Name, Doctor_Type, Doctor_Adress) " +
                         "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)")) {

        stmt.setString(1, iName);
        stmt.setString(2, iType);
        stmt.setInt(3, healthProblem);
        stmt.setTimestamp(4, new Timestamp(date2.getTime()));
        stmt.setString(5, aRemind);
        stmt.setString(6, docName);
        stmt.setString(7, docType);
        stmt.setString(8, docAddress);

        stmt.executeUpdate();
    }
}
e4eetjau

e4eetjau4#

建议的方法是 PreparedStatement 除了许多其他好处外,它还解决了以下两个重要问题:
它可以帮助您保护应用程序不受sql注入的影响。
您不必自己将文本值括在单引号中。
典型用法如下:

String query = "INSERT INTO appointment(ID, PatientID, Insurance_Name, Insurance_Type, Health_Problem) VALUES (?, ?, ?, ?, ?)";

try (PreparedStatement pstmt = con.prepareStatement(query)) {
    //...

    pstmt.setString(1, id);
    pstmt.setString(2, patientId);
    pstmt.setString(3, insuranceName);
    //...

    pstmt.executeUpdate();
} catch(SQLException e) {
    e.printStackTrace();
}

请注意,对于每个 ? ,您必须使用 pstmt.setXXX . 另一件需要了解的事情是,在方法调用中, pstmt.setString(1, Id) , 1 指第一个 ? 而不是表中的第一列。
其他一些要点:
我使用了try with resources语句,这是在程序完成后关闭资源的一种更简单、更推荐的方法。从oracle的it教程中了解更多信息。
始终遵循java命名约定,例如。 Insurance_Name 应命名为 insuranceName .

相关问题