Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过构造函数将值传递给数据库_Java_Sql - Fatal编程技术网

Java 通过构造函数将值传递给数据库

Java 通过构造函数将值传递给数据库,java,sql,Java,Sql,我正在创建一个应用程序,它有许多输入表单,大约22个。我想创建一个类,将表单数据保存到数据库中。表单只需通过getter获取textfield值,并通过调用数据库类构造函数保存这些值 人群: 数据库类使用准备好的语句。我无法将绑定值的部分传递到参数,该部分如下所示: tmt.setInt(1, 35); // This would set a value such as age stmt.setInt(2, 'Another value'); 有谁能想出办法来解决这个问题吗 构造函数中的变量

我正在创建一个应用程序,它有许多输入表单,大约22个。我想创建一个类,将表单数据保存到数据库中。表单只需通过getter获取textfield值,并通过调用数据库类构造函数保存这些值

人群:

数据库类使用准备好的语句。我无法将绑定值的部分传递到参数,该部分如下所示:

tmt.setInt(1, 35);  // This would set a value such as age
stmt.setInt(2, 'Another value');
有谁能想出办法来解决这个问题吗

构造函数中的变量表示: 字符串数据:各种文本字段值 字符串表:数据库中存储值的特定表 stringsql:将值绑定到参数的部分(我在上面的“huddle”中提到过)

以下是数据库类:

// STEP 1. Import required packages
import java.sql.*;
import java.util.List;

public class UpdateAndQuerry {

    public static String data;
    public static String table;
    public static String sql;

    public UpdateAndQuerry (String data, String table, String sql) {
        this.data = data;
        this.table = table;
        this.sql = sql;
    }

    // JDBC driver name and database URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost/EMP";

    //  Database credentials
    static final String USER = "username";
    static final String PASS = "password";

    public static void main (String[] args) {
        Connection conn = null;
        PreparedStatement stmt = null;

        try {
            // STEP 2: Register JDBC driver
            Class.forName("com.mysql.jdbc.Driver");

            // STEP 3: Open a connection
            System.out.println("Connecting to database...");
            conn = DriverManager.getConnection(DB_URL,USER,PASS);

            // STEP 4: Execute a query
            System.out.println("Creating statement...");
            // String sql = "UPDATE Employees set age = ? WHERE id = ?";

            stmt = conn.prepareStatement(sql);

            // Bind values into the parameters.
            stmt.setInt(1, 35);  // This would set age
            stmt.setInt(2, 102); // This would set ID

            // Let us update age of the record with ID = 102;
            int rows = stmt.executeUpdate();
            System.out.println("Rows impacted : " + rows );

            // Let us select all the records and display them.
            sql = "SELECT id, first, last, age FROM Employees";
            ResultSet rs = stmt.executeQuery(sql);

            // STEP 5: Extract data from result set

            while (rs.next()) {
                // Retrieve by column name
                int id  = rs.getInt("id");
                int age = rs.getInt("age");
                String first = rs.getString("first");
                String last = rs.getString("last");

                // Display values
                System.out.print("ID: " + id);
                System.out.print(", Age: " + age);
                System.out.print(", First: " + first);
                System.out.println(", Last: " + last);
            }

            // STEP 6: Clean-up environment
            rs.close();
            stmt.close();
            conn.close();

        } catch (SQLException se) {

            // Handle errors for JDBC
            se.printStackTrace();
        } catch (Exception e) {
            // Handle errors for Class.forName
            e.printStackTrace();

        } finally {
            // finally block used to close resources
            try {
                if (stmt != null)
                    stmt.close();
            } catch (SQLException se2) {
            } // nothing we can do
            try {
                if (conn != null)
                    conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
            } // end finally try
        } // end try

        System.out.println("Goodbye!");
    } // end main
} // end JDBCExample

要实现预期的功能性,必须使用JAVA反射API。我还建议采取以下方法

  • 传递对象列表,而不是将字符串数据传递给构造函数
  • 使用反射识别对象的类型,并相应地调用setter

  • 这里是反射API链接

    由于数据的易变性,几乎不可能编写一个可以做任何事情的“霸王”。当然,您可能会在字段值和列名/数字之间设置某种映射和交叉映射…但这很快就会变得混乱

    一个更好的解决方案是在可能的情况下,尝试强制调用方向您提供有效数据

    您可以专注于创建一系列完成所需工作的类,而不是专注于一个类来完成所有工作,从抽象级别开始,从抽象级别开始构建功能,并在进行过程中获得更详细的信息

    例如,您可以使用

    然后在您的
    EmployeeQuery
    中,您可以有一个方法,该方法采用实际参数

    public int update(int id, String first, String last, int age) {
        return update(
            "UPDATE EMPLOYEES SET first = ?, last = ?, age = ? WHERE id = ?",
            new Object[]{first, last, age, id});
    }
    
    例如


    请注意,我基本上是直接输入的,所以我没有通过编译器运行它,所以可能会有一些错误,但我希望它能帮助产生一些想法……

    'Save'和'query'应该是单独的操作/方法。你现有的设计是完全错误的

    您可以使用映射来携带任意表单字段,但最好将其封装在类中(可能名为“DataForm”?)。通过这种方式,您可以附加一个ID&Type、标题字段(如名称/标题、日期和用户)以及一个用于乐观锁定的版本计数器

    保存和加载这些数据表单的代码可能应该与数据表单本身分开<代码>加载(),
    创建()
    保存()
    都应该是单独的操作。Save可以通过是否设置了非零ID来区分插入和更新

    您可能还需要数据表单的类型信息,以帮助加载到正确的类型、写入空值和验证。这将是一个DataFormType,其中(最简单的)映射为FieldName->Class,或者(更有用的)映射为FieldName->DataFieldType

    public interface DataFieldType {
        public Class getDataType();
        public int   getSqlType();
    
        public void storeToDB (Object value, PreparedStatement stmt);
        public Object loadFromDB (ResultSet rs);
    
        public String formatToUI (Object value);
        public void parseAndValidate (String text, BindingResult errors);  // to work with Spring framework
    }
    

    我认为您需要某种从文本字段值到数据库列的映射,因此可以传入一个
    Map
    ,其中键是“field”名称,值是要应用于列的值……“我无法将绑定值的部分传递到参数中”;你到底有什么问题?您是否遇到异常,是否不确定在何处/如何编写函数来设置查询参数。我可以马上告诉你,像这样使用main是错误的方法。您需要为每个SQL查询编写单独的函数。请提供一个简单的说明?谢谢你的回复。我是一个Java/SQL新手,你可以通过
    接口和泛型实现同样的功能,省去了在ReflectionAnks上乱搞的时间。让我看看。到现在为止,我对反思一无所知。从表面上看,它们似乎很有用,也很受欢迎。我建议使用反射,因为根据他的问题,我觉得他想知道如何识别要调用的正确绑定方法。另外,由于他是java新手,我没有给出整个解决方案,只是提供了一些指针,以便他能够自己实现它,学习“因为他是新手”,这将是不建议反思的一个很好的理由;)。虽然我毫无疑问地考虑过它的位置(我从时间、时间上使用它),但在依赖它之前,我会考虑许多其他的解决方案。它带来了自己需要考虑的快乐和幸福。这不是批评(如果是这样的话,我很抱歉),非常感谢。让我试着研究一下你的答案。这似乎真的很有帮助。我希望它至少能带来一些想法;)这个答案可以引导OP使用更好的技术来映射简单的具体实体,但我不确定它是否真正解决了他所问的“39种不同形式”用例。有关映射大型动态表单的良好设计,请参阅我下面关于DataForm和DataFormType的回答。@ThomasW“我希望有一个签名
    save(Employee-Employee)
    ”将是我的首选方法well@ThomasW我感谢你的意见!总是很高兴看到其他想法
    public int update(int id, String first, String last, int age) {
        return update(
            "UPDATE EMPLOYEES SET first = ?, last = ?, age = ? WHERE id = ?",
            new Object[]{first, last, age, id});
    }
    
    public interface DataFieldType {
        public Class getDataType();
        public int   getSqlType();
    
        public void storeToDB (Object value, PreparedStatement stmt);
        public Object loadFromDB (ResultSet rs);
    
        public String formatToUI (Object value);
        public void parseAndValidate (String text, BindingResult errors);  // to work with Spring framework
    }