MyBatis(三)

MyBatis(三)

日志

日志工厂

  • 配置文件 -> settings -> logImpl:指定MyBatis所用日志的具体实现
  • SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING

LOG4J

配置

  • 导入依赖
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
  • 新建log4j.properties,写入如下配置:
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger = DEBUG, console, file

#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold = DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%c]-%m%n

#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = ./log/yhr.log
log4j.appender.file.MaxFileSize = 10mb
log4j.appender.file.Threshold = DEBUG
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = [%p][%d{yy-MM-dd}][%c]%m%n

#日志输出级别
log4j.logger.org.mybatis = DEBUG
log4j.logger.java.sql = DEBUG
log4j.logger.java.sql.Statement = DEBUG
log4j.logger.java.sql.ResultSet = DEBUG
log4j.logger.java.sql.PreparedStatement = DEBUG
  • 在mybatis-config.xml中配置
<settings>
    <setting name="logImpl" value="LOG4J"/>
</settings>

使用

  • 导入import org.apache.log4j.Logger;

  • 生成日志对象,static Logger logger = Logger.getLogger(UserMapperTest.class);

    • 参数为当前类的Class对象
    • 可以使用Logger对象按等级输出日志:info、debug、error
  • 注意:IDEA中未安装log插件时,配置文件中使用<package.../>标签来扫描包会导致乱码无法打开

分页

使用limit分页

select * from user limit startIndex, pageSize
  • 注意,开始位置是从0开始的

使用RowBounds分页

RowBounds rowBounds = new RowBounds(offset, limit);
List<User> userList = sqlSession.selectList("方法全限定名", null, rowBounds);

分页插件

使用注解开发

  • 注解在接口上实现
@Select("select * from user")
List<User> getUsers();
  • 需要在核心配置文件中绑定接口
<!--绑定接口-->
<mappers>
    <mapper class="com.yhr.dao.UserMapper"/>
</mappers>
  • 注意:
    • sqlSessionFactory.openSession(true);可以开启自动提交
    • @Param("")可以注解参数名字,用于sql语句中的#{}引用
      • 引用类型可以不加
      • #{}可以防止SQL注入,但order by只能使用${}

MyBatis执行流程

  1. Resource获取加载全局配置文件
  2. 实例化SqlSessionFactoryBuilder构造器
  3. 解析配置文件流XML ConfigBuilder
  4. 得到Configuration对象包含所有的配置信息
  5. 实例化SqlSessionFactory
  6. 创建transactional事务管理器
  7. 创建executor执行器
  8. 创建sqlSession
  9. 实现CRUD
  10. 执行失败回滚,执行成功提交事务
  11. 关闭

Lombok

  • 在IDEA中安装Lombok插件
  • 在项目中导入依赖
  • 在实体类上加注解

常用注解

  • @Data:无参构造、get、set、toString、hashCode、equals
  • @AllArgsConstructor:有参构造(会覆盖@Data的无参构造)
  • @NoArgsConstructor:无参构造

多对一处理

  • 多个学生对应一个老师
  • 对于学生而言,多个学生关联一个老师(多对一)
  • 对于老师而言,一个老师有学生的集合(一对多)

按照查询嵌套处理

<resultMap id="StudentTeacher" type="Student">
    <result property="id" column="id"/>
    <result property="name" column="name"/>
    <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>

<select id="getStudent" resultMap="StudentTeacher">
    select * from mybatis.student;
</select>

<select id="getTeacher" resultType="Teacher">
    select * from mybatis.teacher where id = #{tid};
</select>
  • 先查Student,再用Student里的tid去查Teacher

按照结果嵌套处理

<resultMap id="StudentTeacher" type="Student">
    <result property="id" column="sid"/>
    <result property="name" column="sname"/>
    <association property="teacher" javaType="Teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
    </association>
</resultMap>

<select id="getStudent" resultMap="StudentTeacher">
    select s.id sid, s.name sname, t.id tid, t.name tname
    from mybatis.student s, mybatis.teacher t
    where s.tid = t.id;
</select>
  • 直接联表查询,对查出来的结果做嵌套映射

一对多处理

按照结果嵌套处理

<resultMap id="TeacherStudent" type="Teacher">
    <result property="id" column="tid"/>
    <result property="name" column="tname"/>
    <!--集合中的泛型信息,用ofType获取-->
    <collection property="students" ofType="Student">
        <result property="id" column="sid"/>
        <result property="name" column="sname"/>
        <result property="tid" column="tid"/>
    </collection>
</resultMap>

<select id="getTeacher" resultMap="TeacherStudent">
    select s.id sid, s.name sname, t.name tname, t.id tid
    from mybatis.student s, mybatis.teacher t
    where s.tid = t.id and t.id = #{tid};
</select>

按照查询嵌套处理

<resultMap id="TeacherStudent" type="Teacher">
    <result property="id" column="id"/>
    <result property="name" column="name"/>
    <collection property="students" javaType="ArrayList" ofType="Student"
                column="id" select="getStudentByTeacherID"/>
</resultMap>

<select id="getTeacher" resultMap="TeacherStudent">
    select * from mybatis.teacher
    where id = #{tid};
</select>

<select id="getStudentByTeacherID" resultType="Student">
    select * from mybatis.student
    where tid = #{id};
</select>
posted @ 2021-02-01 20:51  一天到晚睡觉的鱼  阅读(68)  评论(0)    收藏  举报