[英]jdbc insert into database with auto increment field
我的代碼中有這個:
String query
= "INSERT INTO usermail (FirstName, LastName, Town, Country, Email) "
+ "VALUES (?, ?, ?, ? ,?)";
我的表如下:
UserID – AutoNumber (Primary Key)
FirstName – varchar(15)
astName – varchar (15)
Town – varchar(15)
Country – varchar(15)
Email – varchar(20)
問題是,當我第一次填寫表格時,所有值都被添加到了數據庫中,但是如果我第二次嘗試這樣做,它們將不會被添加。 如果我刪除了UserID表,一切將正常運行。 這就是我創建UserID的方式(圖片來自- 這里 )
我不確定如何使其與UserID一起使用。 我無法在其中輸入任何內容,因為我的表格中沒有這樣的字段。
這是我從stackTrace中得到的
Info: visiting unvisited references
Info: visiting unvisited references
Info: Loading application [MailRegistration] at [/MailRegistration]
Info: MailRegistration was successfully deployed in 293 milliseconds.
Severe: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'PRIMARY'
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1040)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
at Data.MailDB.insert(MailDB.java:32)
at details.DisplayUserDetailsServlet.doPost(DisplayUserDetailsServlet.java:44)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
at java.lang.Thread.run(Thread.java:745)
我使用MariaDB實現了您的問題。 工作正常。 這是我的表創建SQL:
create table contact (
id MEDIUMINT not null AUTO_INCREMENT,
firstName VARCHAR(64),
lastName varchar(128),
city varchar(64),
state char(2),
email VARCHAR(64),
PRIMARY KEY (id)
);
我創建了一個模型對象Contact
:
package database.mariadb.model;
import org.apache.commons.lang3.builder.ToStringBuilder;
/**
* Created by Michael
* Creation date 3/21/2017.
* @link
*/
public class Contact {
private Long id;
private String firstName;
private String lastName;
private String city;
private String state;
private String email;
public Contact(String firstName, String lastName, String city, String state, String email) {
this(null, firstName, lastName, city, state, email);
}
public Contact(Long id, String firstName, String lastName, String city, String state, String email) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.city = city;
this.state = state;
this.email = email;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String getCity() {
return city;
}
public String getState() {
return state;
}
public String getEmail() {
return email;
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("id", id)
.append("firstName", firstName)
.append("lastName", lastName)
.append("city", city)
.append("state", state)
.append("email", email)
.toString();
}
}
我創建了一個存儲庫接口:
package database.mariadb.persistence;
import database.mariadb.model.Contact;
import java.util.List;
/**
* Created by Michael
* Creation date 3/21/2017.
* @link
*/
public interface ContactRepository {
List<Contact> findAll();
void insert(Contact contact);
}
我實現了接口:
package database.mariadb.persistence;
import database.mariadb.model.Contact;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Michael
* Creation date 3/21/2017.
* @link
*/
public class ContactRepositoryImpl implements ContactRepository {
private static final String FIND_ALL_SQL = "SELECT id, firstName, lastName, city, state, email from contact ";
private static final String INSERT_SQL = "INSERT INTO contact(firstName, lastName, city, state, email) values(?, ?, ?, ?, ?) ";
private Connection connection;
public ContactRepositoryImpl(DataSource dataSource) throws SQLException {
this.connection = dataSource.getConnection();
}
public ContactRepositoryImpl(Connection connection) {
this.connection = connection;
}
@Override
public List<Contact> findAll() {
List<Contact> result = new ArrayList<>();
try (Statement st = connection.createStatement();
ResultSet rs = st.executeQuery(FIND_ALL_SQL)) {
while (rs.next()) {
Long id = rs.getLong("id");
String firstName = rs.getString("firstName");
String lastName = rs.getString("lastName");
String city = rs.getString("city");
String state = rs.getString("state");
String email = rs.getString("email");
result.add(new Contact(id, firstName, lastName, city, state, email));
}
} catch (SQLException e) {
e.printStackTrace();
}
return result;
}
@Override
public void insert(Contact contact) {
if (contact != null) {
try (PreparedStatement ps = connection.prepareStatement(INSERT_SQL, Statement.RETURN_GENERATED_KEYS)) {
ps.setString(1, contact.getFirstName());
ps.setString(2, contact.getLastName());
ps.setString(3, contact.getCity());
ps.setString(4, contact.getState());
ps.setString(5, contact.getEmail());
int numRowsAffected = ps.executeUpdate();
try (ResultSet rs = ps.getGeneratedKeys()) {
if (rs.next()) {
contact.setId(rs.getLong(1));
}
} catch (SQLException s) {
s.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JUnit測試可以完美地工作。
如果我多次插入相同的聯系人,則會得到預期的結果:具有新ID和相同數據的多行。
當您以這種方式創建表時:
create table usermail (
UserID BIGINT NOT NULL AUTO_INCREMENT,
FirstName varchar(15),
LastName varchar(15),
Town varchar(15),
Country varchar(15),
Email varchar(2),
PRIMARY KEY (UserID)
);
您應該能夠以嘗試的方式添加記錄。 當您單擊“ INCREMENT BY 1”左邊的檢查字段時,它也可能起作用
我認為您的代碼每次運行都會從相同的數字開始遞增(不確定您在哪里生成Userid)。 您可以有一個帶有用戶ID的單獨表,並在每次運行程序時對其進行遞增。 這樣,最新的用戶標識將存儲在“用戶標識”表中。
然后,您可以檢索該值並將其插入“ usermail”表中。 像這樣:
int userid= "Select userid from USERID_TB";
//Execute query and get value of userid
String query
= "INSERT INTO usermail (Userid,FirstName, LastName, Town, Country, Email) "
+ "VALUES (userid,?, ?, ?, ? ,?)";
String update="update USERID_TB set userid="+(userid+1)+"where userid="+userid";
我使用這種設計來維護用戶ID列表,因此我總是擁有最新的計數,而不必在前端代碼中進行維護。 希望這對您有用!
解決此自動遞增主鍵問題的簡單解決方案如下:這里的ID是整數,但是我們可以為第一個'?'設置具有空值的字符串。 並且請不要提及列名,它將按表中的列順序插入值。
String insertQueryStatement = "INSERT INTO MATRIX_A VALUES (?,?,?,?,?)";
preparedStatement = connection.prepareStatement(insertQueryStatement);
preparedStatement.setString(1, null);
preparedStatement.setString(2, entity.getType());
preparedStatement.setString(3, entity.getGroup());
preparedStatement.setString(4, entity.getLoss());
preparedStatement.setString(5, entity.getSeverity());
preparedStatement.executeUpdate();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.