Mybatis整合Log4j、延迟加载

日志:Log4j

a.Log4j :Log4j.jar

b.开启日志

/MyBatisProject3/src/conf.xml

    
    
        
    

 

如果不指定,Mybatis就会根据以下顺序寻找日志

SLF4J -> Apache Commons Logging -> Log4j 2 -> Log4j ->JDK logging

c.编写配置日志输出文件

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,则只显示info及以上的级别的信息

建议:在开发时设置debug,在设置运行时设置为info或以上。

 

可以通过日志信息,详细的阅读mybatis执行情况(观察mybatis实际执行sql语句以及sql中的参数和返回结果)

 

延迟加载(懒加载):

一对一、一对多、多对一,多对多

一对多:班级-学生

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

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

 

一对一:学生、学生证

mybatis中使用延迟加载,需要先配置:

/MyBatisProject3/src/conf.xml


        
        
        
        
        
    

 

/MyBatisProject3/src/org/myy/mapper/studentMapper.xml

    
    
    
        
        
        
        
        
        select="org.myy.mapper.StudentCardMapper.queryCardById" column="cardid" >
                
        
    

 

/MyBatisProject3/src/org/myy/mapper/studentCardMapper.xml


    
    

 

如果增加了mapper.xml,一定要修改配置文件(将新增的mapper.xml加载进去)

/MyBatisProject3/src/conf.xml

/MyBatisProject3/src/org/myy/mapper/StudentMapper.java

List queryStudentByNoWithOOLazyLoad();

/MyBatisProject3/src/org/myy/test/Test.java

        // Connection - SqlSession操作Mybatis
        // conf.xml->reader
        Reader reader = Resources.getResourceAsReader("conf.xml");
        // reader->sqlSession
        // 可以通过build的第二参数 指定数据库环境
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader, "development");
        SqlSession session = sessionFactory.openSession();

        StudentMapper studentMapper = session.getMapper(StudentMapper.class);
        
        //学生
        List students = studentMapper.queryStudentByNoWithOOLazyLoad();
        for(Student student:students) {
            System.out.println(student.getStuNo()+","+student.getStuName()+","+student.getStuAge());
            //获取学生证
            StudentCard card=student.getCard();
            System.out.println(card.getCardId()+","+card.getCardInfo());
        }
        session.close();

通过debug可以发现,如果程序只需要学生,则只向数据库发送了查询学生的SQL;

当我们后续需要用到学生整的时候,载第二次发送查询学生证的SQL;

 

一对多:和一对一的延迟配置方法相同

延迟加载步骤:先查班级,按需查询学生

1.开启延迟加载conf.xml配置setting

2.配置mapper.xml

  写2个mapper

  班级mapper.xml

/MyBatisProject3/src/org/myy/mapper/studentClassMapper.xml


DOCTYPE mapper 
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">




    
    
    
    
        
        
        
        
        
         select="org.myy.mapper.StudentMapper.queryStudentByClassId" column="classid">

        
    

 

    即查询学生的sql是通过select属性指定,并且通过column指定外键

  学生mapper.xml

/MyBatisProject3/src/org/myy/mapper/studentMapper.xml

  
  

/MyBatisProject3/src/org/myy/mapper/StudentClassMapper.java

package org.myy.mapper;

import java.util.List;

import org.myy.entity.StudentClass;

//操作Mybatis的接口
public interface StudentClassMapper {
    /* 
     1.方法名和mapper.xml文件中的标签的id值相同 
     2.方法的输入参数和mapper.xml文件中的标签的parameterType类型一致
     3.方法的返回值和mapper.xml文件中标签的resultType类型一致
     */
    //public abstract Student1 queryStudentByStuno(int stuno);
    //查询全部班级
    List queryClassAndStudentsLazyLoad();
}

 

/MyBatisProject3/src/org/myy/test/Test.java

        // Connection - SqlSession操作Mybatis
        // conf.xml->reader
        Reader reader = Resources.getResourceAsReader("conf.xml");
        // reader->sqlSession
        // 可以通过build的第二参数 指定数据库环境
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader, "development");
        SqlSession session = sessionFactory.openSession();

        StudentClassMapper StudentClassMapper = session.getMapper(StudentClassMapper.class);
        
        
        List  studentClasses = StudentClassMapper.queryClassAndStudentsLazyLoad();
        //班级信息
        for(StudentClass studentClass:studentClasses) {
            System.out.println(studentClass.getClassId()+","+studentClass.getClassName());
            List students=studentClass.getStudents();
            for(Student student:students) {
                System.out.println(student.getStuNo()+","+student.getStuName()+","+student.getStuAge());
            }
            System.out.println("------------------------------");
        }

 

你可能感兴趣的:(Mybatis整合Log4j、延迟加载)