解决主键自增长保存问题

用mybatis来解决主键自增长保存问题

因为在使用mybatis的时候自增长的主键是不能在sql语句中用null来替代的

比如(错误的例子)

"insert into sys_user values(null,#{username},#{email},#{password},#{phoneNum})"

而用jdbcTemple的话需要用原始的jdbc去调用数据库对象这就造成了代码很冗长,如下(下面是一个DAO层方法)

  //创建PreparedStatementCreator
        PreparedStatementCreator creator = new PreparedStatementCreator() {
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException, SQLException {
                //使用原始jdbc完成有个PreparedStatement的组建
                PreparedStatement preparedStatement = connection.prepareStatement("insert into sys_user values(?,?,?,?,?)", PreparedStatement.RETURN_GENERATED_KEYS);
                preparedStatement.setObject(1,null);
                preparedStatement.setString(2,user.getUsername());
                preparedStatement.setString(3,user.getEmail());
                preparedStatement.setString(4,user.getPassword());
                preparedStatement.setString(5,user.getPhoneNum());
                return preparedStatement;
            }
        };
        //创建keyHolder
        GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
        jdbcTemplate.update(creator,keyHolder);
        //获得生成的主键
        long userId = keyHolder.getKey().longValue();
        return userId; //返回当前保存用户的id 该id是数据库自动生成的
    }

而用mybatis的话可以使用xml或者主键来简化这些,下面是例子(本人习惯用主键)

@Insert("insert into sys_user(username,email,password,phoneNum) values(#{username},#{email},#{password},#{phoneNum})")
    @Options(useGeneratedKeys = true,keyProperty = "id")
    Long save(User user);

注解直接可以写在mapper的接口上,这样就不用去写实现类了

下面解释一下@Options注解的作用:能够设置缓存时间,能够为对象生成自增的主键值(其实有两个应用场景)

useGeneratedKeys 设置为"true"表明要 MyBatis 获取由数据库自动生成的主键;

keyProperty="id"指定把获取到的主键值注入到 XXX(实体类) 的 id 属性


那么设置了这个注解后就可以用到了这个保存到实体类中的id属性

用法:只需要调用这个实体类的get方法

 public void save(User user, Long[] roleIds) {
        //第一步 向sys_user表中存储数据
        userMapper.save(user);
        Long userId=user.getId();//就直接去调用实体类中的id
        //第二步 向sys_user_role 关系表中存储多条数据
        for (Long roleId : roleIds) {
            userMapper.saveUserRoleRel(userId,roleId);
     }

说到这里就解决了如何在保存数据的时候主键为自增长,而又需要用到这个主键的解决办法

不过下面我提一下同时存储两个属性的时候一定要在接口处用@Param注明方法的参数与sql语句的参数对应关系

要不然会出现如下报错
在这里插入图片描述

例:

  @Insert("insert into sys_user_role values(#{userId},#{roleId})")
    void saveUserRoleRel(@Param("userId") Long userId,@Param("roleId") Long roleId);

上面的问题的解释代码都来自一个简单的ssm项目中,如果有需要可以在下面的连接中自行获取

码云

posted @ 2020-09-25 13:06  是小徐呀!  阅读(7)  评论(0编辑  收藏  举报  来源