MyBatis,如何获取插入的自动生成密钥?
如何使用MyBatis获取插入的生成密钥? 我读了很多关于这个问题的网页,但我仍然被封锁了,有人可以帮帮我吗? 这是我的代码:
桌子:
ID_ERROR long primary key DATE timestamp TYPE varchar MESSAGE varchar SOURCE varchar
道:
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 INTO errors ( DATE, TYPE, MESSAGE, SOURCE ) VALUES ( #{timestamp}, #{type}, #{message}, #{source} ) SELECT LAST_INSERT_ID() as returnedId
哪里不对? 如何获取此插入的生成密钥? 谢谢!
如果要获取生成的主键,则应通过Map
或POJO Object
传递参数
public void insertRecord(Map map);
调用映射方法时,将值放到映射中。
Map map = new HashMap(); map.put("returnedId", 0); map.put("message", message); // other paramters mapper.insertRecord(map); return map.get("returnedId");
对我来说它是这样工作的(mybatis 3.x)..必须在mysql表中设置id自动增量
INSERT INTO PROJECT (TITLE,DESCRIPTION) VALUES (#{title},#{description})
注意 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
引用数据库中生成的列名 -
在insert标签中使用
简易方案:
使用KeyProperty
属性作为KeyProperty
如下所示…
useGeneratedKeys="true", KeyProperty="person.id", KeyColumn="id"
如果您查看MyBatis文档 ,请使用GeneratedKeys和keyProperty ,至少需要获取自动增量数据(对于某些数据库,您需要添加keyColumn )。
如您所见,useGeneratedKeys取决于是否/如何实现dataBase的JDBC的getGeneretadKeys方法。
例如,使用mysql或H2,getGeneretadKeys仅支持一列。 最后生成的密钥将是getGeneretadKeys返回的密钥。
总之,在您的情况下,您只需要添加useGeneratedKeys和keyProperty(使用ID_ERROR auto_increment):
Mapper.xml
INSERT INTO errors ( DATE, TYPE, MESSAGE, SOURCE ) VALUES ( #{timestamp}, #{type}, #{message}, #{source} )
Interface.java
public void insertRecord(@Param("error") Error error);
如果您仍然遇到一些问题来检索生成的密钥,请查看mysql JDBC的文档(旧版本可能无法实现getGeneretadKeys)。
在Mapper Xml下,使用查询:
INSERT INTO TBL_DEMO (DEMONAME,DEMODESCRIPTION) VALUE (#{demoName},#{demoDescription}) SELECT LAST_INSERT_ID();
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; }
请按照以下步骤操作:
-
使用id作为属性创建错误POJO
-
将returnId替换为错误,如下所示,
public void insertRecord(@Param(“error”)错误错误,@ Param(“timestamp”)时间戳时间戳,@ Param(“type”)字符串类型,@ Param(“message”)字符串消息,@ Param(“source”) )String source);
-
将keyProperty =“ID_ERROR”更改为keyProperty =“error.id”
-
去掉
SELECT LAST_INSERT_ID() as returnedId
您将在error.id
插入id