☰
1.mybatis学习-基础
2026/9/27 10:02:19 网站建设 项目流程

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。他封装的JDBC,更方便、简洁的操作数据库。他的原名叫“iBatis”,提供了持久层框架包括SqlMaps和Data access objects(DAO)

导包

地址:https://github.com/mybatis/mybatis-3

<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 version="1.0" encoding="UTF-8" ?><!--约束 DOCTYPE 后边必然是跟标签--><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--配置链接数据库的环境--><environmentsdefault="development"><environmentid="development"><!--事务管理器的方式:JDBC--><!--原始的JDBC事务开启回滚都需要手动执行--><transactionManagertype="JDBC"/><!--数据源配置 --><!-- type="POOLED"表示使用数据库连接池 对数据库链接进行保存,等到下一次使用的时候从池中取出 --><dataSourcetype="POOLED"><propertyname="driver"value="com.mysql.jdbc.Driver"/><propertyname="url"value="jdbc:mysql://localhost:3306/java-test"/><propertyname="username"value="root"/><propertyname="password"value="123456"/></dataSource></environment></environments><!--引入映射文件--><mappers><mapperresource="org/mybatis/example/BlogMapper.xml"/></mappers></configuration>
  • 映射文件:对象关系映射的文件。

创建Mapper接口

MyBatis中的mapper接口(面向接口编程)相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要提供实现类。

public interface UserMapper { public User getUserById(); }

创建映射文件

ORM (Object Relationship Mapping)对象关系映射。

  • 对象:Java的实体类对象,比如User
  • 关系:关系型数据库
  • 映射:二者之间的对应关系,例如下图映射关系

创建映射文件UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?><!--约束 DOCTYPE 后边必然是跟标签--><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd"><!--要做到对象关系映射,需要两个步骤:--><!--1. namespace对应的mapper接口文件--><!--2. select、insert等标签对应mapper接口文件中的方法名--><mappernamespace="com.light.mybatis.mapper.UserMapper"><insertid="addUser">insert into user values(null, "wwwcang", "123456", "wwwcang", 12, 100)</insert><updateid="updateUser">update user set password="456123" where id = 5</update><!-- 查询功能的标签必须设置resultType或resultMap resultType:期望条语句中返回结果的类全限定名或别名, 注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。 resultMap: 描述如何从数据库结果集中加载对象。 --><selectid="getUserById"resultType="com.light.mybatis.pojo.User">select * from user where id= 2</select></mapper>

在配置文件引入映射文件

<?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的"工厂"。

importcom.light.mybatis.mapper.UserMapper;importorg.apache.ibatis.io.Resources;importorg.apache.ibatis.session.SqlSession;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.session.SqlSessionFactoryBuilder;importorg.junit.jupiter.api.Test;importjava.io.IOException;importjava.io.InputStream;publicclassTestMybatis{@Testpublicvoidtest1()throwsIOException{//加载核心配置文件InputStreamio=Resources.getResourceAsStream("mybatis-config.xml");// 获取SqlSessionFactorySqlSessionFactoryBuildersqlSessionFactoryBuilder=newSqlSessionFactoryBuilder();// 获取工厂对象SqlSessionFactoryfactory=sqlSessionFactoryBuilder.build(io);// 使用工厂对象创建SqlSession对象SqlSessionsqlSession=factory.openSession();// 获取mapper接口对象UserMapperuserMapper=sqlSession.getMapper(UserMapper.class);// 测试功能inti=userMapper.addUser();// 提交事务sqlSession.commit();System.out.println("result:"+i);}}

自动提交事务

ctrl + p查看openSession参数,有一个autocommit参数:

这个参数可以实现自动提交事务

SqlSessionsqlSession=factory.openSession(true);

日志打印

添加依赖

<!--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 version="1.0" encoding="UTF-8"?><!-- Configuration 是 Log4j2 的根元素。 status="WARN":Log4j2 自身内部日志的输出级别,WARN 表示只输出警告和错误,避免干扰。 monitorInterval="30":每 30 秒检测一次配置文件是否发生变化,如果变化则自动重新加载,无需重启应用。 --><Configurationstatus="WARN"monitorInterval="30"><!--Properties 用于定义全局变量,方便在后面的配置中通过 ${变量名} 引用。这样可以让配置更简洁,修改时只需改一处。--><Properties><!-- 日志文件存放的根目录,这里设置为当前工作目录下的 logs 文件夹 --><Propertyname="LOG_HOME">./logs</Property><!-- 应用名称,用于生成日志文件名,这里叫 mybatis-demo --><Propertyname="APP_NAME">mybatis-demo</Property><!-- 日志输出格式: %d{yyyy-MM-dd HH:mm:ss.SSS}:日期时间,精确到毫秒 [%t]:线程名 %-5level:日志级别,左对齐占5个字符 %logger{36}:日志记录器名称,最多显示36个字符 - %msg%n:日志消息和换行符 --><Propertyname="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。 --><Consolename="Console"target="SYSTEM_OUT"><!-- 使用上面定义的日志格式 --><PatternLayoutpattern="${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 格式。 --><RollingFilename="RollingFile"fileName="${LOG_HOME}/${APP_NAME}.log"filePattern="${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}-%i.log.gz"><!-- 归档文件同样使用指定的日志格式 --><PatternLayoutpattern="${LOG_PATTERN}"/><!-- Policies 定义触发滚动的策略。可以同时使用多个策略,满足任一条件即触发滚动。--><Policies><!-- TimeBasedTriggeringPolicy:基于时间的滚动策略。 interval="1":每隔 1 个时间单位滚动一次,单位由 filePattern 中的最小时间单位决定。 这里 filePattern 中有 %d{yyyy-MM-dd},所以单位是天,即每天滚动一次。 modulate="true":是否对滚动时间进行调制。true 表示以 0 点为边界,而不是从应用启动时间开始计算。 --><TimeBasedTriggeringPolicyinterval="1"modulate="true"/><!-- SizeBasedTriggeringPolicy:基于文件大小的滚动策略。 size="100 MB":当当前日志文件达到 100MB 时触发滚动。 --><SizeBasedTriggeringPolicysize="100 MB"/></Policies><!-- DefaultRolloverStrategy:默认滚动策略,控制归档文件的最大数量。 max="30":最多保留 30 个归档文件,超过时删除最旧的文件。 --><DefaultRolloverStrategymax="30"/></RollingFile></Appenders><!-- Loggers 定义了日志记录器,用于将日志事件路由到不同的 Appender。 可以针对特定的包或类设置不同的日志级别和输出目标。 --><Loggers><!--additivity="false":表示不将日志事件传递给父级 Logger(如 Root),避免重复输出--><!-- Mapper 接口日志:DEBUG 输出 SQL 语句、参数和结果集(仅限你自己的 Mapper) --><Loggername="com.light.mybatis.mapper"level="DEBUG"additivity="false"><AppenderRefref="Console"/><AppenderRefref="RollingFile"/></Logger><!-- MyBatis 框架日志:INFO 只看关键信息,不看连接池/事务等细节 --><Loggername="org.apache.ibatis"level="INFO"additivity="false"><AppenderRefref="Console"/><AppenderRefref="RollingFile"/></Logger><!-- Root Logger:根日志记录器,是所有 Logger 的父级。 当没有匹配到特定 Logger 时,日志事件会交给 Root 处理。 level="INFO":默认日志级别为 INFO,即输出 INFO、WARN、ERROR 等级别的日志。 --><Rootlevel="INFO"><AppenderRefref="Console"/><AppenderRefref="RollingFile"/></Root></Loggers></Configuration>

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询