课时9::MyBatis整合Log4j、延迟加载

.1)如何整合Log4j到mybatis

  1.导入log4j的jar包

<dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
  </dependencies>

  2.在主配置文件中开启log4j

<!--    配置log4j启动-->
    <settings>
        <setting name="logImpl" value="LOG4J"></setting>
    </settings>

    2.1 .如果不写value里面的值 会按照这个顺序查找SLF4J-->Apache Commons Logging-->Log4j 2---Log4j-->JDK logging

  3.在resources中配置log4j.properties文件

.2)延迟加载

  1.概念

    1.1  一对一,一对多,多对一,多对多

    一对多:班级--学生,

    如果不采用延迟加载(立即加载),查询时会将一对多都查询,班级丶班级中的所有学生。

    如果想要 暂时只查询一个1的一方,而多的一方 先不查询,而是在需要查询的时候再去查询--->延迟加载

  2.以学生和学生证一对一案例为例

    2.1 首先配置主文件开启延迟加载并关闭立即加载

<!--        开启延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"></setting>
<!--        关闭立即加载-->
        <setting name="aggressiveLazyLoading" value="false"/>

    2.2 配置sql映射文件的主SQL

<!--    查询全部的学生-->
    <select id="queryStudentByWithLazyLoad"  resultMap="queryStudentByWithLazyLoad">
       select * from student
    </select>

    <resultMap id="queryStudentByWithLazyLoad" type="student">
        <id property="stuNo" column="stuno"></id>
        <result property="stuName" column="stuName"></result>
        <result property="stuAge" column="stuAge"></result>
        <result property="graName" column="graName"></result>
        <result property="stuSex" column="stusex" javaType="boolean" jdbcType="INTEGER"></result>
        <result property="cardid" column="cardid"></result>
<!--        引入次要的sql 并且以什么进行关联-->
        <association property="studentcart" javaType="Studentcart" select="org.hbz.dao.IStudentcartDao.queryCardById" column="cardid">
<!--            <id property="cartid" column="cartid"></id>-->
<!--            <result property="cardinfo" column="cardinfo"></result>-->
        </association>
    </resultMap>

      2.2.1 association:一对一查询时用, select:表示引入的要延迟加载的sql的空间+id名称 column:表示通过主SQL字段与要延迟加载的表建立关系

    2.3.配置sql映射文件的关联的SQL

<!--    根据学生证id查询学生证-->
    <select id="queryCardById" parameterType="int" resultType="Studentcart">
        select * from studentcart where cartid=#{xx}
    </select>

    2.4.编写dao层

List<Student> queryStudentByWithLazyLoad();

    2.5.编写测试类

 public static void queryStudentByWithLazyLoad() throws IOException {
        Reader reader = Resources.getResourceAsReader("config.xml");
        SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reader);
        SqlSession session=sessionFactory.openSession();
        IStudentDao iStudentDao=session.getMapper(IStudentDao.class);
        List<Student> stu= iStudentDao.queryStudentByWithLazyLoad();
        for (Student student:stu){
            System.out.println(student.getGraName());
            //查看学生证
            System.out.println(student.getStudentcart().getCardinfo());
        }
        session.close();
        reader.close();
    }

    2.5.1 通过代码测试结果总结:如果输出studnet整个对象是会一起加载学生证的 如果只是调用属于本身student的属性是不会触发一起查看学生证的

  6.以班级和学生为例一对多延迟加载

    6.1.首先配置主文件开启延迟加载并关闭立即加载

<!--        开启延迟加载-->
        <setting name="lazyLoadingEnabled" value="true"></setting>
<!--        关闭立即加载-->
        <setting name="aggressiveLazyLoading" value="false"/>

    6.2 配置sql映射文件的主SQL

<!--    主SQL查询班级所有信息-->
    <select id="queryStudentByWithLazy" resultMap="queryStudentByWithLazyMap">
        select c.* from  studentclass c
    </select>

    <resultMap id="queryStudentByWithLazyMap" type="studentclass">
        <id property="classid" column="classid"></id>
        <result property="classname" column="classname"></result>
        <collection property="list" ofType="student" select="org.hbz.dao.IStudentDao.queryStudentByCLassId" column="classid"/>
    </resultMap>

      6.2.1 collection:一对多查询时用 select:表示引入的要延迟加载的sql的空间+id名称 column:表示通过主SQL字段与要延迟加载的表建立关系

    6.3 配置sql映射文件的次SQL

<!--    通过班级id查询学生   延迟加载-->
    <select id="queryStudentByCLassId" parameterType="Integer" resultType="student">
        select * from student where classid=#{xx}
    </select>

    6.4 编写dao层

List<Studentclass> queryStudentByWithLazy();

    6.5 编写测试类

 public static void queryStudentByWithLazy() throws IOException {
        Reader reader = Resources.getResourceAsReader("config.xml");
        SqlSessionFactory sessionFactory=new SqlSessionFactoryBuilder().build(reader);
        SqlSession session=sessionFactory.openSession();
        IStudentClassDao iStudentClassDao=session.getMapper(IStudentClassDao.class);
        List<Studentclass> studentclasses = iStudentClassDao.queryStudentByWithLazy();
       for (Studentclass studentclass:studentclasses){
           System.out.println(studentclass.getClassname());
       }
        session.close();
        reader.close();
    }

      6.5.1 通过代码测试结果总结:如果输出studentclass整个对象是会一起加载学生的 如果只是调用属于本身studentclass的属性是不会触发一起查看学生的

原文地址:https://www.cnblogs.com/thisHBZ/p/12457931.html