【二】MyBatis的SQL映射文件 ----- 一对一的关联查询

现在假设数据库中有两张表,一张是班级表,另一张是教师表。一个班级只有一名班主任老师,而一个老师只能担任一个班的班主任,这就是我们所说的一对一关联关系。现在要求,查询班级表的同时也要查询出老师的信息。两张表的数据如下所示:

教师表:

班级表:

创建表的SQL语句如下(MySQL数据库):

CREATE TABLE teacher(
    t_id INT PRIMARY KEY AUTO_INCREMENT,
    t_name VARCHAR(20)
);
CREATE TABLE class(
    c_id INT PRIMARY KEY AUTO_INCREMENT,
    c_name VARCHAR(20),
    teacher_id INT
);
ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id);    

INSERT INTO teacher(t_name) VALUES(‘LS1‘);
INSERT INTO teacher(t_name) VALUES(‘LS2‘);

INSERT INTO class(c_name, teacher_id) VALUES(‘bj_a‘, 1);
INSERT INTO class(c_name, teacher_id) VALUES(‘bj_b‘, 2);

如何实现SQL的映射文件呢?有两种方法:(1). 嵌套结果,实际上就是多表联合查询。 (2).嵌套查询,实际上就是多次查询。

一、嵌套结果

<?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="day02.bean.classMapper">
    <select id="getClass" parameterType="int" resultMap="classMap">
        SELECT *
        FROM class c JOIN teacher t ON c.teacher_id = t.t_id WHERE t.t_id =
        #{id}
    </select>

    <resultMap type="Class" id="classMap">
        <id property="id" column="c_id" />
        <result property="name" column="c_name" />
        <!-- javaType:表示关联的类的全限定名 -->
        <association property="teacher" javaType="Teacher" resultMap="teacherMap">
            <!-- 可以用这种方法解决实体类属性和数据库表字段名不一致而导致的冲突问题,
                     也可以用resultMap
            <id property="id" column="t_id" />
            <result property="name" column="t_name" />
            -->
        </association>
    </resultMap>

    <resultMap type="Teacher" id="teacherMap">
        <id property="id" column="t_id" />
        <result property="name" column="t_name" />
    </resultMap>
</mapper>

二、嵌套查询,其实质就是多次查询,我们查询班级信息的同时也要查询到教师的信息,所以可以查询两次。第一次先查询班级表,即:

SELECT * FROM class WHERE c_id = 1;

得到的结果是:,我们得到了 teacher_id 这个字段的数据,然后用这个字段的值去查询教师表,即:

SELECT * FROM teacher WHERE t_id = 1;

就可以得到教师的全部信息,那么如何在SQL的映射文件中配置呢?

<?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="day02.bean.classMapper">
    <!-- 查询班级表 -->
    <select id="getClass2" parameterType="int" resultMap="classMap2">
        select *
        from class where c_id = #{id}
    </select>

    <!-- 查询教师表 -->
    <select id="getTeacher" parameterType="int" resultType="Teacher" resultMap="teacherMap" >
        select *
        from teacher where t_id = #{id}
    </select>

    <resultMap type="Class" id="classMap2">
        <id property="id" column="c_id" />
        <result property="name" column="c_name" />
        <!-- 关联教师表,select:指向关联表查询语句的id属性值
             column:这个属性很重要,它的值是班级表的外键
             javaType:映射的实体类的类型
         -->
        <association property="teacher" select="getTeacher"
            column="teacher_id" javaType="Teacher"/>
    </resultMap>

    <resultMap type="Teacher" id="teacherMap">
        <id property="id" column="t_id" />
        <result property="name" column="t_name" />
    </resultMap>
</mapper>

三、MyBatis的配置文件

<?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="config.properties"></properties>

    <!-- 类型别名,避免类我们在配置SQL映射文件时,对于用的属性值每次都要写类的全限定名 -->
    <typeAliases>
        <package name="day02.bean"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="day02/bean/classMapper.xml"/>
    </mappers>
</configuration>

测试的过程大家可以自己去测试即可,注意:这里连接数据的资源文件没有给出,自己要补上,即:config.properties 文件。

时间: 2024-11-08 23:46:20

【二】MyBatis的SQL映射文件 ----- 一对一的关联查询的相关文章

【三】MyBatis的SQL映射文件 ----- 一对多的关联查询

一对多关联查询的解决方案也有两种:嵌套结果和嵌套查询 在上一篇博客中已经讲了一对一的关联查询,在MySQL数据库中已经存在了班级表 class 和教师表 teacher.为了满足一对多关联查询的要求,还需要创建一张学生表 student.这样,在查询班级信息的同时,可以得到教师和学生的信息. 创建 student 表的 SQL 语句如下: CREATE TABLE student( s_id INT PRIMARY KEY AUTO_INCREMENT, s_name VARCHAR(20),

MyBatis的SQL映射文件

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

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

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

MyBatis之sql映射文件

MyBatis的强大之处就在于它的sql映射文件,下面介绍sql映射文件的几个顶级元素配置 1)mapper:映射文件的根元素节点,只有一个namespace(命名空间) * 用于区分不同的mapper,全局唯一 * 绑定dao接口,即面向接口编程, 当,namespace绑定某一接口之后,可以不用写该接口的实现类,MyBatis会通过接口的完整的限定名查找到对应的mapper配置来执行sql语句,应此namespace的命名必须要跟接口同名. 2)cache:配置给定的命名空间的缓存 3)ca

mybatis 的 sql 映射文件增删改查的学习

在 sql 映射文件中配置增删改查的操作:     1.增: 在 sql 映射文件中添加 insert 标签,并且增加对应的 sql 语句.(在之前博文示例的基础上添加)在 对应的接口中添加 对应的方法,方法名与 sql 映射文件中 insert 标签中的 id 属性值一致. 注:可以看到,在测试方法 test03 中更新成功.但是在 openSession 对象需要手动提交事务.(sqlSessionFactory.openSession 方法的得到的 openSession 对象,使用 sq

传参在mybatis的sql映射文件中正确获取

1.单个参数: 非自定义对象 传参:getStuById(Integer id): 取值:#{id} 单个基本类型参数,随便取值都行:#{ok} 对象: 传参:saveStudent(Student student) 取值:#{属性名} 2.多个参数: 传参:getStudentByLastNameAndAge(String lastName,Integer age) 取值:#{参数名}不好使:报错提示可用的参数是[0,1,param1,param2] 可用的取值方式: 1)#{参数索引} #{

Mybatis 的基本要素—SQL 映射文件

MyBatis 真正的强大在于映射语句,相对于它强大的功能,SQL 映射文件的配置却是相当简单.对比 SQL 映射配置和 JDBC 代码,发现使用 SQL 映射文件配置可减少 50% 以上的代码,并且MyBatis 专注于SQL,对于开发人员来说,也可极大限度地进行 SQL 调优,以保证性能. SQL 映射文件的几个顶级元素(按照定义的顺序) ? mapper:映射文件的根元素节点,只有一个属性 namespace(命名空间) . namespace 作用如下 1.用于区别不同的 mapper,

Mybatis二 SQL映射文件

SQL映射文件 单条件查询 1. 在ISmbmsUserDao接口添加抽象方法 //根据用户名模糊查询 List<SmbmsUser> getUserListByName(); 2. 在UserMapper.xml里添加SQL <!--根据用户名模糊查询--> <select id="getUserListByName" resultType="SmbmsUser" parameterType="String">

MyBatis -- sql映射文件详解

MyBatis 真正的力量是在映射语句中.和对等功能的jdbc来比价,映射文件节省很多的代码量.MyBatis的构建就是聚焦于sql的. sql映射文件有如下几个顶级元素:(按顺序) cache配置给定命名空间的缓存. cache-ref从其他命名空间引用缓存配置. resultMap最复杂,也是最有力量的元素,用来描述如何从数据库结果集中来加载你的对象. parameterMap已经被废弃了!老式风格的参数映射.内联参数是首选,这个元素可能在将来被移除. sql可以重用的SQL块,也可以被其他