如何使用 MyBatis 获取插入的生成密钥?我读了很多关于这个问题的页面,但我仍然被阻止,有人可以帮助我吗?
这是我的代码:
桌子:
ID_ERROR long primary key
DATE timestamp
TYPE varchar
MESSAGE varchar
SOURCE varchar
DAO:
Long returnedId = 0L;
MyMapper myMapper = this.sqlSession.getMapper(MyMapper.class);
myMapper.insertRecord(returnedId, Utils.now(), t.getClass().getName(), t.getMessage(), c.getName());
return returnedId;
mapper.java:
public void insertRecord(@Param("returnedId") Long returnedId, @Param("timestamp")Timestamp timestamp,@Param("type") String type,@Param("message") String message,@Param("source") String source);
mapper.xml
<insert id="insertRecord" parameterType="map" useGeneratedKeys="true" keyProperty="ID_ERROR">
INSERT INTO errors (
DATE,
TYPE,
MESSAGE,
SOURCE
)
VALUES (
#{timestamp},
#{type},
#{message},
#{source}
)
<selectKey resultType="long" order="AFTER" keyProperty="returnedId">
SELECT LAST_INSERT_ID() as returnedId
</selectKey>
</insert>
出了什么问题?如何获取此插入的生成密钥?
对我来说它是这样工作的(mybatis 3.x).. mysql表中的id必须设置自动递增
<insert id="createEmpty" parameterType="Project" useGeneratedKeys="true" keyProperty="project.projectId" keyColumn="PROJECT_ID">
INSERT INTO PROJECT (TITLE,DESCRIPTION)
VALUES
(#{title},#{description})
</insert>
keyProperty="project.projectId"
和 useGeneratedKeys="true"
我的界面是:
public int createEmpty(@Param("project") Project project, @Param("title") String title,
@Param("description") String description);
最后,为了获取值(将自动分配给 pojo 的 id 属性),我使用:
projectRepository.createEmpty(p, "one", "two");
System.err.print(p.getProjectId() + "\n");
您可以通过两种方式实现这一目标,
通过使用
useGeneratedKeys="true", keyProperty="id", keyColumn="id"
keyProperty
指的是POJO变量名称,keyColumn
指的是数据库中生成的列名称通过在插入标签内使用
<selectKey/>
简单的解决方案:
使用
KeyProperty
属性作为 objectName.AutoincrementId
就像下面...
useGeneratedKeys="true", KeyProperty="person.id", KeyColumn="id"
如果你看一下 MyBatis 文档,你至少需要使用 useGeneeratedKeys 和 keyProperty 来获取自增数据(对于某些数据库,你需要添加 keyColumn)。
如您所见,useGenerateKeys 取决于是否/如何实现数据库的 JDBC 的 getGeneretadKeys 方法。
例如,对于mysql或H2,getGeneretadKeys仅支持一列。最后生成的密钥将是 getGeneretadKeys 返回的密钥。
总之,在您的情况下,您只需要添加 useGeneeratedKeys 和 keyProperty (使用 ID_ERROR auto_increment):
Mapper.xml
<resultMap type='pathToJavaClass/Error' id='error'>
<id property='id' column='ID_ERROR' />
<result property='timestamp' column='DATE' />
<result property='type' column='TYPE'/>
<result property='message' column='MESSAGE'/>
<result property='source' column='SOURCE'/>
</resultMap>
<insert id="insertRecord" parameterType="error" useGeneratedKeys="true" keyProperty="id">
INSERT INTO errors (
DATE,
TYPE,
MESSAGE,
SOURCE
)
VALUES (
#{timestamp},
#{type},
#{message},
#{source}
)
</insert>
接口.java
public void insertRecord(@Param("error") Error error);
如果检索生成的 Key 时仍然遇到问题,请检查 mysql 的 JDBC 文档(旧版本可能未实现 getGeneretadKeys)。
在 xml 文件中放入以下 5 行:
<insert id="createPet" parameterType="java.util.Map"
useGeneratedKeys="true" keyProperty="id">
INSERT INTO Pet (NAME, OWNER, SPECIES, SEX, BIRTH)
VALUES (#{name}, #{owner}, #{species}, #{sex}, #{birth})
</insert>
在Java主类中创建该方法并在main方法中调用它:
public int createPet(PetDVO petDVO) throws Exception {
HashMap<String, Object> inputMap = new HashMap<String, Object>();
inputMap.put("name", petDVO.getName());
inputMap.put("owner", petDVO.getOwner());
inputMap.put("species", petDVO.getSpecies());
inputMap.put("sex", petDVO.getSex());
inputMap.put("birth", petDVO.getBirth());
/**
* Get the sql session and commit the data
*/
SqlSession sqlSession = getSqlSession();
sqlSession.insert("createPet", inputMap);
sqlSession.commit();
BigInteger newID = (BigInteger)inputMap.get("id");
return newID.intValue();
}
但是你应该自己创建 PetDVO 类。就是这样。
将 Select 注释与 insert sql 和 RETURNING 指示一起使用。
以下代码适用于 Postgres、MyBatis 3.5.0。
@Select("insert into db_mutil_route(user_id, pk, instance_id, name, create_time, update_time) values(#{userId}, #{pk}, #{instanceId}, #{name}, now(), now()) RETURNING id")
@Options(flushCache = Options.FlushCachePolicy.TRUE, useGeneratedKeys = true, keyProperty = "id", keyColumn="id")
Route insert(Route dbRoute);
在generatorConfig.xml中
<table tableName="models" domainObjectName="Model">
<generatedKey column="id" sqlStatement="MySql" identity="true"/>
</table>
通过
modelMapper().insertSelective(model)
插入后,可以通过model.getId()
获取主键
在 Mapper Xml 下,使用查询:
<insert id="saveDemo" parameterType="com.abc.demo"
useGeneratedKeys="true" keyProperty="demoId" keyColumn="DEMOID">
INSERT INTO TBL_DEMO (DEMONAME,DEMODESCRIPTION)
VALUE (#{demoName},#{demoDescription})
<selectKey keyProperty="demoId" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID();
</selectKey>
</insert>
Java 端
@Override
public boolean saveDemo(Demo demo) {
boolean status = false;
SqlSession session = this.sqlSessionFactory.openSession();
try {
DemoMapper mapper = session.getMapper(DemoMapper.class);
mapper.saveDemo(demo);
session.commit();
status = true;
} catch(PersistenceException e) {
System.out.println(e);
} finally {
session.close();
}
return status;
}
<insert id="insert" parameterType="org.hzz.points.infrastructure.dao.model.points.PointsBoardSeason">
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
insert into points_board_season (name, begin_time, end_time
)
values (#{name,jdbcType=VARCHAR}, #{beginTime,jdbcType=DATE}, #{endTime,jdbcType=DATE}
)
</insert>
请按照以下步骤操作:
创建带有 id 作为属性的 Error POJO
将 returnId 替换为下面的错误,
public void insertRecord(@Param("error") 错误错误, @Param("timestamp")时间戳时间戳,@Param("type") String 类型,@Param("message") 字符串消息,@Param("source") 字符串源);
将 keyProperty="ID_ERROR" 更改为 keyProperty="error.id"
删除
<selectKey resultType="long" order="AFTER" keyProperty="returnedId">
SELECT LAST_INSERT_ID() as returnedId
</selectKey>
您将被插入
id
中 error.id
如果你想获取生成的主键,你应该通过
Map
或 POJO Object
传递参数
public void insertRecord(Map<String, Object> map);
调用映射方法时,将值放入映射中。
Map<String, Object> map = new HashMap<String, Object>();
map.put("returnedId", 0);
map.put("message", message);
// other paramters
mapper.insertRecord(map);
return map.get("returnedId");