数据库不重复页面友好提示优化方案

比较常见的一个问题 数据库重复查询 用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("账号长度过长!");
}

这样最后在控制层捕获异常信息发送到视图层就可以了 不用再折腾数据库了

上一篇:Spring的bean创建方式ref使用方法


下一篇:Spring 控制器层如何调用DAO层