1

我正在将 postgres 用于我刚开始从事的项目,我意识到 Mybatis 提供支持以检索许多数据库的自动生成的 id 键,但不幸的是 postgres 不是其中之一,我对生成的 sql 映射器进行了一些修改并且: - 在生成的 xml 中更改选择而不是插入 - 添加“返回 id”作为每个句子的最后一行

所以它看起来像:

<select id="insert" keyColumn="id" keyProperty="id" parameterType="com.myproject.Order" ...
    insert into ...
    ...
    RETURNING id
</select>

有了这个更改,它就像一个魅力,但问题是,一旦再次执行生成器,应该再次手动应用更改,我正在寻找一个插件来帮助我自动化更改,但我没有找到任何似乎帮忙,你之前做过类似的事情吗?建议是什么?

4

1 回答 1

2

为了解释,我users在 schema 中创建了一个表mbtest

create table mbtest.users (
  id serial primary key,
  name varchar(20)
);

以下是<table />生成器配置中的元素。(在评论中,我写了sqlStatementType,但应该是sqlStatement

<table tableName="users" domainObjectName="User"
    schema="mbtest">
  <generatedKey column="id" sqlStatement="JDBC" />
</table>

生成的“UserMapper.xml”包含以下插入语句。请注意 ,useGeneratedKeys并由keyColumn上述内容keyProperty填充<generatedKey />

<insert id="insert" keyColumn="id"
    keyProperty="id" parameterType="test.model.User"
    useGeneratedKeys="true">
  <!--
    WARNING - @mbg.generated
    This element is automatically generated by MyBatis Generator, do not modify.
    This element was generated on Sun Dec 08 12:36:30 JST 2019.
  -->
  insert into mbtest.users (name)
  values (#{name,jdbcType=VARCHAR})
</insert>

(正如警告所说,您不应该修改生成的语句)

insert语句会将生成的密钥设置为 的id属性User

try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
  UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  User user = new User();
  user.setName("User1");
  mapper.insert(user);
  sqlSession.commit();
  assertNotNull(user.getId());
}

这是一个演示项目,您可以验证自己。

于 2019-12-08T04:09:01.120 回答