MyBatis - 在一个查询中执行连续删除和插入语句

时间:2018-01-03 15:37:03

标签: mysql xml mybatis

使用 MyBatis ,如何清除表格并在一个查询中插入新值?

普通SQL 我正在考虑以下几点:

START TRANSACTION;
DELETE...
INSERT...;
COMMIT;

有没有办法在XML格式中将其翻译成MyBatis?

我曾想过使用delete和insert命令创建一个简单的<sql>元素,但是我如何从XML中调用它?当然,必须从相应的标记(<insert><delete>)调用每个操作 ?

例如......

假设我想要清除一个名为所有学生的学生的表格,并与新学生填写相同的表格。我先用DELETE FROM StudentsTRUNCATE TABLE Students清除表格,然后我想用数据等重新填充表格...

INSERT INTO Students (name,age,class) VALUES (John,12,A), (Jim,12,A), (Jess,13,C);

StudentServiceImpl.java

public class StudentServiceImpl implements StudentService {
    Student get(Integer id) { ... };
    Student getByName(String name) { ... };
    Student update(Student student) { ... };
    Student create(Student student) { ... };
    void delete(Integer id) { ... };
    List<Student> list(int offset, int limit, String name) { ... };
}

StudentMapper.java

public interface StudentMapper {
  Student getStudent (Integer id);
  Student getStudent ByName(@Param("name") String name);
  void update(Student student);
  void create(Student student);
  void delete(Integer id);
  List<Student> list(RowBounds rowBounds);
  List<Student> listByName(@Param("name") String name,RowBounds rowBounds);
 }

1 个答案:

答案 0 :(得分:0)

理论上可以使用

<insert id="badWayOfInserting"> ${SQL} </insert>

并传递一个名为&#39; SQL&#39;的字符串变量to badWayOfInserting。尽管不推荐。

最好的选择是使用CDI的交易。你会有一个带有@Transactional注释的方法。或多或少是这样的:

@Transactional
public void deleteAndInsert(List<Item> listOfItems){
    db.deleteDB();
    db.insertItems(listOfItems);
}

CDI交易与数据库交易相同。只有一切顺利,它才会提交。