MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。他封装的JDBC,更方便、简洁的操作数据库。他的原名叫"iBatis",提供了持久层框架包括SqlMaps和Data access objects(DAO)
导包
地址:https://github.com/mybatis/mybatis-3
XML
<dependencies>
<!--数据库框架-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
<scope>compile</scope>
</dependency>
<!-- mysql数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--junit-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.4.2</version>
</dependency>
</dependencies>
文档:https://mybatis.org/mybatis-3/zh_CN/index.html
持久化
持久化就是将程序的数据在持久状态和瞬时状态转化的过程。人话就是把数据保存到磁盘上,不要保存在内存中,因为内存断电即失。
配置文件
-
核心配置文件:链接mysql数据库的信息
命名无规则限制,建议命名为mybatis-config.xml
xml<?xml version="1.0" encoding="UTF-8" ?> <!--约束 DOCTYPE 后边必然是跟标签--> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--配置链接数据库的环境--> <environments default="development"> <environment id="development"> <!--事务管理器的方式:JDBC--> <!--原始的JDBC事务开启回滚都需要手动执行--> <transactionManager type="JDBC"/> <!--数据源配置 --> <!-- type="POOLED"表示使用数据库连接池 对数据库链接进行保存,等到下一次使用的时候从池中取出 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/java-test"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!--引入映射文件--> <mappers> <mapper resource="org/mybatis/example/BlogMapper.xml"/> </mappers> </configuration> -
映射文件:对象关系映射的文件。
创建Mapper接口
MyBatis中的mapper接口(面向接口编程)相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要提供实现类。
JAVA
public interface UserMapper {
public User getUserById();
}
创建映射文件
ORM (Object Relationship Mapping)对象关系映射。
- 对象:Java的实体类对象,比如User
- 关系:关系型数据库
- 映射:二者之间的对应关系,例如下图映射关系

创建映射文件 UserMapper.xml
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--约束 DOCTYPE 后边必然是跟标签-->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--要做到对象关系映射,需要两个步骤:-->
<!--1. namespace对应的mapper接口文件-->
<!--2. select、insert等标签对应mapper接口文件中的方法名-->
<mapper namespace="com.light.mybatis.mapper.UserMapper">
<insert id="addUser">
insert into user values(null, "wwwcang", "123456", "wwwcang", 12, 100)
</insert>
<update id="updateUser">
update user set password="456123" where id = 5
</update>
<!--
查询功能的标签必须设置resultType或resultMap
resultType:期望条语句中返回结果的类全限定名或别名, 注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。
resultMap: 描述如何从数据库结果集中加载对象。
-->
<select id="getUserById" resultType="com.light.mybatis.pojo.User">
select * from user where id= 2
</select>
</mapper>
在配置文件引入映射文件
XML
<?xml version="1.0" encoding="UTF-8" ?>
<!--约束 DOCTYPE 后边必然是跟标签-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--配置链接数据库的环境-->
<environments default="development">
<environment id="development">
<!--事务管理器的方式:JDBC-->
<!--原始的JDBC事务开启回滚都需要手动执行-->
<transactionManager type="JDBC"/>
<!--数据源配置 -->
<!--
type="POOLED"表示使用数据库连接池
对数据库链接进行保存,等到下一次使用的时候从池中取出
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/java-test"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<mapper resource="mappers/UserMapper.xml"/>
</mappers>
测试
SqlSession : 代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的会话)
SqlSessionFactory: 是"生产"SqlSession的"工厂"。
java
import com.light.mybatis.mapper.UserMapper;
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 org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
public class TestMybatis {
@Test
public void test1() throws IOException {
//加载核心配置文件
InputStream io = Resources.getResourceAsStream("mybatis-config.xml");
// 获取SqlSessionFactory
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 获取工厂对象
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(io);
// 使用工厂对象创建SqlSession对象
SqlSession sqlSession = factory.openSession();
// 获取mapper接口对象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 测试功能
int i = userMapper.addUser();
// 提交事务
sqlSession.commit();
System.out.println("result:"+i);
}
}
自动提交事务
ctrl + p 查看openSession参数,有一个autocommit参数:

这个参数可以实现自动提交事务
java
SqlSession sqlSession = factory.openSession(true);
日志打印
添加依赖
xml
<!--log4j2的依赖-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.19.0</version>
</dependency>
<!-- Bridge from SLF4J 1.x to Log4j2(MyBatis 3.5.6 用的 SLF4J 1.x API) -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.19.0</version>
</dependency>
<!-- SLF4J API(log4j-slf4j-impl 会自动带入,显式声明确保版本一致) -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
添加配置文件log4j2.xml
xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
Configuration 是 Log4j2 的根元素。
status="WARN":Log4j2 自身内部日志的输出级别,WARN 表示只输出警告和错误,避免干扰。
monitorInterval="30":每 30 秒检测一次配置文件是否发生变化,如果变化则自动重新加载,无需重启应用。
-->
<Configuration status="WARN" monitorInterval="30">
<!--Properties 用于定义全局变量,方便在后面的配置中通过 ${变量名} 引用。这样可以让配置更简洁,修改时只需改一处。-->
<Properties>
<!-- 日志文件存放的根目录,这里设置为当前工作目录下的 logs 文件夹 -->
<Property name="LOG_HOME">./logs</Property>
<!-- 应用名称,用于生成日志文件名,这里叫 mybatis-demo -->
<Property name="APP_NAME">mybatis-demo</Property>
<!-- 日志输出格式:
%d{yyyy-MM-dd HH:mm:ss.SSS}:日期时间,精确到毫秒
[%t]:线程名
%-5level:日志级别,左对齐占5个字符
%logger{36}:日志记录器名称,最多显示36个字符
- %msg%n:日志消息和换行符
-->
<Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
</Properties>
<!--
Appenders 定义了日志的输出目的地。
可以有多个 Appender,比如控制台、文件、数据库等。
这里配置了两个:Console(控制台)和 RollingFile(滚动文件)。
-->
<Appenders>
<!--
Console Appender:将日志输出到控制台(标准输出)。
name="Console":给这个 Appender 起个名字,后面 Logger 中通过 ref 引用。
target="SYSTEM_OUT":输出到 System.out,也可以设为 SYSTEM_ERR。
-->
<Console name="Console" target="SYSTEM_OUT">
<!-- 使用上面定义的日志格式 -->
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
<!--
RollingFile Appender:将日志输出到文件,并支持按时间或大小滚动(分割)文件。
name="RollingFile":Appender 名称。
fileName="${LOG_HOME}/${APP_NAME}.log":当前正在写入的日志文件名。
filePattern="${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}-%i.log.gz":
滚动后归档文件的命名模式。
%d{yyyy-MM-dd} 表示日期,%i 表示序号,.gz 表示压缩为 gzip 格式。
-->
<RollingFile name="RollingFile"
fileName="${LOG_HOME}/${APP_NAME}.log"
filePattern="${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
<!-- 归档文件同样使用指定的日志格式 -->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!-- Policies 定义触发滚动的策略。可以同时使用多个策略,满足任一条件即触发滚动。-->
<Policies>
<!--
TimeBasedTriggeringPolicy:基于时间的滚动策略。
interval="1":每隔 1 个时间单位滚动一次,单位由 filePattern 中的最小时间单位决定。
这里 filePattern 中有 %d{yyyy-MM-dd},所以单位是天,即每天滚动一次。
modulate="true":是否对滚动时间进行调制。true 表示以 0 点为边界,而不是从应用启动时间开始计算。
-->
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<!--
SizeBasedTriggeringPolicy:基于文件大小的滚动策略。
size="100 MB":当当前日志文件达到 100MB 时触发滚动。
-->
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!--
DefaultRolloverStrategy:默认滚动策略,控制归档文件的最大数量。
max="30":最多保留 30 个归档文件,超过时删除最旧的文件。
-->
<DefaultRolloverStrategy max="30"/>
</RollingFile>
</Appenders>
<!--
Loggers 定义了日志记录器,用于将日志事件路由到不同的 Appender。
可以针对特定的包或类设置不同的日志级别和输出目标。
-->
<Loggers>
<!--additivity="false":表示不将日志事件传递给父级 Logger(如 Root),避免重复输出-->
<!-- Mapper 接口日志:DEBUG 输出 SQL 语句、参数和结果集(仅限你自己的 Mapper) -->
<Logger name="com.light.mybatis.mapper" level="DEBUG" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Logger>
<!-- MyBatis 框架日志:INFO 只看关键信息,不看连接池/事务等细节 -->
<Logger name="org.apache.ibatis" level="INFO" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Logger>
<!--
Root Logger:根日志记录器,是所有 Logger 的父级。
当没有匹配到特定 Logger 时,日志事件会交给 Root 处理。
level="INFO":默认日志级别为 INFO,即输出 INFO、WARN、ERROR 等级别的日志。
-->
<Root level="INFO">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
这样运行就可以输出日志了
