Mybatis介绍与搭建
1、Mybatis简介:
? MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
官方地址:https://mybatis.org/mybatis-3/zh/index.html
2、Mybatis流程
3、Mybatis搭建流程
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.9</version>
</dependency>
- 配置mybatis.properties文件:将configer中的参数进行集中配置
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/school?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=1234
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="mybatis.properties"/>
<settings>
<setting name="logImpl" value="LOG4J"/>
<setting name="cacheEnabled" value="true"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/cn/mapper/CourseMapper.xml"/>
</mappers>
</configuration>
package com.cn.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class SqlSessionFactoryUtil {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
if (sqlSessionFactory == null){
synchronized (SqlSessionFactoryUtil.class){
if (sqlSessionFactory == null){
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession();
}
}
- 编写Mapper接口以及Mapper.xml文件,此处是CRUD相关实现代码;同时需要注意:
- xml文件中的namespace指定路径需要与mapper接口对应
- xml文件可以和mapper接口在一个路径下,也可以放于resources/mapper中,不管哪种方式,都需要在Mybatis-config.xml文件中的mapper指定正确
- 如果xml文件在java包下,那么需要在pom文件的build中,配置相关的resource
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
以下是select示例代码
@Data
public class Course implements Serializable{
private int cno;
private String cname;
}
public interface CourseMapper {
List<Course> selectALL();
}
public class TestDemo {
@Test
public void test(){
SqlSession sqlSession = SqlSessionFactoryUtil.getSqlSession();
try{
CourseMapper mapper = sqlSession.getMapper(CourseMapper.class);
List<Course> list = mapper.selectALL();
System.out.println(list);
}catch (Exception e){
e.printStackTrace();
}finally {
sqlSession.close();
}
}
}
<?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.cn.mapper.CourseMapper">
<select id="selectALL" resultType="com.cn.pojo.Course">
select * from course;
</select>
</mapper>
4、日志工厂与log4j集成
? Mybatis框架在setting配置中,有各种配置运行时行为的参数,其中,logImpl参数控制日志输出模式;STDOUT_LOGGING 属于标准输出日志模式,该模式只需要配置setting一个参数就行,但缺点是无法进行自制日志打印,打印信息与自己需求可能存在出入
设置名 | 描述 | 有效值 | 默认值 |
---|
logImpl | 指定 MyBatis 所用日志的具体实现,未指定时将自动查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | NO_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | 未设置? |
集成LOG4J日志:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
log4j.rootLogger=DEBUG,CONSOLE,file
# 配置CONSOLE输出到控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
# 配置CONSOLE日志的输出格式 [frame] 2019-08-22 22:52:12,000 %r耗费毫秒数 %p日志的优先级 %t线程名 %C所属类名通常为全类名 %L代码中的行号 %x线程相关联的NDC %m日志 %n换行
log4j.appender.CONSOLE.layout.ConversionPattern=[frame] %d{yyyy-MM-dd HH:mm:ss,SSS} - %-4r %-5p [%t] %C:%L %x - %m%n
# 配置logfile输出到文件中 文件大小到达指定尺寸的时候产生新的日志文件
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.Encoding=UTF-8
log4j.appender.file.File=./logs/root.log
log4j.appender.file.MaxFileSize=10MB
log4j.appender.file.MaxBackupIndex=3
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%n
5、缓存
Mybatis框架中自带缓存,sql查询时优先在缓存中查询,当未命中时,再在数据库中进行查找,减少数据压力;Mybatis缓存分为一级缓存和二级缓存。
- 一级缓存:Mybatis默认开启的缓存,只在一个SqlSession会话中有效,无法取消;
- 二级缓存:以namespace空间为界限,整个接口层下所有接口共享数据,当以及SqlSession会话结束时,一级缓存中的数据会被拷贝到二级缓存中;
注意:
>- 无论是一级缓存还是二级缓存,缓存命中的前提都是查询sql一致的情况下,不论是条件还是查询字段不一致,两个sql的数据都无法共享;
>
>- 映射语句文件中的所有 select 语句的结果将会被缓存。
>- 所有 insert、update 和 delete 语句会刷新缓存,导致已有缓存失效
>- 缓存会自动清除不需要的缓存。
>- 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
>- 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。
可用的清除策略有:
LRU – 最近最少使用:移除最长时间不被使用的对象。FIFO – 先进先出:按对象进入缓存的顺序来移除它们。SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
|