【问题标题】:inserting new user object into JDBC through the servlet通过 servlet 将新用户对象插入 JDBC
【发布时间】:2019-09-13 18:23:39
【问题描述】:

这是我的 servlet 的代码,它从注册表单中接收用户名参数

String tusername=request.getParamater("un");

String dbURL="db.com";
String dbusername= "lc";
String dbpassword="lcpw";
Connection con=(Connection) DriverManager.getConnection(dbURL,dbusername,dbpassword);

Statement stmt= con.createStatement();

String query="SELECT * FROM users.username WHERE username=(tusername)";

ResultSet rs= stmt.executeQuery(query);

if(rs.next()==false){
  //create new userobject with value of tusername
 }

我的问题是如何使用 tusername 创建一个新的用户对象,会是这样吗?

if(rs.next()==false){
  Statement stmt=con.createStatament();

  String query="INSERT INTO user.username VALUE 'tusername'";
  ResultSet rs= stmt.updateQuery(query);

 }

我知道其中一些可能是过时的(例如不使用准备好的语句),我只是想更好地理解,我认为我有一些小的语法问题,谢谢 :)

【问题讨论】:

  • 由于您的代码在servlet中,我建议您在servlet容器(tomcat?jetty?)的配置中注册您的数据源,并通过JNDI获取。

标签: java servlets jdbc


【解决方案1】:

您应该使用NOT EXISTS 查询来执行插入操作,并且理想情况下您应该使用准备好的语句:

String sql = "INSERT INTO user.username (username) ";
sql += "SELECT ? FROM dual WHERE NOT EXISTS (SELECT 1 FROM user.username WHERE username = ?)";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, tusername);
ps.setString(2, tusername);
int result = ps.executeUpdate();

if (result > 0) {
    System.out.println("Inserted new user " + tusername + " into username table";
}
else {
    System.out.println("User " + tusername + " already exists; no new record was inserted");
}

我不知道您的实际数据库是什么。以上内容对于 MySQL 和 Oracle 来说应该是开箱即用的。对于其他数据库,可能需要稍作修改。

上述查询的替代方法是仅使用当前插入,但将 username 列设为(唯一)主键。在这种情况下,任何插入重复项的尝试都将在数据库级别失败,可能会导致 Java 代码出现异常。这也是一种与数据库无关的方法。

【讨论】:

  • 一种更传统的替代方法是在数据库中声明用户名的唯一键并捕获重复插入时发生的异常。这将更具声明性,并且也适用于访问该表的其他程序。面对并发可能也更安全(您可能需要非常高的隔离级别才能让此子查询检测冲突的插入)。
  • 完美的答案,但重复记录,即主键。
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 2017-07-07
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多