postgresql 从MyBatis< insert>Map的方法返回值

ccrfmcuu  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(7)|浏览(157)

我有一个Java项目,使用MyBatis访问PostgreSQL数据库。PostgreSQL允许在INSERT语句后返回新创建行的字段,我想用它来返回新创建记录的自动生成的BIGSERIALid。所以,我将XML中的insert命令更改为使用PostgreSQL的功能,在<insert>标记中添加resultType="long"属性,并在Map器的Java接口中将插入方法设置为返回long而不是void
当我试着运行这个程序时,我得到一个org.xml.sax.SAXParseException,它说Attribute "resultType" must be declared for element type "insert"
现在,当我将<insert>标记更改为<select>时,一切正常,但使用<select>标记执行INSERT语句让我感到困扰。
有没有办法让Map到<insert>标签的方法返回结果,或者MyBatis不是为这个设计的,我应该把它们作为<select>标签保存?

puruo6ea

puruo6ea1#

Map插入方法的返回类型可以是voidint(在这种情况下,它将返回插入的行数)。您可以执行以下机制来返回生成的id:

<insert id="insert" parameterClass="MyParameter">
  <selectKey order="AFTER" keyProperty="id" resultType="long">
    SELECT currval('my_seq')
  </selectKey>
  INSERT INTO mytable(col1, col2) VALUES (#{val1}, #{val2})
</insert>

字符串
这将把生成的id列设置为参数类的id属性。之后,作为参数传递的对象将在其属性中生成id

svujldwt

svujldwt2#

有两种方法(至少我知道)可以获得一个插入记录的ID:
例如,我们有一个类EntityDao

public class EntityDao {
     private Long id;
     private String name;
     // other fields, getters and setters
}

字符串

1.使用insert标签,返回object示例

MyBatis界面

public interface EntityDaoMapper {
    EntityDao insert(EntityDao entity);
}


MyBatis XMLMap器:

<insert id="insert" parameterType="com.package.EntityDao" useGeneratedKeys="true" keyColumn="entity_id" keyProperty="id">
    INSERT INTO some_table (name, type, other_fields, etc)
    VALUES (#{name}, #{type}, #{other_fields}, #{etc}) 
</insert>


示例代码:

EntityDao saved = entityDaoMapper.insert(entityToSave);
    System.out.println(saved.getId());

2.使用selectresultType标签只返回记录的ID

MyBatis界面

public interface EntityDaoMapper {
    Long insert(EntityDao entity);
}


MyBatis XMLMap器:

<select id="insert" parameterType="com.package.EntityDao" resultType="long">
    INSERT INTO some_table (name, type, other_fields, etc)
    VALUES (#{name}, #{type}, #{other_fields}, #{etc}) 
    RETURNING entity_id       <-- id only or many fields
</select>


示例代码:

Long id = entityDaoMapper.insert(entityToSave);
System.out.println(id);

nszi6y05

nszi6y053#

你可以使用如下方法。

<insert id="insertNewUser" parameterType="User">
            <selectKey keyProperty="userId" resultType="Integer" order="BEFORE">
                select NEXTVAL('base.user_id_seq')
            </selectKey>
            INSERT INTO base.user(
                user_id, user_name)
            VALUES (#{userId}, #{userName});
    </insert>

字符串
在Java类中,你已经调用了插入方法,你可以通过调用user.getUserId()来获取值。
基本上,下一个瓦尔存储在对象的变量中。Here userId inside User.

rm5edbpk

rm5edbpk4#

它也可以通过Java Records和mybatis注解来完成
实体名称:

record UserEntity (
    int id,
    String name,
){}

字符串
制图员:

@Select("INSERT INTO user (name) VALUES (#{name}) returning id")
int create(UserEntity entity);


这里的关键是使用@Select而不是@Insert,并在sql语句的末尾使用returning id

pu3pd22g

pu3pd22g5#

您也可以使用生成的密钥:

<insert id="create" parameterType="Skupina" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        INSERT INTO ODBOR 
            (NAZEV, POPIS, ZKRATKA, WEBROLE, JEODBOR, AKTIVNI)
        VALUES 
            (#{nazev}, #{popis}, #{webrole}, #{webrole}, false, #{aktivni})
  </insert>

字符串
插入后,参数的属性id设置为来自列id的值。

dzjeubhm

dzjeubhm6#

在本例中,使用选项

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;

@Mapper
public interface POJOCustomMapper {
    @Options(useGeneratedKeys = true, keyProperty = "ID", keyColumn = "ID") 
    @Insert({
        "insert into TABLE_A ( NAME "
        "values (#{NAME,jdbcType=VARCHAR})"
    })
    long insert(POJO record);

字符串

chhqkbe1

chhqkbe17#

使用“returning”返回对象的示例

<select id="insertOrderHeader" resultType="com.***.entity.OrderHeader">
    insert into order_header_t (order_id, delete_flag, organization_code)
    values (#{query.orderId}, #{query.deleteFlag}, #{query.organizationCode})
        returning order_id as orderId, delete_flag as deleteFlag, organization_code as organizationCode
</select>

字符串

相关问题