获取mybatis中插入记录的自动生成密钥

hgu*_*ser 3 spring-mvc mybatis

我正在使用spring mvc + mybatis + mysql的web应用程序下工作.

我发现我无法获得最后插入记录的自动生成密钥(我已经用Google搜索了这么多).

这是相关的配置(例如,将模型'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>
Run Code Online (Sandbox Code Playgroud)

mybatis config.xml

<configuration>
    <typeAliases>
        <typeAlias alias="Post" type="com.king.model.Post" />
    </typeAliases>
    <mappers>
        <mapper resource="com/king/model/PostMapper.xml" />
    </mappers>
</configuration>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

道:

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

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

postDao.add(post);
Run Code Online (Sandbox Code Playgroud)

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

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

<insert id="insert" parameterType="Post" useGeneratedKeys="true" keyProperty="id">
Run Code Online (Sandbox Code Playgroud)

但似乎这不起作用.

怎么解决?

hgu*_*ser 13

实际上以下工作:

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

postDao.add(post);
Run Code Online (Sandbox Code Playgroud)

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


use*_*995 9

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

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;
Run Code Online (Sandbox Code Playgroud)

设置keyProperty为Java变量名称.

设置keyColumn为数据库中的列名称.

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