有一个 USER
表,字段有:id
、username
、password
、email
、phone
我们需要开发一个创建用户接口,username
唯一,判断username
是否存在,如果存在,就更新,不存在,就新增
看一下正常代码
// 创建用户
public void createUser(User user) {
User userInfo = this.getUserByName(user.getUsername());
if (null != userInfo) {
userMapper.updateByName(user);
//刷新缓存
cache.put(user.getUsername(), user);
} else {
userMapper.createUser(user);
}
}
//根据用户名查用户
public User getUserByName(String username) {
User cacheUser = cache.getIfPresent(username);
if (cacheUser != null) {
return cacheUser;
}
log.info("----------- 从数据库查询用户信息 -----------");
User user = userMapper.getUserInfoByName(username);
if (null != user) {
cache.put(username, user);
}
return user;
}
我们先调用getUserByName
查询用户信息,然后根据返回的结果是否为null
,再判断是更新还是新增
这段代码没有任何问题,但是getUserByName
这段代码还是有很多业务逻辑的,一定程度上会影响性能
优化
我们可以通过给username
字段加上唯一索引
create unique index idx_username on user (username);
然后去掉代码判断用户是否存在,直接改用SQL
执行
修改后的代码
@Override
public void createUser(User user) {
userMapper.createUser(user);
//刷新缓存
cache.put(user.getUsername(), user);
}
@Insert("insert into user(username,password,first_name,last_name,email,phone) values(#{username},#{password},#{firstName},#{lastName},#{email},#{phone}) " +
"ON DUPLICATE KEY UPDATE " +
"password=#{password},first_name=#{firstName},last_name=#{lastName},email=#{email},phone=#{phone}")
int createUser(User user);
这样就省去了很多的业务逻辑代码,一定程度上可以提升效率