【问题标题】:get auto-genearated key for the inserted record in mybatis获取mybatis中插入记录的自动生成key
【发布时间】:2012-09-03 02:13:31
【问题描述】:

我正在一个使用 spring mvc + mybatis + mysql 的 Web 应用程序下工作。

我发现我无法为最后插入的记录获取自动生成的密钥(我已经搜索了很多)。

这是相关配置(以模型'Post'为例):

spring.xml:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    //omitted
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="config.xml" />
</bean>

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

mybatis config.xml

<configuration>
    <typeAliases>
        <typeAlias alias="Post" type="com.king.model.Post" />
    </typeAliases>
    <mappers>
        <mapper resource="com/king/model/PostMapper.xml" />
    </mappers>
</configuration>

PostMapper.xml:

<mapper namespace="com.king.model.PostMapper">
    <insert id="insert" parameterType="Post">
        insert into posts (title,body,created_at,updated_at) values (#{title},#{body},#{createDate},#{updateDate})
    </insert>
</mapper>

道:

public abstract class AbstractSimpleDaoImpl<T> extends SqlSessionDaoSupport{
    @Override
    public int add(T entity) {
        return getSqlSession().insert(getMapperNamespace() + ".insert", entity);
    }

    protected abstract String getMapperNamespace();
}

public class PostDao extends AbstractSimpleDaoImpl<Post> {
    @Override
    protected String getMapperNamespace() {
        return "com.king.model.PostMapper";
    }
}

但是,当我将新帖子插入数据库时​​:

postDao.add(post);

我无法为插入的帖子获取生成的 ID。我总是得到 1。我知道这是受行影响的数字。

另外,我阅读了 mybatis 指南,并尝试了这个:

<insert id="insert" parameterType="Post" useGeneratedKeys="true" keyProperty="id">

但是好像这样不行。

如何解决?

【问题讨论】:

    标签: spring-mvc mybatis


    【解决方案1】:

    实际上以下工作:

    <insert id="insert" parameterType="Post" useGeneratedKeys="true" keyProperty="id">
    
    postDao.add(post);
    

    会像以前一样返回 1,但 post.getId() 会得到密钥。

    【讨论】:

      【解决方案2】:

      这也可以使用注释来完成。

      final String INSERT = "insert into posts (title,body,created_at,updated_at) values (#{title},#{body},#{createDate},#{updateDate})";
      
      @Insert(INSERT)
      @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
      void insert(Post post) throws Exception;
      

      keyProperty设置为Java变量名。

      keyColumn设置为数据库中的列名。

      插入后,post.getId() 将拥有您生成的 ID。

      【讨论】:

        【解决方案3】:

        尝试使用以下代码;我在您的代码中添加了 keyColumn 字段:

        <insert id="insert" parameterType="Post" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> 
        

        或者,如果您使用的是 PostgreSql

        <insert id="insert" parameterType="Post" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> 
        <selectKey keyProperty="id" resultType="java.lang.Integer">
                SELECT
                currVal('your_tbl_seq') as id
            </selectKey> </insert>
        

        【讨论】:

          【解决方案4】:

          这将适用于 Spring Boot,使用注释并将 id 作为原始问题中的返回值。

          @Insert("insert into sources (host, created_at) values (#{host}, now())")
          @SelectKey(statement="select LAST_INSERT_ID()", keyProperty="id", before=false, resultType=long.class)
          long create(@Param("host") String host);
          

          然后long id = sourceMapper.create("abc"); 将返回您的主键。

          【讨论】:

            猜你喜欢
            • 2013-09-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-06
            • 2011-04-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多