【Mybatis笔记】- 1 - MyBatis入门
【Mybatis笔记】- 1 - MyBatis入门
一、MyBatis简介
1、MyBatis历史
- MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下,iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github
- iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
2、MyBatis特性
- MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
- MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
- MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架
3、ORM(Object Relationship Mapping)对象关系映射
3.1 映射文件的命名规则:
表所对应的实体类的类名+Mapper.xml
例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml (一张表一个映射文件)
因此一个映射文件对应一个实体类,对应一张表的操作
MyBatis映射文件用于编写SQL,访问以及操作表中的数据 MyBatis映射文件存放的位置是src/main/resources/mappers目录下
3.2、MyBatis中可以面向接口操作数据,要保证两个一致:
mapper接口的全类名和映射文件的命名空间(namespace)保持一致
mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致
4、和其它持久化层技术对比
- JDBC
- SQL 夹杂在Java代码中耦合度高,导致硬编码内伤
- 维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见
- 代码冗长,开发效率低
- Hibernate 和 JPA
- 操作简便,开发效率高
- 程序中的长难复杂 SQL 需要绕过框架
- 内部自动生产的 SQL,不容易做特殊优化
- 基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。
- 反射操作太多,导致数据库性能下降
- MyBatis
- 轻量级,性能出色
- SQL 和 Java 编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据
- 开发效率稍逊于HIbernate,但是完全能够接受
二、搭建MyBatis
1、开发环境
- IDE:idea 2025.1.1
- 构建工具:maven 3.9.11
- MySQL版本:MySQL 8.0.28
- MyBatis版本:MyBatis 3.5.16
2、创建maven工程
- 打包方式:jar
- 引入依赖
<dependencies><!-- Mybatis核心 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.16</version></dependency><!-- junit测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- MySQL驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!--log4j日志--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>
</dependencies>

3、创建MyBatis的核心配置文件
习惯上命名为
mybatis-config.xml,这个文件名仅仅只是建议,并非强制要求。将来整合Spring之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。
核心配置文件主要用于配置连接数据库的环境以及MyBatis的全局配置信息
核心配置文件存放的位置是src/main/resources目录下
<?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> <!--设置连接数据库的环境--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/MyBatis"/> <property name="username" value="root"/> <property name="password" value="123"/> </dataSource> </environment> </environments> <!--引入映射文件--> <mappers> <mapper resource="mappers/UserMapper.xml"/> </mappers>
</configuration>

4、创建mapper接口
MyBatis中的mapper接口相当于以前的dao。但是区别在于,mapper仅仅是接口,我们不需要提供实现类
在Java目录下创建包com.zzz.mapper
在此目录下创建接口UserMapper
public interface UserMapper { /** * 添加用户信息 */ int insertUser();
}
5、创建MyBatis的映射文件
- 相关概念:ORM(Object Relationship Mapping)对象关系映射。
- 对象:Java的实体类对象
- 关系:关系型数据库
- 映射:二者之间的对应关系
| Java概念 | 数据库概念 |
|---|---|
| 类 | 表 |
| 属性 | 字段/列 |
| 对象 | 记录/行 |
映射文件的命名规则
表所对应的实体类的类名+Mapper.xml
- 例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml
- 因此一个映射文件对应一个实体类,对应一张表的操作
- MyBatis映射文件用于编写SQL,访问以及操作表中的数据
- MyBatis映射文件存放的位置是src/main/resources/mappers目录下
MyBatis中可以面向接口操作数据,要保证两个一致
- mapper接口的全类名和映射文件的命名空间(namespace)保持一致
- mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致
创建UserMapper.xml
<?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.zzz.mapper.UserMapper"> <!--int insertUser();--> <insert id="insertUser"> insert into t_user values(null,'张三','123',23,'女') </insert>
</mapper>
6、通过junit测试功能
- SqlSession:代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的会话)
- SqlSessionFactory:是“生产”SqlSession的“工厂”
- 工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象
public class UserMapperTest {@Testpublic void testInsertUser() throws IOException {//读取MyBatis的核心配置文件InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//获取SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);//获取sqlSession,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务//SqlSession sqlSession = sqlSessionFactory.openSession();//创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交 SqlSession sqlSession = sqlSessionFactory.openSession(true);//通过代理模式创建UserMapper接口的代理实现类对象UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//调用UserMapper接口中的方法,就可以根据UserMapper的全类名匹配元素文件,通过调用的方法名匹配映射文件中的SQL标签,并执行标签中的SQL语句int result = userMapper.insertUser();//提交事务//sqlSession.commit();System.out.println("result:" + result);}
}
- 此时需要手动提交事务,如果要自动提交事务,则在获取sqlSession对象时,使用
SqlSession sqlSession = sqlSessionFactory.openSession(true);,传入一个Boolean类型的参数,值为true,这样就可以自动提交
7、加入log4j日志功能
-
加入依赖
<!-- log4j日志 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> -
加入log4j的配置文件
- log4j的配置文件名为log4j.xml,存放的位置是src/main/resources目录下
- 日志的级别:FATAL(致命)>ERROR(错误)>WARN(警告)>INFO(信息)>DEBUG(调试) 从左到右打印的内容越来越详细
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"><param name="Encoding" value="UTF-8" /><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" /></layout></appender><logger name="java.sql"><level value="debug" /></logger><logger name="org.apache.ibatis"><level value="info" /></logger><root><level value="debug" /><appender-ref ref="STDOUT" /></root> </log4j:configuration>
三、Mybatis核心配置文件
1、<environments>:配置数据库环境
<environments>元素用于配置一个或多个数据库连接环境。- 每个项目只能启用 一个 环境,通过
<environments>的default属性指定要使用的环境 ID。 - 每个
<environment>必须具有唯一的id属性,作为该环境的标识。
<environments default="development"><environment id="development"><!-- 事务管理器和数据源配置 --></environment>
</environments>
注意:在实际开发中,通常会为开发(development)、测试(test)、生产(production)等不同阶段配置多个环境,但运行时只激活其中一个。
2、 <transactionManager>:事务管理方式
用于指定 MyBatis 如何管理事务,支持两种类型:
| 类型 | 说明 |
|---|---|
| JDBC | 使用 JDBC 原生事务机制。需要手动调用 SqlSession.commit() 提交事务,或 rollback() 回滚事务。适用于不集成 Spring 的原生 MyBatis 应用。 |
| MANAGED | 事务由外部容器(如 Spring、Java EE 容器)管理。MyBatis 不主动提交或回滚事务,而是将控制权交给容器。常用于 Spring 集成场景。 |
<transactionManager type="JDBC"/>
提示:若使用 Spring + MyBatis,通常设置为
MANAGED,并由 Spring 的声明式事务管理器(如@Transactional)统一控制。
3. <properties> + ${}:外部化配置与动态属性注入
为提高配置灵活性和安全性(如避免硬编码数据库密码),可将数据库连接信息抽离到外部 .properties 文件中。
步骤如下:
-
创建
jdbc.properties文件(通常放在resources目录下):jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC jdbc.username=root jdbc.password=123456 -
在
mybatis-config.xml中引入该属性文件:<properties resource="jdbc.properties"/> -
在
<dataSource>中使用${key}引用属性值<!--dataSource:配置数据源属性type:设置数据源的类型type="POOLED/UNPOOLED/JNDI"POOLED:表示使用数据库连接池缓存数据库连接UNPOOLED:表示不实用数据库连接池JNDI:表示使用上下文中的数据源--> <dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/> </dataSource>
优势:便于多环境部署(如 dev/test/prod 使用不同配置文件),提升安全性和可维护性。
4. <typeAliases>:类型别名配置
为减少 Mapper XML 文件中全限定类名的书写,可为 Java 类设置别名。
方式一:为单个类设置别名
<typeAlias type="com.zzz.pojo.User" alias="User"/>
- 若不指定
alias,默认别名为类名(首字母小写),且不区分大小写(如user、User、USER均可识别)。
方式二:为整个包下的所有类自动注册别名(推荐)
<package name="com.zzz.pojo"/>
- MyBatis 会扫描该包下所有类,自动以简单类名(不带包名) 作为别名,且不区分大小写。
- 例如:
com.zzz.pojo.User→ 别名为user(或User等)。
注意:若多个包中有同名类,可能会冲突,此时建议显式指定
alias或使用注解@Alias("xxx")。
5. <mappers>:映射文件注册
用于注册 Mapper 接口与对应的 XML 映射文件,使 MyBatis 能正确绑定 SQL 语句。
支持的注册方式:
| 方式 | 说明 |
|---|---|
<mapper resource="..."/> | 指定 XML 文件路径(相对于 classpath) |
<mapper class="..."/> | 指定 Mapper 接口全限定名(要求 XML 与接口同名同包) |
<package name="..."/> | 批量注册:自动扫描指定包下所有 Mapper 接口 |
使用 <package> 批量注册的要求(关键!):
-
Mapper 接口 与 XML 映射文件 必须:
- 位于相同的包路径下(即目录结构一致);
- 文件名完全相同(如
UserMapper.java对应UserMapper.xml)。
-
IDE 创建包时注意事项:
-
在 IDEA 中新建包时,应输入完整路径如
com/zzz/mapper(使用/分隔),而非一次性输入com.zzz.mapper作为一个“文件夹名”。 -
否则,IDE 可能将其视为单层目录,导致 MyBatis 无法正确加载 XML 文件,报错:
BindingException: Type interface ... is not known to the MapperRegistry.
-
示例配置:
<mappers><package name="com.atguigu.mybatis.mapper"/>
</mappers>
最佳实践:推荐使用
<package>方式,简洁高效,但务必确保接口与 XML 的位置和命名严格一致。
6、mybatis-config.xml文件汇总
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- MyBatis核心配置文件,标签的顺序properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?--><properties resource="jdbc.properties"></properties>
<!-- 设置类型别名,大小写不敏感。如果不设置alias,则默认为类名(大小写不敏感)--><typeAliases><!--typeAlias: 设置某个类型的别名属性:type 设置需要设置别名的类型alias 设置某个类型的别名,如果不设置该属性,那么该类型拥有默认的类名,且不区分大小写--><typeAlias type="com.atguigu.mybatis.pojo.User" alias="User"></typeAlias>
<!-- 以包为单位,将包下所有的类型设置默认的类型别名且不区分大小写--><package name="com.atguigu.mybatis.pojo"/></typeAliases><!--设置连接数据库的环境--> <environments default="development"><!--每一个environment都是具体连接数据库的环境--><!--一个项目中只会用一个环境,default用于使用默认使用的环境:id:表示连接数据库的环境的唯一标识 不能重复--><environment id="development">
<!--transactionmanager:设置事务管理方式属性:type="JDBC/MANAGED"JDBC: 在当前环境中,执行sql时,使用的时jdbc原声的事务管理方式,需要手动的提交和回滚事务MANAGED:被管理,例如Spring--><transactionManager type="JDBC"/><!-- dataSource:配置数据源属性"type:设置数据源的类型type=""POOLED:表示使用数据库连接池缓存数据库连接UNPOOLED:表示不实用数据库连接池JNDI:表示使用上下文中的数据源
--><dataSource type="POOLED"><!--设置连接数据库的驱动--><property name="driver" value="${jdbc.driver}"/><!--设置连接地址--><property name="url"value="${jdbc.url}"/><!--用户名和密码--><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment>
</environments><!--引入映射文件--> <mappers>
<!-- <mapper resource="mappers/UserMapper.xml"/>-->
<!-- BindingException: Type interface com.atguigu.mybatis.mapper.UserMapper is not known to the MapperRegistry.没有成功建立映射关系以包为单位引入映射文件,要求:1。 mapper接口所在的包要和映射文件所在的包一致2。 mapper接口要和映射文件的名字一致-->
<!-- com.atguigu.mybatis.mapper创建包时要用/分隔,这样才是目录,否则这整一个就只是文件夹名字而已--><package name="com.atguigu.mybatis.mapper"/></mappers>
</configuration>
四、设置文件模板
创建步骤

1、设置mybatis-config.xml配置文件模版
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties resource="jdbc.properties"></properties><typeAliases><package name=""></package></typeAliases><!--设置连接数据库的环境--><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url"value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--引入映射文件--><mappers><package name=""/></mappers>
</configuration>
2、设置xxxMapper.xml配置文件模版
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace=""></mapper>
创建完毕后我们就可以使用创建后的模板了。

