MySQL根据某个字段判断新增或更新
有一个 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);
这样就省去了很多的业务逻辑代码,一定程度上可以提升效率
下一篇:
Oracle注入——报错注入