如何使用myBatis

时间:2018-02-22 14:28:51

标签: java mybatis

我需要使用myBatis select键和Java将数据存储在2个表中,任何人都可以帮忙解决这个问题。我的表结构是:

     Temp                                          Sect
id name created_at                           sid  sectName  duration   priorty

现在我需要在Temp和Sect表中插入name,sectName,duration,priority,我写的代码是:

@Insert("insert into Temp (name) values(#{name})")
@SelectKey(statement="call identity()", keyProperty="id", before=false, 
resultType=int.class)
public int insertTemp(Name name);

@Insert("insert into sect (name,duration.priority) values(#{name}, #
{duration},#{priority})")
@SelectKey(statement="call next value for TestSequence", 
keyProperty="nameId", before=true, resultType=int.class)
public int insertSect(sectName name);

我的POJO课程是:

Public Temp{
  private int id;
  private String name;
  private int creat_at;
  //setters getters
}

Public Temp{
  private int sid;
  private String sectName;
  private int duration;
  private int priority;
  //setters getters
}

请有人告诉我如何编写该查询以及我编写的命令是正确还是错误?

1 个答案:

答案 0 :(得分:0)

你的模型有点令人困惑。我假设f第二个Temp应该被命名为“Sect”

你实际上在insertSect中使用了before = true。您可以这样使用:

//First insert into db
@Insert("insert into sect (**id**, name,duration.priority) values(**#{id}**, #{name}, #
{duration},#{priority})")
(...)
public int insertSect(sectName name);

//second insert
@Insert("insert into Temp (**id**, name) values(**#{id}**, #{name})")
//there's no select key anymore
public int insertTemp(**@Param("name")** Name name, **@Param("id") id**);

//and calling it
mapper.insertSect(sect)
sect.getId() //will return ID returned by "call next value for TestSequence"
mapper.insertTemp(name, sect.getId())

'**'字符用于引起对代码更改的注意。不幸的是,在代码部分没有粗体文​​字。

如果在插入后不需要在一个对象中创建ID,也可以使用一个插入。

@Insert("insert into Temp(id, name) values (#{sect.id}, #{name});
insert into Sect(id, name, ...) values (#{sect.id}, #{sect.name}, ...)")
@SelectKey(statement="call next value for TestSequence", 
keyProperty="sect.id", before=true, resultType=int.class)
public void insert(@Param("sect") Sect sect, @Param("name") String name)

如果你需要使用两个不同的键,最好的方法是使用一个方法,它将调用两个插入并只注释为@Transcational,因此第二个插入的失败将回滚第二个,例如。

@Transactional
void insert(...) {
    mapper.firstInsert(...)
    mapper.secondInsert(...)
}

如果不是您想要的,请澄清 - 现在您的问题(和型号)有点令人困惑。