mybatis--多对多关联

mybatis3.0 添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作。因此在进行实体类多对多映射表设计时,需要专门建立一个关联对象类对相关实体类的关联关系进行描述。

(1)首先创建数据库manytomany,并在数据库下创建三个表t_classes、t_classteacher、t_teacher
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
create database manytomany;
 
 
use manytomany;
 
 
CREATE TABLE `t_classes` (
  `cid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `cname` varchar(64) NOT NULL DEFAULT '',
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
Insert into t_classes(cid,cname) values(1,'大一');
Insert into t_classes(cid,cname) values(2,'大二');
Insert into t_classes(cid,cname) values(3,'大三');
 
CREATE TABLE `t_teacher` (
  `tid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `tname` varchar(64) NOT NULL DEFAULT '',
  PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
Insert into t_teacher(tid,tname) values(1,'王老师');
Insert into t_teacher(tid,tname) values(2,'李老师');
Insert into t_teacher(tid,tname) values(3,'张老师');
 
CREATE TABLE `t_classTeacher` (
 `id` int(10) unsigned Not NULL AUTO_INCREMENT,
  `cid` int(10) unsigned NOT NULL,
  `tid` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
insert into t_classTeacher values(1,1,1);
insert into t_classTeacher values(2,2,1);
insert into t_classTeacher values(3,1,3);
insert into t_classTeacher values(4,2,3);

 

(2)创建mybatis_007项目,项目结构如下:

(3)配置两个实体类Classes.java、Teacher.java

     Classes.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package mybatis.model;
 
import java.util.List;
 
public class Classes {
    private Integer cid;
    private String cname;
    private List<Teacher> teachers;
    public Integer getCid() {
        return cid;
    }
    public void setCid(Integer cid) {
        this.cid = cid;
    }
    public String getCname() {
        return cname;
    }
    public void setCname(String cname) {
        this.cname = cname;
    }
    public List<Teacher> getTeachers() {
        return teachers;
    }
    public void setTeachers(List<Teacher> teachers) {
        this.teachers = teachers;
    }
    @Override
    public String toString() {
        return "Classes [cid=" + cid + ", cname=" + cname + ", teachers=" + teachers + "]";
    }
}

 Teacher.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package mybatis.model;
 
import java.util.List;
 
import javax.security.auth.Subject;
 
public class Teacher {
    private Integer tid;
    private String tname;
    private List<Classes> classes;
    public Integer getTid() {
        return tid;
    }
    public void setTid(Integer tid) {
        this.tid = tid;
    }
    public String getTname() {
        return tname;
    }
    public void setTname(String tname) {
        this.tname = tname;
    }
    public List<Classes> getClasses() {
        return classes;
    }
    public void setClasses(List<Classes> classes) {
        this.classes = classes;
    }
    @Override
    public String toString() {
        return "Teacher [tid=" + tid + ", tname=" + tname + "]";
    }
}

(4)配置数据库连接文件config/config.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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>
 <typeAliases>
  <typeAlias alias="Classes" type="mybatis.model.Classes" />
  <typeAlias alias="Teacher" type="mybatis.model.Teacher" />
 </typeAliases>
  
<environments default="development">
        <environment id="development">
        <transactionManager type="JDBC" />
        <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/manytomany"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
        </dataSource>
        </environment>
</environments>
  
 <mappers>
  <mapper resource="mybatis/model/ClassMapper.xml"/>
 </mappers>
</configuration>

(5)配置ClassMapper.xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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.mapper.ClassesMapper">
    <!-- 自定义结果映射 -->
    <resultMap type="mybatis.model.Classes" id="ClassesWithTeacherResult">
        <id property="cid" column="cid"/>
        <result property="cname" column="cname"/>
        <!-- 多表关联映射 -->
        <collection property="teachers" ofType="mybatis.model.Teacher">
            <id property="tid" column="tid"/>
            <result property="tname" column="tname"/>
        </collection>
    </resultMap>
    <select id="findClassesWithTeacher" parameterType="Integer" resultMap="ClassesWithTeacherResult">
        select * from t_classes c,t_teacher t,t_classteacher ct
        where ct.cid=c.cid
        and ct.tid=t.tid
        and c.cid=#{cid}
    </select>
</mapper>

 (6)最后执行Main

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package Main;
 
 
import java.io.Reader;
 
import mybatis.model.Classes;
 
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
 
 
public class Main {
    private static SqlSessionFactory sqlSessionFactory;
    private static Reader reader;
 
    static {
        try {
            reader = Resources.getResourceAsReader("config/config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    public static SqlSessionFactory getSession() {
        return sqlSessionFactory;
    }
    @Test
    public void findClassesWithTeacher() {
        SqlSession session = sqlSessionFactory.openSession();
        for(int i=1;i<=2;i++){
        Classes classess=session.selectOne("com.mapper.ClassesMapper.findClassesWithTeacher", i);
        System.out.println(classess);
        }
    }
}

  程序结果如下:

 

  

 

posted @   leagueandlegends  阅读(1061)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示