课时9::MyBatis整合Log4j延迟加载
Posted 何邦柱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了课时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的属性是不会触发一起查看学生的
以上是关于课时9::MyBatis整合Log4j延迟加载的主要内容,如果未能解决你的问题,请参考以下文章