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   

哪里不对? 如何获取此插入的生成密钥? 谢谢!

如果要获取生成的主键,则应通过MapPOJO 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"); 

你可以通过两种方式实现这一目标,

  1. 通过使用useGeneratedKeys="true", keyProperty="id", keyColumn="id"

    keyProperty引用POJO变量名, keyColumn引用数据库中生成的列名

  2. 在insert标签中使用

简易方案:

使用KeyProperty属性作为KeyProperty如下所示…

useGeneratedKeys="true", KeyProperty="person.id", KeyColumn="id"

如果您查看MyBatis文档 ,请使用GeneratedKeyskeyProperty ,至少需要获取自动增量数据(对于某些数据库,您需要添加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; } 

请按照以下步骤操作:

  1. 使用id作为属性创建错误POJO

  2. 将returnId替换为错误,如下所示,

public void insertRecord(@Param(“error”)错误错误,@ Param(“timestamp”)时间戳时间戳,@ Param(“type”)字符串类型,@ Param(“message”)字符串消息,@ Param(“source”) )String source);

  1. 将keyProperty =“ID_ERROR”更改为keyProperty =“error.id”

  2. 去掉

      SELECT LAST_INSERT_ID() as returnedId  

您将在error.id插入id