【问题标题】:Java JDBC -insert record into database only if it does not existJava JDBC - 仅当记录不存在时才将记录插入数据库
【发布时间】:2017-03-12 04:37:23
【问题描述】:

我有一种方法可以检查数据库中是否存在记录。 如果记录在数据库中,它应该返回 false,但是如果它不存在,它应该插入记录并返回 true。

当前状态下的代码似乎可以正常工作,但是如果记录没有在需要时将新行插入数据库,我似乎无法弄清楚这是为什么。

public boolean createRecord(Myuser myuser) 
{
    Connection cnnct = null;
    PreparedStatement pStmnt = null;
    try
    {
        cnnct = getConnection();
        String preQueryStatement = "SELECT * FROM MYUSER WHERE MYUSER.USERID = ?";
        pStmnt = cnnct.prepareStatement(preQueryStatement);
        pStmnt.setString(1,myuser.getUserid());            

        ResultSet rs = pStmnt.executeQuery();
        if (!rs.next())
        {
            String insertStatement
            = "INSERT INTO MYUSER VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
            pStmnt = cnnct.prepareStatement(insertStatement);

            pStmnt.setString(1, myuser.getUserid());
            pStmnt.setString(2, myuser.getName());
            pStmnt.setString(3, myuser.getPassword());
            pStmnt.setString(4, myuser.getEmail());
            pStmnt.setString(5, myuser.getPhone());
            pStmnt.setString(6, myuser.getAddress());
            pStmnt.setString(7, myuser.getSecQn());
            pStmnt.setString(8, myuser.getSecAns());
            pStmnt.executeUpdate();

            System.out.println("new user inserted");
            return true;
        } 
        else
        {
            System.out.println("user already in data base");
            return false;
        }

    } 

    catch (SQLException ex) 
    {
        while (ex != null) 
        {
            ex.printStackTrace();
            ex = ex.getNextException();
        }
    } 

    catch (IOException ex) 
    {
        ex.printStackTrace();
    }

    finally 
    {
        if (pStmnt != null) 
        {
            try 
            {

                pStmnt.close();
            } 
            catch (SQLException e)
            {

            }
        }

        if (cnnct!= null) 
        {

            try 
            {
                cnnct.close();

            } 
            catch (SQLException sqlEx) 
            {

            }
        }
    }
}

【问题讨论】:

  • 也许你应该试试ResultSet rs = pStmnt.executeQuery(); if (! rs.next()) { ... }。也许您应该尝试阅读文档以了解 JDBC 的实际工作原理,例如The Java™ Tutorials - JDBC Basics - Retrieving and Modifying Values from Result Sets.
  • 所以您对 java 的经验很少,但您想研究高级主题,例如数据库交互或 j2ee 的东西?听起来你自己负担过重。考虑先学习基本知识。
  • 它适用于 uni 我主要有 C# 方面的经验,并且我对 mysql 有一些了解。
  • 请出示getConnection()的代码。此外,您正在吞咽异常。至少您应该记录它们(或使用ex.printStackTrace()
  • 你这样做完全错误。您应该使用单个原子 INSERT ... ON DUPLICATE IGNORE 语句。您的方式存在时间窗口问题。

标签: java mysql database jdbc


【解决方案1】:

ResultSet rs = pStmnt.executeQuery() 将返回永远不会为空的结果集,直到没有异常如果您想检查记录是否存在,您可以使用 rs.next() 方法验证是否存在任何记录或不在结果集中

 public boolean createRecord(Myuser myuser) 
    {
        Connection cnnct = null;
        PreparedStatement pStmnt = null;
        try
        {
            cnnct = getConnection();
            String preQueryStatement
            = "SELECT * FROM MYUSER WHERE MYUSER.USERID = ?;";
            pStmnt = cnnct.prepareStatement(preQueryStatement);
            pStmnt.setLong(1,youruserid);
            ResultSet rs = pStmnt.executeQuery();
            if (!rs.next())
            {
                String insertStatement
                = "INSERT INTO MYUSER VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
                PreparedStatement ps = cnnct.prepareStatement(insertStatement);

                ps.setString(1, myuser.getUserid());
                ps.setString(2, myuser.getName());
                ps.setString(3, myuser.getPassword());
                ps.setString(4, myuser.getEmail());
                ps.setString(5, myuser.getPhone());
                ps.setString(6, myuser.getAddress());
                ps.setString(7, myuser.getSecQn());
                ps.setString(8, myuser.getSecAns());

                System.out.println("new user inserted");
                return true;
            } 
            else
            {
                System.out.println("user already in data base");
                return false;
            }

        } 

        catch (SQLException ex) 
        {
            while (ex != null) 
            {
                ex.printStackTrace();
                ex = ex.getNextException();
            }
        } 

        catch (IOException ex) 
        {
            ex.printStackTrace();
        }

        finally 
        {
            if (pStmnt != null) 
            {
                try 
                {

                    pStmnt.close();
                } 
                catch (SQLException e)
                {

                }
            }

            if (cnnct!= null) 
            {

                try 
                {
                    cnnct.close();

                } 
                catch (SQLException sqlEx) 
                {

                }
            }
        }
    }

【讨论】:

  • 感谢您的回复,它至少帮助我完成了这项任务,并且我研究了 ResultSet 以了解它是如何工作的。该代码现在运行良好,没有错误,并且它正确确定了记录是否在数据库中,但是由于某种原因,即使添加了“ps.executeUpdate();”,它也不会将新记录插入数据库中。 /跨度>
猜你喜欢
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
  • 1970-01-01
  • 2019-11-22
  • 2013-05-03
  • 1970-01-01
  • 2018-04-02
相关资源
最近更新 更多