以Teacher和Students为例 ,两者为一对多关系:**
Teacher 实体类
private String tid;
private String tName;
private List<Student> studentList;
public String getTid() {
return tid;
}
public void setTid(String tid) {
this.tid = tid;
}
public String gettName() {
return tName;
}
public void settName(String tName) {
this.tName = tName;
}
public List<Student> getStudentList() {
return studentList;
}
public void setStudentList(List<Student> studentList) {
this.studentList = studentList;
}
Student实体类
private String sid;
private String sName;
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getsName() {
return sName;
}
public void setsName(String sName) {
this.sName = sName;
}
应用场景 :在老师的service层批量插入老师数据
int nums=1000;
//定义teacher list
List<Teacher> teaList=new ArrayList<Teacher>();
//数据是通过excel读取的 此处模拟循环读取excel row数据
for(int rowi=0;rowi<nums;rowi++){
Teacher teacher=new Teacher();
teacher.settName("xxx");
List<Student> stuList=new ArrayList<Student>();
Student student=new Student();
//此处获取Students集合
for(xxx){
stuList.add(student);
}
//把student集合和teacher绑定
teacher.setStudentList(stuList);
//把teacher放入list
teaList.add(teacher);
}
// 批量插入老师数据
teacherMapper.batchInsertTeacher(teaList);
//此时每个teacher对象都有返回的主键id值
//老师主键 对应一个list(学生信息) map
Map<String,List<Student>> stuMap=new HashMap<>();
//填入数据 老师主键一对多学生信息
for(Teacher tea:teaList){
//非空判断 避免老师没有对应学生的情况(此处只进行逻辑处理 不考虑现实中老师没有学生)
if(tea.getStudentList()!=null&&tea.getStudentList().size()>0){
stuMap.put(tea.getTid(),tea.getStudentList());
}
}
//调用学生service的批量保存学生方法
studentService.batchInsertStudent(stuMap);
student Mapper接口文件
int batchInsertStudent(@Param("stuMap") Map<String,List<Student>> stuMap);
student mapper.xml文件(写法一:)
<insert id="batchInsertStudent" parameterType="java.util.Map">
INSERT INTO bs_student (sid,sName,tid)
values
<foreach collection="stuMap.keys" index="key" item="itemKey" separator=",">
<foreach collection="stuMap[itemKey]" index="index_list" item="list" separator="," >
( (select REPLACE(UUID(),'-','') AS sid) ,#{list.sName},#{itemKey} )
foreach>
foreach>
insert>
student mapper.xml文件(写法二:)
<insert id="batchInsertStudent" >
INSERT INTO bs_student (sid,sName,tid)
<foreach collection="stuMap.keys" index="index" item="itemKey" separator="UNION ALL">
<foreach collection="stuMap[itemKey]" index="index_list" item="list" separator="UNION ALL">
(
SELECT
(select REPLACE(UUID(),'-','') AS sid)
,#{list.sName}
,#{itemKey}
FROM DUAL
)
foreach>
foreach>
insert>
stuMap:就是在接口中使用@Param(“stuMap”)标注了变量;
使用stuMap.keys可以取到所有的key,遍历。
内层循环中使用stuMap[itemKey]类似stuMap.get(“key”)取当前key对应的value值。由于value是list所以还需要遍历。
结果保存成功。再次膜拜强大的Mybatis。
至此 成功插入student数据。
自定义类
class EnclosingType{
private String uuid;
private List<ElementType> elements;
}
class ElementType{
String a;
String b;
(...)
}
Mapper.xml(方法一)
<mapper namespace="my.example.ElementType">
<insert id="insertElements" parameterType="EnclosingType">
INSERT INTO table1(enclosingTypeId,column_a,column_b)
VALUES
<foreach collection="elements" index="index" item="list" separator=",">
(
#{uuid,jdbcType=VARCHAR}
,#{list.a,jdbcType=VARCHAR}
,#{list.b,jdbcType=VARCHAR}
)
foreach>
insert>
mapper>
Mapper.xml(方法二)
<mapper namespace="my.example.ElementType">
<insert id="insertElements" parameterType="EnclosingType">
INSERT INTO table1(enclosingTypeId,column_a,column_b)
<foreach collection="elements" index="index" item="list" separator="union all">
(
select #{uuid,jdbcType=VARCHAR}
,#{list.a,jdbcType=VARCHAR}
,#{list.b,jdbcType=VARCHAR}
from dual
)
foreach>
insert>
mapper>