1.mybatis学习-基础

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>

这样运行就可以输出日志了

相关推荐
へ蟲児.2 小时前
2026三大自带完整体系的英语学习App深度测评:哪款更适合儿童启蒙?
学习
苦猿的大模型日记2 小时前
Day64|从0学习 Claude Code(十四):MCP,给 Agent 装个工具插座
学习
m4Rk_3 小时前
【论文阅读】Agent 记忆机制(82):ReasoningBank——从成功与失败经验中沉淀可复用的推理记忆
论文阅读·人工智能·学习·开源·github
旖旎夜光4 小时前
LeetCode 137 : 只出现一次的数字 II(位运算) —— 题解
c++·笔记·学习·算法·leetcode·力控
凉、介4 小时前
深入理解 ARM SCP Firmware 的 Event 与 Notification 机制
学习·scp·嵌入式·arm
minglie14 小时前
几何变换群矩阵表示与埃尔朗根纲领
学习
dadaobusi4 小时前
学习: ARM SMMU stream id
arm开发·学习
FelixZhang0285 小时前
量化求真10|回测通过以后,策略就能上场吗?
人工智能·python·深度学习·学习·机器学习·金融·lstm
Vcaker5 小时前
Linux学习33-HPA动态扩缩容及k8s调度策略
linux·运维·学习