Mybatis框架----->(7) 使用xml文件进行多对一和一对多查询

一、使用xml文件进行多对一和一对多查询

1、多对一查询
(1)创建两张数据表

在这里插入图片描述

(2)创建实体类对象
@Data
public class Student {
    private int id;
    private String name;

    //学生类关联老师类
    private Teacher teacher;
}
@Data
public class Teacher {
    private int id;
    private String name;
}
(3)创建学生接口类对象和学生的Mapper映射文件
public interface StudentDao {

    //查询所有学生的信息以及对应老师的信息
    List<Student> selectAllStudent();
    List<Student> selectAllStudent2();
}
<?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.hcz.dao.StudentDao">

    <!--=========================方式1:(联表查询)按结果嵌套处理=============================-->
    <select id="selectAllStudent" resultMap="StudentTeacher">
        select s.id as sid,s.name as sname,t.name as tname
        from student s,teacher t
        where s.tid=t.id;
    </select>
    <resultMap id="StudentTeacher" type="Student">
        <id property="id" column="sid"/>
        <result property="name" column="sname"/>
        <!--复杂的属性,我们需要单独处理
                对象:association
                集合:collection
        -->
        <association property="teacher" javaType="Teacher" >
            <result property="name" column="tname"/>
        </association>
    </resultMap>

    <!--=========================方式2:(子查询)按查询嵌套处理=============================-->
    <!--
        1、查询所有的学生信息
        2、根据查询出来的学生tid,寻找对应的老师
    -->
    <select id="selectAllStudent2" resultMap="StudentTeacher2">
        select * from student
    </select>
    <resultMap id="StudentTeacher2" type="Student">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <!--复杂的属性,我们需要单独处理
                对象:association 【多对一】
                集合:collection 【一对多】
                javaType:用来指定实体类中属性的类型
                ofType:用来指定映射到List或者集合中的pojo类型,泛型中的约束类型
        -->
        <association property="teacher" column="tid" javaType="Teacher" select="selectAllTeacher"/>
    </resultMap>

    <select id="selectAllTeacher" resultType="Teacher">
        select * from teacher where id=#{id}
    </select>
</mapper>
(4)创建mybatis的配置文件mybatis-config.xml
<?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>

    <!--1、指定properties文件的位置,从类路径根(/resource)开始找文件-->
    <properties resource="jdbc.properties"/>

    <!--2、mybatis.xml 文件加入日志配置,可以在控制台输出执行的 sql 语句和参数
            - SLF4J
            - LOG4J【掌握】1、先导包
            - JDK_LOGGING
            - COMMONS_LOGGING
            - STDOUT_LOGGING【掌握】:标准日志输出
            - NO_LOGGING
     -->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>

    <!--3、定义别名-->
    <typeAliases>
        <!--第一种方式;
            type:自定义类型的全限名称
            alias:别名(短小,容易记忆)
        -->
        <!--<typeAlias type="com.Student" alias="stu"></typeAlias>
        <typeAlias type="com.com.vo.ViewStudent" alias="vstu"></typeAlias>-->

        <!--第二种方式:
            <package> name是包名,这个包中的所有类,【类名】就是别名
        -->
        <!--第三种方式:
            使用注解
        -->
        <package name="com.hcz.pojo"/>
    </typeAliases>

    <!--4、配置mybatis环境:数据库的连接信息-->
    <environments default="mysql">
        <!--id:数据源的名称-->
        <environment id="mysql">
            <!--配置事务类型:使用jdbc事务(使用Connection的提交和回滚)-->
            <transactionManager type="JDBC"/>
            <!--数据源dataSource:创建数据库Connection对象的commit,rollback做事务处理
                type:POOLED使用数据库的连接池
            -->
            <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>

    <!--5、映射器:sql映射文件的位置-->
    <mappers>
        <!--告诉mybatis要执行的sql语句的位置-->
        <mapper class="com.hcz.dao.UserDao"/>
        <mapper class="com.hcz.dao.StudentDao"/>
        <mapper class="com.hcz.dao.TeacherDao"/>
    </mappers>
</configuration>
(5)创建工具类MyBatisUtil.java
/**
 * 获取SqlSession对象的工具类
 */
public class MyBatisUtil {

    //一旦创建就应该在运行区间一直存在,没有任何理由丢弃它或者重建例外一个实例
    //最简单的就是使用单例模式或者静态单例模式
    private static SqlSessionFactory factory = null;
    static {
        try {
            String config="mybatis-config.xml";
            //读取配置文件
            InputStream in = Resources.getResourceAsStream(config);
            //创建SqlSessionFactory对象,一旦创建了,就不再需要它了(局部变量)
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder= new SqlSessionFactoryBuilder();
               factory =     sqlSessionFactoryBuilder.build(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取SqlSession对象
     * 它不是线程安全的,因此不能共享,用完需要关闭,否则资源被占用
     */
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = null;
        if (factory != null){
            sqlSession = factory.openSession(true);
        }
        return sqlSession;
    }
}
(6)在pom.xml文件中添加依赖
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.1</version>
        <scope>test</scope>
    </dependency>

    <!--加入mybatis依赖-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.1</version>
    </dependency>

    <!--mysql驱动-->
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.48</version>
    </dependency>
    <!--Lombok插件-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.2</version>
    </dependency>
    <!-- log4j依赖 -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

</dependencies>

<!--将properties,xml文件拷到/target/classes目录下-->
<build>
    <resources>
        <resource>
            <directory>src/main/java</directory><!--所在的目录-->
            <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory><!--所在的目录-->
            <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>
(7)创建测试类方法
@Test
public void test(){
    //1、获取SqlSession对象,一旦创建了,就不再需要它了(局部变量)
    SqlSession sqlSession = MyBatisUtil.getSqlSession();

    logger.info("====进入测试方法====");

    //2、执行SQL语句
    StudentDao mapper = sqlSession.getMapper(StudentDao.class);
    //List<User> userList = mapper.getUserList();
    //调用方式2方法查询
    List<Student> studentList = mapper.selectAllStudent2();

    //userList.forEach(list-> System.out.println(list));
    for (Student student:studentList){
        System.out.println(student);
    }
    sqlSession.close();
}
(8)运行结果

在这里插入图片描述

2、一对多查询
(1)创建实体类对象
@Data
public class Teacher {
    private int id;
    private String name;

    //一个老师拥有多个学生
    private List<Student> students;
}
@Data
public class Student {
    private int id;
    private String name;
    private int tid;
}
(2)创建老师接口类对象和老师的Mapper映射文件
public interface TeacherDao {

    //获取指定老师下的所有学生以及老师的信息
    List<Teacher> selectAllTeacher(@Param("tid") int id);
    List<Teacher> selectAllTeacher2(@Param("tid") int id);
}
<?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.hcz.dao.TeacherDao">

    <!--按结果嵌套查询-->
    <select id="selectAllTeacher" resultMap="TeacherStudent">
        select s.id as sid,s.name as  sname,t.name as tname,t.id as tid
        from student s, teacher t
        where s.tid = t.id and t.id=#{tid}
    </select>
    <resultMap id="TeacherStudent" type="Teacher">
        <id property="id" column="tid"/>
        <result property="name" column="tname"/>
        <!--复杂的属性,我们需要单独处理
                对象:association 【多对一】
                集合:collection 【一对多】
                集合中的泛型信息使用ofType获取
                javaType:用来指定实体类中属性的类型
                ofType:用来指定映射到List或者集合中的pojo类型,泛型中的约束类型
        -->
        <collection property="students" ofType="Student">
            <id property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="tid" column="tid"/>
        </collection>
    </resultMap>

    <!--=======================================================-->
    <select id="selectAllTeacher2" resultMap="TeacherStudent2">
        select * from teacher where id = #{tid}
    </select>

    <resultMap id="TeacherStudent2" type="Teacher">
        <collection property="students" column="id"
                    javaType="ArrayList" ofType="Student" select="selectStudentByTeacherId"/>
    </resultMap>
    
    <select id="selectStudentByTeacherId" resultType="Student">
        select * from student where tid = #{tid}
    </select>
</mapper>
(3)创建测试类方法
@Test
public void test(){
    //1、获取SqlSession对象,一旦创建了,就不再需要它了(局部变量)
    SqlSession sqlSession = MyBatisUtil.getSqlSession();

    logger.info("====进入测试方法====");

    //2、执行SQL语句
    TeacherDao mapper = sqlSession.getMapper(TeacherDao.class);
    //List<User> userList = mapper.getUserList();
    //调用方式1方法查询
    List<Teacher> teacherList = mapper.selectAllTeacher2(1);

    //userList.forEach(list-> System.out.println(list));
    for (Teacher teacher:teacherList){
        System.out.println(teacher);
    }
    sqlSession.close();
}
(4)运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@烟雨倾城ゝ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值