mybatis多对多关联实战教程(推荐)

所属分类: 软件编程 / java 阅读数: 26
收藏 0 赞 0 分享

MyBatis3.0 添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作

一、创建student、teacher和stu_teach_rel三张张表

DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
 `id` int(11) NOT NULL,
 `name` varchar(255) DEFAULT NULL,
 `age` int(11) DEFAULT NULL,
 `gender` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `student` VALUES ('1', '刘德华', '55', '0');
INSERT INTO `student` VALUES ('2', '张惠妹', '49', '1');
INSERT INTO `student` VALUES ('3', '谢霆锋', '35', '0');
INSERT INTO `student` VALUES ('4', '王菲', '47', '1');
INSERT INTO `student` VALUES ('5', '汪峰', '48', '0');
INSERT INTO `student` VALUES ('6', '章子怡', '36', '1');
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
 `id` int(11) NOT NULL,
 `name` varchar(255) DEFAULT NULL,
 `gender` varchar(255) DEFAULT NULL,
 `subject` varchar(255) DEFAULT NULL,
 `degree` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `teacher` VALUES ('1', '王晶', '0', 'CHINESE', '大专');
INSERT INTO `teacher` VALUES ('2', '冯小刚', '0', 'ENGLISH', '本科');
INSERT INTO `teacher` VALUES ('3', '吴京', '0', 'MATHEMATICS', '大专');
INSERT INTO `teacher` VALUES ('4', '王倦', '1', 'MATHEMATICS', '研究生');
DROP TABLE IF EXISTS `stu_teach_rel`;
CREATE TABLE `stu_teach_rel` (
 `id` int(11) NOT NULL,
 `stu_id` int(11) NOT NULL,
 `teach_id` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `stu_teach_rel` VALUES ('1', '1', '1');
INSERT INTO `stu_teach_rel` VALUES ('2', '2', '1');
INSERT INTO `stu_teach_rel` VALUES ('3', '1', '2');
INSERT INTO `stu_teach_rel` VALUES ('4', '2', '2');
INSERT INTO `stu_teach_rel` VALUES ('5', '2', '3');
INSERT INTO `stu_teach_rel` VALUES ('6', '3', '1');
INSERT INTO `stu_teach_rel` VALUES ('7', '3', '2');
INSERT INTO `stu_teach_rel` VALUES ('8', '1', '3');
INSERT INTO `stu_teach_rel` VALUES ('9', '4', '1');
INSERT INTO `stu_teach_rel` VALUES ('10', '4', '2');
INSERT INTO `stu_teach_rel` VALUES ('11', '5', '3');
INSERT INTO `stu_teach_rel` VALUES ('12', '5', '4');
INSERT INTO `stu_teach_rel` VALUES ('13', '6', '1');
INSERT INTO `stu_teach_rel` VALUES ('14', '6', '3');

二、新建和表相关的实体类

package com.yihaomen.mybatis.model;
import com.yihaomen.mybatis.enums.Gender;
import java.util.List;

public class Student {
 private String id;
 private String name;
 private int age;
 private Gender gender;
 private List<Teacher> teachers;

 setters&getters
 
}
package com.yihaomen.mybatis.model;
import com.yihaomen.mybatis.enums.Gender;
import com.yihaomen.mybatis.enums.Subject;
import java.util.List;

public class Teacher {
 private int id;
 private String name;
 private Gender gender;
 private Subject subject;
 private String degree;
 private List<Student> students;

 setters&getters
}

三、新建映射关系

package com.yihaomen.mybatis.dao;
import com.yihaomen.mybatis.model.Student;
import org.springframework.stereotype.Repository;
import java.util.List;

@Repository
public interface StudentMapper {
 List<Student> selectStudents();
}

student.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yihaomen.mybatis.dao.StudentMapper">
 <resultMap id="studentMap" type="Student">
  <id property="id" column="id" />
  <result property="name" column="name" />
  <result property="age" column="age" />
  <result property="gender" column="gender" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler" />
 </resultMap>
 <resultMap id="collectionMap" type="Student" extends="studentMap">
  <collection property="teachers" ofType="Teacher">
   <id property="id" column="teach_id" />
   <result property="name" column="tname"/>
   <result property="gender" column="tgender" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
   <result property="subject" column="tsubject" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
   <result property="degree" column="tdegree" javaType="string" jdbcType="VARCHAR"/>
  </collection>
 </resultMap>
 <select id="selectStudents" resultMap="collectionMap">
  SELECT
   s.id, s.name, s.gender, t.id teach_id, t.name tname, t.gender tgender, t.subject tsubject, t.degree tdegree
  FROM
   student s
  LEFT JOIN
   stu_teach_rel str
  ON
   s.id = str.stu_id
  LEFT JOIN
   teacher t
  ON
   t.id = str.teach_id
 </select>
</mapper>

四、在configuration.xml中配置相关mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
 <properties resource="jdbc.properties"/>
 <typeAliases>
  <typeAlias alias="Student" type="com.yihaomen.mybatis.model.Student" />
  <typeAlias alias="Teacher" type="com.yihaomen.mybatis.model.Teacher" />
 </typeAliases>

 <environments default="development">
  <environment id="development">
   <transactionManager type="JDBC"/>
   <dataSource type="POOLED">
    <property name="driver" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
   </dataSource>
  </environment>
 </environments>

 <mappers>
  <mapper resource="com/yihaomen/mybatis/model/Student.xml"/>
 </mappers>
</configuration>

五、测试

package com.yihaomen.service.student;
import com.yihaomen.mybatis.dao.StudentMapper;
import com.yihaomen.mybatis.model.Student;
import com.yihaomen.mybatis.model.Teacher;
import com.yihaomen.service.BaseTest;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import java.util.List;

public class TestStudent extends BaseTest {
 public static void testStuTeachRela() {
  SqlSessionFactory sqlSessionFactory = getSession();
  SqlSession session = sqlSessionFactory.openSession();
  StudentMapper mapper = session.getMapper(StudentMapper.class);
  List<Student> list = mapper.selectStudents();

  for(Student s : list) {
   System.out.println("------------------");
   System.out.println(s.getName() + "," + s.getAge() + "," + s.getGender());
   for(Teacher t : s.getTeachers()) {
    System.out.println(t.getName() + "," + t.getGender() + "," + t.getSubject());
   }
  }
 }

 public static void main(String[] args) {
  testStuTeachRela();
 }
}

以上这篇mybatis多对多关联实战教程(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Java concurrency之锁_动力节点Java学院整理

这篇文章主要为大家详细介绍了Java concurrency之锁的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java8新特性之StampedLock_动力节点Java学院整理

本文从synchronized、Lock到Java8新增的StampedLock进行对比分析,对Java8新特性之StampedLock相关知识感兴趣的朋友一起看看吧
收藏 0 赞 0 分享

Java8新特性之lambda的作用_动力节点Java学院整理

我们期待了很久lambda为java带来闭包的概念,但是如果我们不在集合中使用它的话,就损失了很大价值。现有接口迁移成为lambda风格的问题已经通过default methods解决了,在这篇文章将深入解析Java集合里面的批量数据操作解开lambda最强作用的神秘面纱。
收藏 0 赞 0 分享

Java8新特性之Base64详解_动力节点Java学院整理

这篇文章主要为大家详细介绍了Java8新特性之Base64的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java8新特性之JavaFX 8_动力节点Java学院整理

这篇文章主要介绍了Java8新特性之JavaFX 8的相关知识,非常不错,具有参考借鉴价值,需要的朋友参考下吧
收藏 0 赞 0 分享

将本地jar包安装进入maven仓库(实现方法)

下面小编就为大家带来一篇将本地jar包安装进入maven仓库(实现方法)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

浅谈Java finally语句到底是在return之前还是之后执行(必看篇)

下面小编就为大家带来一篇浅谈Java finally语句到底是在return之前还是之后执行(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

基于Java并发容器ConcurrentHashMap#put方法解析

下面小编就为大家带来一篇基于Java并发容器ConcurrentHashMap#put方法解析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

详解Spring Boot Profiles 配置和使用

本篇文章主要介绍了详解Spring Boot Profiles 配置和使用,具有一定的参考价值,有兴趣的可以了解一下
收藏 0 赞 0 分享

详解Spring Boot 属性配置和使用

本篇文章主要介绍了详解Spring Boot 属性配置和使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享
查看更多