解决主键自增长保存问题
用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项目中,如果有需要可以在下面的连接中自行获取