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执行流程
- Resource获取加载全局配置文件
- 实例化SqlSessionFactoryBuilder构造器
- 解析配置文件流XML ConfigBuilder
- 得到Configuration对象包含所有的配置信息
- 实例化SqlSessionFactory
- 创建transactional事务管理器
- 创建executor执行器
- 创建sqlSession
- 实现CRUD
- 执行失败回滚,执行成功提交事务
- 关闭
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>

浙公网安备 33010602011771号