【问题标题】:Saving Records Using Java使用 Java 保存记录
【发布时间】:2013-02-21 01:05:51
【问题描述】:

每次用户登录时我都会保存日期日志。日期日志会在记录中保存一个日期,但我想要的是没有重复。它将检查记录是否已经存在,如果是 它不会保存日期。如果记录尚不存在,它将保存日期。

这是我的代码:

 SimpleDateFormat dnow2 = new SimpleDateFormat("MMMMM dd, yyyy");

 ResultSet ds = MyDB.rsFetch("SELECT * FROM `date-logs` WHERE `Date` = '"+dnow.format(new java.util.Date())+"'");

 try {
   ds.next() ; 

   if (ds.getMetaData().getColumnCount() == 0) {
     MyDB.exSQL(  "INSERT INTO `date-logs` (`Date Code`, `Date`) " 
                + "VALUES ('"+dnow.format(new java.util.Date())+ "',"
                + "'"+dnow2.format(new java.util.Date())+"')");   
   }
 } catch (SQLException ex) {
   Logger.getLogger(FrmLogIn.class.getName()).log(Level.SEVERE, null, ex);
 }

【问题讨论】:

  • 那么你的问题是什么?
  • 如果数据库中存在现有记录,它将不再保存。它将保存的新记录。当我运行它时,什么也没有发生,你能帮我吗
  • 您是否检查过您的 SELECT 查询是否正常工作,即它是否实际返回任何结果。看起来您正在将日期格式化为“MMMMM dd, yyyy”,其计算结果为“2013 年 2 月 21 日”。您能否检查查询 SELECT * FROM date-logs WHERE Date = 'February 21, 2013' 是否正在检索任何结果。
  • 是的,它工作正常
  • 如果记录已经存在,我只想发生这种情况,如果记录已经存在,它将不再保存,如果新记录将保存

标签: java mysql date


【解决方案1】:

终于明白了!!!

 SimpleDateFormat dnow2 = new SimpleDateFormat("MMMMM dd, yyyy");

    ResultSet ds = MyDB.rsFetch("SELECT * FROM `date-logs` WHERE `Date Code` = '"+dnow.format(new java.util.Date())+"'");


  int resultsCounter = 0;  
    try {
        while(ds.next())  
        {  
        //procedure when results were returned  
        resultsCounter++;  
        }

        if (resultsCounter ==0)  
        {  

      MyDB.exSQL("INSERT INTO `date-logs` (`Date Code`, `Date`) VALUES ('"+dnow.format(new java.util.Date())+ "',"
                     + "'"+dnow2.format(new java.util.Date())+"')");
        }  
    } catch (SQLException ex) {
        Logger.getLogger(FrmLogIn.class.getName()).log(Level.SEVERE, null, ex);
    }

【讨论】:

    【解决方案2】:

    我不知道您使用的是哪种数据库抽象,但您应该更新它以使用prepared statements

    接下来,您应该使用 MySQL 特定查询,例如:

    insert into date logs ... on duplicate key ignore 
    

    确保 Date 是主键。如果该键已存在于数据库中,这种查询将忽略插入。

    【讨论】:

    • 如果我将其设为主要,那么当另一个用户登录时会导致错误
    • 根据您的示例,您没有在日志表中存储任何特定于用户的信息,因此没关系。如果是这样 - 您可以在用户名和日期列上使用复合主键。
    • MyDB.exSQL("INSERT INTO date-logs (Date Code, Date) " + "VALUES ('"+dnow.format(new java.util.Date())+ " '," + "'"+dnow2.format(new java.util.Date())+"')");
    • 日期日志在另一张表中,因此当一个用户登录时...此代码将运行
    【解决方案3】:

    您应该做的是向date-logs 表添加另一个用户外键(也使其成为主键)。即使您两次插入相同的数据,它也会忽略查询,因为主键已经存在于数据库中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多