比较常见的一个问题 数据库重复查询 用User不能重复账号举例
注:使用mybatis和mysql
常规操作
需要先在数据库判断是否已有重复数据
public void saveUser(User user) throws ServiceException {
try {
//需要先对数据库查询一次
long sameCount = userDao.getSameCount(user.getAccount());
if(sameCount>0){
throw new ServiceException("用户已存在!");
}
//若不存在则保存
Integer ret = userDao.saveUser(user);
if(ret==null||ret<1){
throw new ServiceException("数据库操作失败!");
}
}catch (Exception e) {
LOGGER.error(e.getMessage());
throw new ServiceException("保存用户信息失败:"+e.getMessage());
}
}
但是这就对了数据库操作了两次 实在是不忍心折腾我的数据库 那么怎么办呢
骚操作
这时想到了数据库中的唯一索引 这就建一个试一试效果
测试一下
果然可以 但是如何在项目里提示呢
写test类的时候捕获异常 发现是MySQLIntegrityConstraintViolationException报出的
但是由于框架原因无法直接捕获 只能用过捕获Exception判断 代码如下
public void saveUser(User user) throws ServiceException {
try {
Integer ret = userDao.saveUser(user);
if(ret==null||ret<1){
throw new ServiceException("数据库操作失败!");
}
}catch (Exception e) {
if(e.getCause()!= null && e.getCause() instanceof MySQLIntegrityConstraintViolationException){
throw new ServiceException("此账号已存在!");
}else{
LOGGER.error(e.getMessage());
throw new ServiceException("保存用户信息失败:"+e.getMessage());
}
}
}
同样的 用这种思想在数据库中限制了字段长度也可以友好提示 如下
if(e.getCause()!= null && e.getCause() instanceof MysqlDataTruncation){
throw new ServiceException("账号长度过长!");
}
这样最后在控制层捕获异常信息发送到视图层就可以了 不用再折腾数据库了