Java 通过构造函数将值传递给数据库
我正在创建一个应用程序,它有许多输入表单,大约22个。我想创建一个类,将表单数据保存到数据库中。表单只需通过getter获取textfield值,并通过调用数据库类构造函数保存这些值 人群: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'); 有谁能想出办法来解决这个问题吗 构造函数中的变量
数据库类使用准备好的语句。我无法将绑定值的部分传递到参数,该部分如下所示:
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。我还建议采取以下方法
这里是反射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
}