我想判断 我生成的值去跟数据库里的值比较。如果有 相同值,不添加。如果没有相同值添加。这个逻辑能给我举个例子吗?。或者我生成的值添加后判断,已生成的值不再添加到数据库。求举个例,用什么方法弄。
最简单的办法就是设置这个字段为唯一索引!后台插入时捕获重复添加的错误,抛出指定异常信息提示
方法一:把数据库想要唯一值的字段,设置为唯一键。举例学号不重复。
-- 增加唯一键
create table my_unique(
number char(10) unique comment '学号',
name varchar(20) not null
)charset utf8;
方法二:使用数据库连接的工具类jdbcutils,根据sql从数据库查出想要的值,再用你生成的值和数据库的值去比较,如果重复则不做任何操作,如果不重复则插入数据库。
数据库连接的工具类jdbcutils代码如下所示
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;
public class JdbcUtils {
/**
* 获取连接
* @return
* @throws IOException
* @throws ClassNotFoundException
* @throws SQLException
*/
public static Connection getConnection() throws IOException, ClassNotFoundException, SQLException {
Properties props = new Properties();
props.load(JdbcUtils.class.getClassLoader().getResourceAsStream("application" +
".properties"));
String driverClassName = props.getProperty("driverClassName");
String url = props.getProperty("url");
String user = props.getProperty("username");
String password = props.getProperty("password");
Class.forName(driverClassName);
//2.获取连接
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
public static void release(Connection conn) throws SQLException {
conn.close();
}
public static void release(Connection conn, PreparedStatement ps) throws SQLException {
ps.close();
conn.close();
}
public static void release(Connection conn, PreparedStatement ps, java.sql.ResultSet rs) throws SQLException {
rs.close();
ps.close();
conn.close();
}
}
使用工具类从数据库查询值,再根据你生成的值做比较,如果重复则不做任何操作,如果不重复则插入数据库。代码示例如下所示:
import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
/*
使用PrepareStatement完成查询
*/
public class PrepareStatement {
@Test
public void test2() throws SQLException {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
//从数据库中查询想要查询的数据
try{
//1.获取连接
conn = JdbcUtils.getConnection();
//2.通过当前连接,获取PrepareStatement,用于发送sql
String sql = "select stunum,name,age,hobby,create_time from dw.stuinfo where stunum != ?";
ps = conn.prepareStatement(sql);
//3.填充占位符
ps.setInt(1,100010);
//4.执行sql
//ResultSet结果集
rs = ps.executeQuery();
//假设这是你生成的值
String randomName = "司马懿";
//5.获取结果集中的数据
while (rs.next()){ //移动结果集中记录到下一行,若有下一行则返回true,没有下一行则返回false
//根据列的索引获取对应列的数据
int stunum = rs.getInt(1);
String name = rs.getString(2);
int age = rs.getInt(3);
String hobby = rs.getString(4);
Date create_time = rs.getDate(5);
if(name == randomName){
System.out.println("数据库已有值,不做任何操作");
}else{
//数据库没有值,插入数据到数据库
String insertSql = "insert into dw.stuinfo(stunum,name,age,hobby,create_time)" +
" values(?,?,?,?,?)";
ps = conn.prepareStatement(sql);
}
System.out.println(stunum + "," + name + "," + age + "," + hobby + "," + create_time);
}
}catch (Exception e){
e.printStackTrace();
}finally {
JdbcUtils.release(conn,ps,rs);
}
}
}
需要有唯一主键或唯一性索引
<insert id="updateSettleForDuplicate">
insert into t_quota_settle
(year,quota_id,settle_amount,settle_price) values
<foreach collection="list" item="item" separator="," >
(#{item.year},#{item.quotaId},#{item.settleAmount},#{item.settlePrice})
</foreach>
ON DUPLICATE KEY UPDATE
year = VALUES(year),quota_id = VALUES(quota_id),settle_amount =
VALUES(settle_amount),settle_price = VALUES(settle_price)
</insert>
把不能重复的字段添加唯一性索引,或者设置为主键,插入的时候数据库会自动检查,如果已经存在就会插入失败。
如有帮助,请采纳,十分感谢!
有两个办法,一是在你要求不重复的这一列数据库设置唯一约束,重复的值就添加不进去了,另一个办法就跟你说的一样,值生成了,按值去查询数据库,查到了就说明重复,就不添加,查不到,就可以添加
1.可以在代码中判断,查询这个值在库里有没有决定是否添加
2.也可以在数据库设置唯一值,插入失败抛异常
通过数据库设置主键或者唯一值进行,或者你的程序代码做个验证逻辑,如查询一下数据库是否有重复数据,有的话就不加了,望采纳,谢谢!
这个一般可以在数据库中设置为主键进行约束,也可以在代码中判断是否重复,不重复就push
一下
不添加重复值主要涉及到一些单据编号,一些单据编号需要电脑生成,
建立一个表,存储单据编号
保存,类别、年、月、日,Batno(000-999)
保存数据的时候,取一个单号
并且更新年、月、日(日期发生编号),Batno(递增)
这样的话就不会重复
要么用数据库自己去判断,设置唯一约束;
要么程序去判断,插入前先查询下是否存在
1、设置唯一约束
2、插入前先判断
第一步,在项目中添加实体类,代码如下
/**
* 统一异常处理类
*/
@RestControllerAdvice
public class ExceptionHandler {
private final Logger logger = Logger.getLogger(ExceptionHandler.class);
@ExceptionHandler(DuplicateKeyException.class)
public void dataRepeatException(Exception e){
logger.error( e.getMessage() ) ;
throw new RuntimeException("生成的数据已存在,请不要重复添加");
}
}
第二步,在数据库中给表中被校验的字段添加唯一索引约束,如图
第三步:自己写添加逻辑
@Test
public void testInsert() {
String xxxId = UUID.randomUUID().toString();//xxxId为被校验唯一性的数据
myService.insert(xxxId);//自己写一个接口,然后调用dao插入数据库,此处不再细说,实现起来不难
}
可以用2种办法解决:
1.设计表时,将不能重复的值设置成主键或唯一
2.代码判段,插入之前先判断值在数据库中是否存在,存在不插入,不存在则插入。
看我博客写的uuid生成,可以生成无序的唯一id、也可以生成有序的唯一id。现成代码直接复制,拿走不谢