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 进行关联,一个班级对应多个学生

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

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

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

StudentMapper.java 接口

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

StudentMapper.xml

<mapper namespace="com.bwlu.mapper.StudentMapper" >
  <resultMap id="BaseResultMap" type="com.bwlu.bean.Student" >
    <id column="stu_id" property="stuId" jdbcType="INTEGER" />
    <result column="stu_name" property="stuName" jdbcType="VARCHAR" />
    <result column="stu_age" property="stuAge" jdbcType="INTEGER" />
    <result column="stu_gender" property="stuGender" jdbcType="INTEGER" />
    <result column="g_id" property="gId" jdbcType="INTEGER" />
  </resultMap>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select stu_id, stu_name, stu_age, stu_gender, g_id from student
    where stu_id = #{stuId,jdbcType=INTEGER}
  </select>
</mapper>

GradeMapper.java

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

 GradeMapper.xml

<mapper namespace="com.bwlu.mapper.GradeMapper" >
  <resultMap id="BaseResultMap" type="com.bwlu.bean.Grade" >
    <id column="g_id" property="gId" jdbcType="INTEGER" />
    <result column="g_name" property="gName" jdbcType="VARCHAR" />
  </resultMap>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select g_id, g_name from grade
    where g_id = #{gId,jdbcType=INTEGER}
  </select>
</mapper>

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

3.1第一种

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

//private Integer g_id;
private Grade grade;
public Grade getGrade() {
    return grade;
}
public void setGrade(Grade grade) {
    this.grade = grade;
}

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

<resultMap id="BaseResultMap" type="com.bwlu.bean.Student" >
  <id column="stu_id" property="stuId" jdbcType="INTEGER" />
  <result column="stu_name" property="stuName" jdbcType="VARCHAR" />
  <result column="stu_age" property="stuAge" jdbcType="INTEGER" />
  <result column="stu_gender" property="stuGender" jdbcType="INTEGER" />
  <result column="g_id" property="grade.gId" jdbcType="INTEGER" />
  <result column="g_name" property="grade.gName" jdbcType="VARCHAR" />
</resultMap>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
  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}
</select>

(3)测试

@Autowired
private StudentMapper studentMapper;
@Test
public void testAssociation() {
    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来定义关联对象的规则【比较正规的,推荐的方式】

<resultMap id="BaseResultMap" type="com.bwlu.bean.Student" >
  <id column="stu_id" property="stuId" jdbcType="INTEGER" />
  <result column="stu_name" property="stuName" jdbcType="VARCHAR" />
  <result column="stu_age" property="stuAge" jdbcType="INTEGER" />
  <result column="stu_gender" property="stuGender" jdbcType="INTEGER" />
  <!-- association可以指定联合的javaBean对象
    property="grade":指定哪个属性是联合的对象
    javaType:指定这个属性对象的类型【不能省略】-->
  <association property="grade" javaType="com.bwlu.bean.Grade">
      <id column="g_id" property="gId" jdbcType="INTEGER"/>
      <result column="g_name" property="gName" jdbcType="VARCHAR"/>
  </association>
</resultMap>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
  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}
</select>

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

3.3第三种

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

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

<resultMap id="BaseResultMap" type="com.bwlu.bean.Student" >
  <id column="stu_id" property="stuId" jdbcType="INTEGER" />
  <result column="stu_name" property="stuName" jdbcType="VARCHAR" />
  <result column="stu_age" property="stuAge" jdbcType="INTEGER" />
  <result column="stu_gender" property="stuGender" jdbcType="INTEGER" />
  <!-- 使用association进行分步查询
     1.先按照学生id查询学生信息
     2.根据查询学生信息中g_id值去班级表查出班级信息
     3.将班级信息设置到学生中:
    association定义关联对象的封装规则
    select:表明当前属性是调用指定的方法查出的结果
    column:指定将哪一列的值传给这个方法
    流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性。-->
  <association property="grade" select="getGradeById" column="g_id"></association>
</resultMap>
<select id="getGradeById"resultType="com.bwlu.bean.Grade" parameterType="java.lang.Integer" >
  select g_id, g_name from grade
  where g_id = #{gId,jdbcType=INTEGER}
</select>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
  select stu_id, stu_name, stu_age, stu_gender, g_id
  from student
  where stu_id = #{stuId,jdbcType=INTEGER}
</select>

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

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

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

<association property="grade" select="com.bwlu.mapper.GradeMapper.selectByPrimaryKey" column="g_id"></association>

懒加载机制【按需加载,也叫懒加载】
3.3 分步查询中,每次查询 Student 对象的时候,都将关联 Grade 的对象查询出来了。

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

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

<settings>
    <!-- 驼峰式命名 -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
    <!-- 开启懒加载机制 ,默认值为true-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 开启的话,每个属性都会直接全部加载出来;禁用的话,只会按需加载出来 -->
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

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

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

未完

时间: 2024-10-10 00:41:45

SQL映射文件-----MySQL关系映射【1对1,1对多,多对多】的相关文章

mybaties中mapper.xml映射文件中输出映射resultMap与resultType的不同

在mybaties框架思想中可以知道.mybaties在mapper.xml中定义statement,使用resultType(还有resultMap)指定输出数据的类型,将select查询结果集映射为resultType指定的类型, resultType使用注意:select查询出来 列名要和resultType指定的类型属性名对应.(实现开发中常用的是resultType) resultMap:select查询出来 列名不需要和输出类型的属性名对应也可以完成映射.

hibernate 对象关系映射文件详解

POJO 类和数据库的映射文件*.hbm.xml POJO类和关系数据库之间的映射可以用一个XML文档来定义. 映射文件的扩展名为.hbm.xml 在运行时Hibernate将根据这个映射文件来生成各种SQL语句 通过POJO类的数据库映射文件,Hibernate可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据库表列之间的对应关系 映射文件说明 hibernate-mapping 类层次:class 主键:id 基本类型:property 实体引用类: many-to-one

mybatis 中 sql 映射文件 select 标签以及 入 resultMap 标签的应用

1.自定义某个 javabean 的封装规则: 注:可以看到,select 标签中引用了 定义好的 resultMap 的值.resultMap 标签中的 type 为javabean 类型,id 为唯一标识.id 子标签定义主键(这样定义底层会有优化.)column 属性为字段名,property 属性为字段值. 注:可以看到测试结果没有出现问题,说明代码没有错误. 2.自定义某个 javabean 的级联属性封装: a.准备工作:mysql 数据库中,在之前 tbl_employees 表的

MyBatis的SQL映射文件

1.使用MyBatis实现条件查询 (1)sql映射文件 mapper:映射文件的根元素节点,只有一个属性namespace,其作用如下: <1>用于区分不同的mapper,全局唯一 <2>绑定DAO接口,即面向接口编程.当namespace绑定某一接口之后,可以不用写该接口的实现类,MyBatis会通过接口的完整限定名查找到对应的mapper配置来执行SQL语句.因此namespace的命名必须要跟接口同名. cache:配置给定命名空间的缓存 cache-ref:从其他命名空间

Mybatis的配置文件和映射文件详解

一.Mybatis的全局配置文件 1.SqlMapConfig.xml是mybatis的全局配置文件,配置内容如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) environments(环境集合属性对象) --environment(环境子属性对象) ----transactionManager(事务管理) ----dataSource

Hibernate配置文件与映射文件详解

Hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 我们先看一下官方文档所给出的,Hibernate 体系结构的高层视图: 其中PO=POJO+映射文件 根据体系结构视图可以了解到整个利用Hibernate框架实现的项目包括整个重要的配置文件: Hibernate配置文件:实现Hibernate基础配置,是Hibernate能够友好的与DB进行交互基础: 开发时放置src目录下,取名为:hibernate.cfg.xml(hiber

8、Hibernate框架(ORM详解、主文件配置、映射文件配置)

开发回顾: SSH框架: Struts框架, 基于mvc模式的应用层框架技术! Hibernate, 基于持久层的框架(数据访问层使用)! Spring, 创建对象处理对象的依赖关系以及框架整合! Dao代码,如何编写? - 操作XML数据 - 使用Jdbc技术 原始的jdbc操作, Connection/Statement/ResultSet 自定义一个持久层框架, 封装了dao的通用方法 DbUtils组件, 轻量级的dao的组件: Hibernate技术 [hibernate最终执行的也是

hibernate 映射文件的学习

hibernate中有两种主要的配置文件,一种是主配置文件,还有一种就是映射文件,映射文件需要注意的是以下几个方面来学习: 参考文档:http://download.csdn.net/download/u011249702/9487540 1.映射基础 2.普通属性 3.主键 4.联合属性 5.关联关系 6.继承结构 在配置hibernate的时候要注意以下几点,这个有的必须有的是非必须的,在使用中要明确和注意 对持久化对象的要求: ①必须体提供一个无参的构造函数,当使用了有参数的构造器的时候,

170905-MyBatis中的关系映射

===关系映射=== 参考文档复习:1对1,1对多,多对多 1.映射(多)对一.(一)对一的关联关系 1).使用列的别名 ①.若不关联数据表,则可以得到关联对象的id属性 ②.若还希望得到关联对象的其它属性.则必须关联其它的数据表 1.创建表: 员工表: DROP TABLE IF EXISTS `tbl_employee`; CREATE TABLE `tbl_employee` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_name` varch