com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'admin' for key 'PRIMARY'
这个exception是在向数据库中添加用户时出现的,原因是用户代码作为主键,而再次向数据库中添加相同的用户代码时,就出现了“主键重复”这样的exception,所以解决这个exception的办法是在添加用户前,先判断数据库中是不是存在这样的user,代码如下:
/**
* 通过用户id查找用户
* @param userId
* @return如果存在返回用户user,不存在返回null
*/
public User findUserById(String userId){
String sql = "select * from t_user where user_id=?";
Connection conn = null;
PreparedStatement pstmt=null;
ResultSet rs = null;
User user = null;
try{
conn = DBUtil.getConnection();
pstmt= conn.prepareStatement(sql);
pstmt.setString(1, userId);
rs = pstmt.executeQuery();
//如果返回true,则表示存在user
if(rs.next()){
user = new User();
user.setUserId(rs.getString("user_id"));
user.setUserName(rs.getString("user_name"));
user.setPassword(rs.getString("password"));
user.setContactTel(rs.getString("contact_tel"));
user.setEmail(rs.getString("email"));
user.setCreateDate(rs.getTimestamp("create_date"));
}
}catch(SQLException e){
e.printStackTrace();
}finally{
DBUtil.close(rs);
DBUtil.close(pstmt);
DBUtil.close(conn);
}
return user;
}
说明:DBUtil是连接数据库的一个封装好的类,代码如下:
package com.wdh.drp.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBUtil {
/**
* 取得数据库连接
* @return
*/
public static Connection getConnection() {
Connection conn = null;
try {
//取得jdbc配置信息
JdbcInfo jdbcInfo = ConfigReader.getInstance().getJdbcInfo();
Class.forName(jdbcInfo.getDriverName());
conn = DriverManager.getConnection(jdbcInfo.getUrl(), jdbcInfo.getUsername(), jdbcInfo.getPassword());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void close(PreparedStatement pstmt) {
if (pstmt != null) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Connection conn) {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void commit(Connection conn) {
if (conn != null) {
try {
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void rollback(Connection conn) {
if (conn != null) {
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void setAutoCommit(Connection conn, boolean autoCommit) {
if (conn != null) {
try {
conn.setAutoCommit(autoCommit);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JdbcInfo类是封装数据库的,代码如下:
package com.wdh.drp.util;
public class JdbcInfo {
@Override
public String toString() {
return this.getClass().getName() + "{driverName=" + this.driverName +
",url=" + this.url +
",username=" + this.username +
",password=" + this.password + "}";
}
private String driverName;
private String url;
private String username;
private String password;
public String getDriverName() {
return driverName;
}
public void setDriverName(String driverName) {
this.driverName = driverName;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}