Vagrant- 2014-10-14 08:57 采纳率: 0%
浏览 1356

得到主键自动增长值KeyHolder

为什么我的代码执行后KeyHolder的值还是为空呢?
`public class UserDaoImpl implements IUserDao {
private NamedParameterJdbcTemplate simpleJdbcTemplate = new NamedParameterJdbcTemplate (JDBCUtils4.getDataSource());
@Override
public boolean addUser(RegistForm registForm) throws Exception {
//使用命名参数来给"?"占位符命名
String sql = "insert into user(username,birthday,major,score) values(:username,:birthday,:major,:score)";
//给各个占位符赋值
SqlParameterSource param = new BeanPropertySqlParameterSource(registForm);
//执行更新操作
KeyHolder keyHoder = new GeneratedKeyHolder();
int count = this.simpleJdbcTemplate.update(sql, param, keyHoder);

            System.out.println("-------------------------------"+keyHoder+"----------------------");
            int id = keyHoder.getKey().intValue();

            registForm.setId(id);
            if(count>0)
                return true;
            else 
                return false;
        }
}

`

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-02 21:16
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在Spring框架中,@Entity注解会自动为实体类生成一个主键。这个主键通常是通过数据库自动生成的,而不是由用户手动指定。

    如果你想要控制主键的生成方式,可以考虑使用以下方法:

    1. 使用@GeneratedValue(strategy=...)属性: 在上面的例子中,你可以使用strategy=GenerationType.IDENTITY来指定主键是根据当前时间或系统唯一标识符自动生成的。

    2. 使用@Id注解: 你可以在你的实体类上添加@Id注解,并设置其column属性来指定对应的列名。

    3. 自定义主键生成器: 如果你需要更复杂的逻辑来生成主键,可以创建一个自定义的主键生成器并注入到你的实体类中。

    这里是一个示例代码,展示了如何使用自定义主键生成器:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.JdbcTemplate;
    import java.util.HashMap;
    
    public class CustomUserDaoImpl implements IUserDao {
        private JdbcTemplate jdbcTemplate;
    
        @Autowired
        public CustomUserDaoImpl(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }
    
        @Override
        public boolean addUser(RegistForm registForm) throws Exception {
            HashMap<String, Object> params = new HashMap<>();
            params.put("username", registForm.getUsername());
            params.put("birthday", registForm.getBirthday());
            params.put("major", registForm.getMajor());
            params.put("score", registForm.getScore());
    
            // 自定义主键生成器
            String sql = "INSERT INTO USER (USERNAME, BIRTHDAY, MAJOR, SCORE) VALUES (?, ?, ?, ?)";
            String generatedKeySql = "SELECT LAST_INSERT_ID()";
    
            int result = jdbcTemplate.update(generatedKeySql, params);
            
            if(result > 0){
                // 根据结果获取主键
                return true;
            } else {
                throw new RuntimeException("Failed to generate primary key.");
            }
        }
    }
    

    在这个例子中,我们首先创建了一个自定义的主键生成器,然后将它作为参数传递给了@Entity注解。这样,当我们在addUser()方法中调用这个生成器时,就会自动为其分配一个新的主键。

    评论

报告相同问题?