我正在使用spring mvc + mybatis + mysql的web应用程序下工作。
我发现我无法获取最后插入记录的自动生成密钥(我已经搜索了很多)。
这是相关的配置(以模型“Post”为例):
<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>
<configuration>
<typeAliases>
<typeAlias alias="Post" type="com.king.model.Post" />
</typeAliases>
<mappers>
<mapper resource="com/king/model/PostMapper.xml" />
</mappers>
</configuration>
<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">
但似乎这不起作用。
如何解决?
答案 0 :(得分:12)
事实上以下工作:
<insert id="insert" parameterType="Post" useGeneratedKeys="true" keyProperty="id">
postDao.add(post);
将像以前一样返回1,但post.getId()
将获得密钥。
答案 1 :(得分:8)
这也可以使用注释来完成。
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。
答案 2 :(得分:0)
尝试使用以下代码;我在您的代码中添加了 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>
答案 3 :(得分:0)
这对于使用注解并获得id
作为返回值的Spring Boot是有效的。
@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");
将返回您的主键。