JdbcTemplate提供了异常转换器机制来处理数据库访问异常。主要步骤如下:
- 实现
SQLExceptionTranslator
接口:
public class MySQLExceptionTranslator implements SQLExceptionTranslator {
public DataAccessException translate(SQLException sqlEx) {
if (sqlEx instanceof SQLIntegrityConstraintViolationException) {
return new DuplicateKeyException(sqlEx.getMessage(), sqlEx);
}
return new UncategorizedSQLException(sqlEx.getMessage(), sqlEx);
}
}
- 返回的数据访问异常可以是Spring异常或自定义异常。
- 根据SQL异常的类型返回不同的异常。
- 注册异常转换器:
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.setExceptionTranslator(new MySQLExceptionTranslator());
return jdbcTemplate;
}
- JdbcTemplate抛出的数据访问异常将被异常转换器转换:
@Repository
public class UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void insert(User user) {
jdbcTemplate.update("INSERT INTO user (name) VALUES (?)", user.getName());
}
}
如果name字段在user表上有唯一索引,那么insert方法会抛出DuplicateKeyException
异常,而不是原生的SQLIntegrityConstraintViolationException
异常。
- 服务层和控制层进行异常捕获:
@Service
public class UserService {
@Autowired
private UserDao userDao;
public void saveUser(User user) {
try {
userDao.insert(user);
} catch (DuplicateKeyException e) {
// 处理重复用户名异常
}
}
}
所以,JdbcTemplate的异常转换器机制可以将数据库访问异常转换为Spring异常或自定义异常,方便服务层和控制层进行异常捕获和处理。