一. 整合Log4j(日志管理工具)
可以通过日志信息,详细地阅读mybatis执行情况( 观察mybatis实际执行sql语句 以及SQL中的参数 和返回结果)
1.导入jar包:log4j.jar
2.开启日志:
conf.xml中配置:
<settings>
<!-- 开启日志,并指定使用的具体日志 -->
<setting name="logImpl" value="LOG4J"/>
</settings>
如果不指定,Mybatis就会根据以下顺序 寻找日志
SLF4J →Apache Commons Logging →Log4j 2 → Log4j →JDK logging
3. 编写配置日志输出文件
log4j.properties:
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
日志级别:
DEBUG<INFO<WARN<ERROR
如果设置为info,则只显示 info及以上级别的信息;
建议:在开发时设置debug,在运行时设置为info或以上。
通过conf.xml中<setting name="logImpl" value="LOG4J"/>
value的值(LOG4J)自动找到log4j.properties资源文件(名字log4j相同)
二. 延迟加载
延迟加载(懒加载):
一对一、一对多、多对一、多对多
一对多:如班级-学生 ,
如果不采用延迟加载 (立即加载),查询时会将 一 和多 都查询,即立刻输出班级、班级中的所有学生。
如果想要 暂时只查询1的一方, 而多的一方 先不查询 而是在需要的时候再去查询 -->采用延迟加载
例如:一对多,班级-学生
延迟加载的步骤:(先查班级,按需查询学生)
1.开启延迟加载conf.xml配置settings
mybatis中使用延迟加载,需要先配置:
<settings>
<!-- 开启延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 关闭立即加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
如果增加了mapper.xml ,要修改conf.xml配置文件(将新增的mapper.xml加载进去)
2.配置mapper.xml
写2个Mapper:
(规范一些:班级查询另外配置新的接口和Mapper.xml文件)
新建的文件:StudentClassMapper.java,StudentClassMapper.xml,queryStudentLazyLoad.xml。
-----班级mapper.xml
<?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.ph.main.mapperI.StudentClassMapper">
<!-- 1111111先查班级 -->
<select id="queryOTMLazyLoad" resultMap="OneToMore">
select c.* from studentclass c
</select>
<resultMap type="studentclass" id="OneToMore">
<!-- 因为 type的主类是班级,因此先配置班级的信息-->
<id property="classId" column="classid"/>
<result property="className" column="classname"/>
<!-- 2222222再查班级对应的学生 -->
<collection property="students" ofType="student"
select="com.ph.main.mapperI.queryStudentLazyLoad.queryClassAll"
column="classid">
</collection>
</resultMap>
</mapper>
即查询 学生的sql是通过 select属性指定,并且通过column指定两个数据表的外键,通过这个外键传入参数
-----queryStudentLazyLoad.xml
<?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.ph.main.mapperI.queryStudentLazyLoad">
<!-- 一对多,延迟加载需要的: 查询班级中的所有学生
此处的输入参数是<collection>中的column="classid"
-->
<select id="queryClassAll" resultType="student" parameterType="int">
select s.* from student s where classid=#{classId}
</select>
</mapper>
3 测试:
先查询了班级,然后在延迟加载时,把班级的classId作为输入参数传进第二个SQL语句