Java 如何使用带外键的PreparedStatement

Java 如何使用带外键的PreparedStatement,java,jdbc,Java,Jdbc,我在一个Java员工出勤项目中工作(使用NetBeans),我创建了两个表,一个用于员工数据,另一个用于检查出勤情况 现在我想将第一个表的主键链接到第二个表,但我不知道如何链接。例如,如果您要检查考勤,它将显示员工ID和时间(超时/超时) 我所尝试的: 这是第一张表: createtableemployee( empID int主键自动递增, fName varchar(100), 文明国际, 移动整数 ); 第二个表: 创建员工考勤表( id int主键自动递增, empID int不为空,

我在一个Java员工出勤项目中工作(使用NetBeans),我创建了两个表,一个用于员工数据,另一个用于检查出勤情况

现在我想将第一个表的主键链接到第二个表,但我不知道如何链接。例如,如果您要检查考勤,它将显示员工ID和时间(超时/超时)

我所尝试的:

这是第一张表:

createtableemployee(
empID int主键自动递增,
fName varchar(100),
文明国际,
移动整数
);
第二个表:

创建员工考勤表(
id int主键自动递增,
empID int不为空,
一次又一次,
超时时间,
daay日期,
约束emp_fk外键(empID)引用员工(empID)
);
在Java中,我做到了这一点,但无法完成:

String sql="insert into employeeAttendance(empID,timeIn,daay)values(?,?,?)";
pstmt = conn.prepareStatement(sql);

pstmt.setString(1,.getText());
pstmt.setString(2,timeLabel.getText());
pstmt.setString(3,dateLabel.getText());

就功能而言,您几乎做了所有正确的事情

如果可以避免,请不要使用整数和日期的文本字段。每个主要的UI框架都有这个特殊类型的字段,所以使用它们吧

但是,您应该使用正确的setter方法
PreparedStatement
。如果列为int,则应使用
ps.setInt
,如果列为time/timestamp/date,则应使用
ps.setDate

因此,您的Java代码如下所示

SimpleDateFormatter sdf = new SimpleDateFormatter("dd.MM.yyyy");
java.util.Date jtimeIn = sdf.parse(timeLabel.getText());
java.sql.Date stimeOut = new java.sql.Date(jdate.getTime()); //This part is important, jdbc uses java.sql.Dates!

java.util.Date jdaay = sdf.parse(dateLabel.getText());
java.sql.Date sdaay = new java.sql.Date(jdaay.getTime()); //This part is important, jdbc uses java.sql.Dates!

String sql="insert into employeeAttendance(empID,timeIn,daay)values(?,?,?)";
pstmt = conn.prepareStatement(sql);

pstmt.setInt(1,Integer.parseInt(empIDAsText));
pstmt.setDate(2,stimeOut);
pstmt.setString(3,sdaay);

就功能而言,您几乎做了所有正确的事情

如果可以避免,请不要使用整数和日期的文本字段。每个主要的UI框架都有这个特殊类型的字段,所以使用它们吧

但是,您应该使用正确的setter方法
PreparedStatement
。如果列为int,则应使用
ps.setInt
,如果列为time/timestamp/date,则应使用
ps.setDate

因此,您的Java代码如下所示

SimpleDateFormatter sdf = new SimpleDateFormatter("dd.MM.yyyy");
java.util.Date jtimeIn = sdf.parse(timeLabel.getText());
java.sql.Date stimeOut = new java.sql.Date(jdate.getTime()); //This part is important, jdbc uses java.sql.Dates!

java.util.Date jdaay = sdf.parse(dateLabel.getText());
java.sql.Date sdaay = new java.sql.Date(jdaay.getTime()); //This part is important, jdbc uses java.sql.Dates!

String sql="insert into employeeAttendance(empID,timeIn,daay)values(?,?,?)";
pstmt = conn.prepareStatement(sql);

pstmt.setInt(1,Integer.parseInt(empIDAsText));
pstmt.setDate(2,stimeOut);
pstmt.setString(3,sdaay);


“不能完成它”?出了什么问题?@khelwood我不知道在这里写什么pstmt.setString(1,.getText())@AxelH,我认为它不是自动递增的。您需要获取
employee.empID
值。我们不能帮你,因为我们不知道你已经有了什么。似乎您正在使用GUI获取值
time
date
。那员工呢?如果您使用的是现有员工的列表,那么您应该能够获取具有该ID的实例,但由于我们不知道您拥有什么,因此这不可回答。那么您输入员工的名称?请用这些信息回答问题,这是我们帮助您获取第一个参数的唯一方法。“无法完成它”?出了什么问题?@khelwood我不知道在这里写什么pstmt.setString(1,.getText())@AxelH,我认为它不是自动递增的。您需要获取
employee.empID
值。我们不能帮你,因为我们不知道你已经有了什么。似乎您正在使用GUI获取值
time
date
。那员工呢?如果您使用的是现有员工的列表,那么您应该能够获取具有该ID的实例,但由于我们不知道您拥有什么,因此这不可回答。那么您输入员工的名称?请用这些信息回答问题,这是我们帮助您获取第一个参数的唯一方法。谢谢,但它显示了一个错误!它说java.lang.unsupportedOperationException:不受支持yet@AhmadAlharbi你能把整个例外情况和它发生的地方都贴出来吗?我想我知道如何解决它,但首先你能解释一下它的作用吗?(empIDAsText)是什么意思?@AhmadAlharbi我假设您将empID的输入也用作文本,但您没有将其包含在代码段中,所以我即兴添加了它。另外,如果您的问题已经解决,请在问题末尾添加评论或编辑,以便其他人可以看到解决方案。这是不正确的。JDBC驱动程序应该支持Java类型和目标JDBC/SQL类型之间的大量转换。这包括从
java.lang.String
到SQL
整数
,以及到
日期
,等等的转换。谢谢,但它显示了一个错误!它说java.lang.unsupportedOperationException:不受支持yet@AhmadAlharbi你能把整个例外情况和它发生的地方都贴出来吗?我想我知道如何解决它,但首先你能解释一下它的作用吗?(empIDAsText)是什么意思?@AhmadAlharbi我假设您将empID的输入也用作文本,但您没有将其包含在代码段中,所以我即兴添加了它。另外,如果您的问题已经解决,请在问题末尾添加评论或编辑,以便其他人可以看到解决方案。这是不正确的。JDBC驱动程序应该支持Java类型和目标JDBC/SQL类型之间的大量转换。这包括从
java.lang.String
到SQL
整数的转换,以及到
日期的转换,等等。