mysql 多对多映射_SQL映射文件-----MySQL关系映射【1对1,1对多,多对多】

SSM框架下,mapper.xml 中 association 标签和 collection标签的使用

当数据库中表与表之间有关联时,在对数据库进行操作时,就不只是针对某一张表了,需要联表查询

MyBatis中如何实现联表查询

1、首先新建两张表

学生表(student)

ID:stu_id

姓名:stu_name

年龄:stu_age

性别:stu_gender

所在班级:g_id

班级表(grade)

ID:g_id

班级名称:g_name

学生表和班级表通过 g_id进行关联,一个班级对应多个学生

626f3bbc613338669f3ca75221584f3a.png

2、创建相应的实体类和mapper接口

(1)创建 Student类和 Grade 类(包名:com.bwlu.bean)

51cfc4c1f40d347b1faf1845f8efd4fc.png

5fdc11406bf94eebaf8cddb7dc39c6b0.png

(2)创建 StudentMapper 接口和 GradeMapper 接口和相应的 XML 文件(使用逆向生成可直接生成)

StudentMapper.java 接口

Student selectByPrimaryKey(Integer stuId);//按主键查询一条记录

StudentMapper.xml

select stu_id, stu_name, stu_age, stu_gender, g_id from student

where stu_id = #{stuId,jdbcType=INTEGER}

GradeMapper.java

Grade selectByPrimaryKey(Integer gId);//按主键查询一条记录

GradeMapper.xml

select g_id, g_name from grade

where g_id = #{gId,jdbcType=INTEGER}

3、在sql映射文件中写映射sql语句【联合查询:级联属性封装结果集】

3.1第一种

(1)在 Student.java 中将 g_id 属性换成班级类型(Grade),并添加相应的getter和setter方法

//private Integer g_id;

privateGrade grade;publicGrade getGrade() {returngrade;

}public voidsetGrade(Grade grade) {this.grade =grade;

}

(2)在 xml 中封装结果集,并编写相应的 sql 语句

select stu_id, stu_name, stu_age, stu_gender, g.g_id, g_name

from student s,grade g

where s.g_id = g.g_id AND stu_id = #{stuId,jdbcType=INTEGER}

(3)测试

@AutowiredprivateStudentMapper studentMapper;

@Testpublic voidtestAssociation() {

Student student= studentMapper.selectByPrimaryKey(6);

System.out.println(student);//Student [stuId=6, stuName=lixiang, stuAge=22, stuGender=1, grade=Grade [gId=3, gName=软件(3)班]]

}

3.2第二种

(1)在 Student.java 中将 g_id 属性换成班级类型(Grade),并添加相应的getter和setter方法,同 3.1 的(1)

(2)使用association来定义关联对象的规则【比较正规的,推荐的方式】

select stu_id, stu_name, stu_age, stu_gender, g.g_id, g_name

from student s,grade g

where s.g_id = g.g_id AND stu_id = #{stuId,jdbcType=INTEGER}

(3)测试(同 3.1的(3),结果也一样)

3.3第三种

(1)在 Student.java 中将 g_id 属性换成班级类型(Grade),并添加相应的getter和setter方法,同 3.1 的(1)

(2)使用Association进行分步查询【上述结果相当于使用嵌套结果集的形式】

select g_id, g_name from grade

where g_id = #{gId,jdbcType=INTEGER}

select stu_id, stu_name, stu_age, stu_gender, g_id

from student

where stu_id = #{stuId,jdbcType=INTEGER}

注:使用 resultType 返回值类型进行接收,必须使用驼峰式命名,使数据库中的字段和实体类中的字段对应。

(3)测试(同 3.1的(3),结果也一样)

(2)中也可以指定为GradeMapper 下的方法。

懒加载机制【按需加载,也叫懒加载】

在 3.3 分步查询中,每次查询 Student对象的时候,都将关联 Grade 的对象查询出来了。

使用延迟加载,可以在需要 班级 信息的时候,再去查询,不需要的时候就不用查询。

在 MyBatis 的全局配置文件中,加入两个配置

这样,当我们查询 Student对象的时候,如果只输出学生姓名,就不会执行查询班级信息的 sql 语句,当需要班级信息的时候才会执行。

上述是在多端(学生)查询一端(班级)的信息,用 association,当我们在一端查询多端信息的时候,需要使用 collection,查出的是一个集合

未完

原文:http://www.cnblogs.com/lixiang1993/p/7482192.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值