我正在用java和mySQL做一个Attentience程序,它对我来说不是很好。代码如下:
有两个表,EntryTable和ExitTable。两者都有相似的列:id、日期、时间。当员工打卡时,调用此函数。如果他当天已经打卡,他的记录将被输入退出表。否则,将在条目表中输入我正在用java和mySQL做一个Attentience程序,它对我来说不是很好。代码如下:,java,mysql,jdbc,mssql-jdbc,Java,Mysql,Jdbc,Mssql Jdbc,有两个表,EntryTable和ExitTable。两者都有相似的列:id、日期、时间。当员工打卡时,调用此函数。如果他当天已经打卡,他的记录将被输入退出表。否则,将在条目表中输入 public int addEntryRecord(String id) { try{ Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mys
public int addEntryRecord(String id) {
try{
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/Attend","rt","rt");
Statement stmt = con.createStatement();
long millis=System.currentTimeMillis();
java.sql.Date date=new java.sql.Date(millis);
Date today = new Date();
Date currentTime = new java.sql.Time(today.getTime());
stmt.executeQuery("SELECT id from Attend.EntryTable WHERE EntryTable.id ='"+id+"'and
EntryTable.DayOf='"+date+"'");
ResultSet rs = stmt.getResultSet();
System.out.println(rs.next());
if(rs.next()== true){
String sql = "INSERT Attend.ExitTable VALUES('"+id+"','"+date+"','"+currentTime+" ')";
stmt.executeUpdate(sql);
System.out.println("Good job");
}
else{
String sql ="INSERT Attend.EntryTable VALUES('"+id+"','"+date+"','"+currentTime+"')";
stmt.executeUpdate(sql);
System.out.println("Entry noted");
}
}catch (Exception e) {
System.out.println(e);
}
return 0;
}
错误是记录总是进入可退出状态,我不知道为什么。
请帮忙 您需要一些空间
yTable.id ='"+id+"'and
否则,将作为id的一部分附加
但是
您应该真正使用PreparedStations和set*方法
也
实际上正在推进光标。如果您只有一行,那么下一个rs.next将返回false您的代码中有一些问题 首先,结果集。下一个不是reasuble。 如果你写:
System.out.println(rs.next());
如果记录与您的情况相同,则下一次对rs.next的调用可能是错误的
如果您需要这样做,最好:
boolean next = rs.next();
System.out.println( next );
if ( next ) {
然后,我建议在需要替换参数时使用prepared语句而不是not语句:
另外,下次发布表架构时,时间比较有时可能会很棘手,您是否检查过是否使用了正确的日期类型?日期而不是时间戳?无论如何,如果您使用预先准备好的语句,comaprison会工作得更好
我想补充一点,您从未关闭过资源,这在大多数情况下都是错误的
以下是我在本地尝试并在我的系统上工作的一个简短示例:
/*
数据库架构:
创建数据库
向“Tester_2020”确定的rt授予出席的所有特权。*
创建表入口表
id VARCHAR100不为空,
DayOf日期不为空,
TimeOf TIME不为空
;
创建可退出的表
id VARCHAR100不为空,
DayOf日期不为空,
TimeOf TIME不为空
;
希望能有所帮助。是的,我选择了System.out.printlnrs.next;你看了我剩下的答案了吗?在代码中,如果id等于5,则必须从Attention.EntryTable中选择id,其中EntryTable.id=5,请了解如何使用带参数的准备语句。您当前的代码易受SQL注入攻击。此外,在插入时,请始终指定列列表,以确保您的代码不会意外插入错误的列。@Shanky301不客气,它对您有用吗?是的。当我通过时,我得到了我需要的清晰。Thnx。
/*
*/
/*
* Use an external method to access the connection, better in an external data source or factory.
*/
public Connection getConnection() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql://localhost:3306/Attend", "rt", "Tester_2020");
}
/*
* Usually is better to use a logging facility (slf4j, log4j, java.util.logging etc.)
*/
public void log( String message ) {
System.out.println( message );
}
/*
* Better not to suppress exception usually
*/
public int addEntryRecordPS(String id) throws Exception {
// using try with resources to delegate closing connection.
try ( Connection con = getConnection() ) {
long millis = System.currentTimeMillis();
java.sql.Date date = new java.sql.Date(millis);
Date today = new Date();
Time currentTime = new java.sql.Time(today.getTime());
try ( PreparedStatement checkPstm = con.prepareStatement( "SELECT id from Attend.EntryTable WHERE EntryTable.id = ? and EntryTable.DayOf = ?") ) {
checkPstm.setString( 1 , id );
checkPstm.setDate( 2 , date );
try ( ResultSet rs = checkPstm.executeQuery() ) {
boolean next = rs.next();
log( "hasNext? : "+next );
if ( next ) {
// again try with resource (no need to close pstm)
try ( PreparedStatement pstm = con.prepareStatement( "INSERT INTO Attend.ExitTable ( id, DayOf, TimeOf ) VALUES ( ?, ? ,? ) " ) ) {
pstm.setString( 1 , id );
pstm.setDate( 2 , date );
pstm.setTime( 3 , currentTime );
int res = pstm.executeUpdate();
log("Good job "+res);
}
} else {
// again try with resource (no need to close pstm)
try ( PreparedStatement pstm = con.prepareStatement( "INSERT INTO Attend.EntryTable ( id, DayOf, TimeOf ) VALUES ( ?, ? ,? ) " ) ) {
pstm.setString( 1 , id );
pstm.setDate( 2 , date );
pstm.setTime( 3 , currentTime );
int res = pstm.executeUpdate();
log("Entry noted "+res);
}
}
}
}
}
return 0;
}