当前位置: 首页 > news >正文

【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特性

  1. MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
  2. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
  3. MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
  4. 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日志功能

  1. 加入依赖

    <!-- log4j日志 -->
    <dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
    </dependency>
    
  2. 加入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 文件中。

步骤如下:
  1. 创建 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
    
  2. mybatis-config.xml 中引入该属性文件

    <properties resource="jdbc.properties"/>
    
  3. <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,默认别名为类名(首字母小写),且不区分大小写(如 userUserUSER 均可识别)。
方式二:为整个包下的所有类自动注册别名(推荐)
<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> 批量注册的要求(关键!):
  1. Mapper 接口XML 映射文件 必须:

    • 位于相同的包路径下(即目录结构一致);
    • 文件名完全相同(如 UserMapper.java 对应 UserMapper.xml)。
  2. 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>

创建完毕后我们就可以使用创建后的模板了。

在这里插入图片描述

http://www.dtcms.com/a/589347.html

相关文章:

  • Spring AI Alibaba 提示词入门:从零开始掌握AI对话技巧
  • AI 实战篇:用 LangGraph 串联 RAG+MCP Server,打造能直接操控 Jira 的智能体
  • 爱丽丝的人偶
  • 一个网站里面只放一个图片怎么做的交互式网站有哪些功能
  • 永川区门户网站建设轨迹开发流程管理
  • web中间件——Nginx
  • 读诗的时候我却使用了自己研发的Chrome元素截图插件
  • MyBatis框架如何处理字符串相等的判断条件
  • 搭建网站需要程序WordPress中文替换布
  • 【云运维】Python基础(一)
  • 自己动手造轮子:用Requests和线程池构建一个轻量级高并发爬虫框架
  • 养生网站策划成都行业网站建设那里好
  • 网站设计 韩国做一个模板网站多少钱
  • 【QT笔记】信号和槽
  • 农村电子商务网站建设wordpress4.9.4 安装
  • 【MATLAB第120期】基于MATLAB的SOBOL全局敏感性分析模型运用插件(含UI界面)
  • 【Rust 探索之旅】Rust 核心特性完全指南:所有权、生命周期与模式匹配从入门到精通
  • 2023年INS SCI2区,演化状态驱动的多群体合作粒子群算法用于复杂优化问题,深度解析+性能实测
  • 淮北市网站制作公司网页设计怎么样
  • 平面网站设计公司logo形象墙
  • AG32 系列MCU集成了CPLD,有何优势呢
  • 37.关注推送
  • iis网站重定向设置微信公众号页面设计模板
  • Go的GRPC框架:Kitex
  • 从Webpack迁移到Rspack
  • 导购分享网站模板了解宿迁建设网站
  • 基于springboot+vue的物流管理系统的设计与实现(源码+论文+部署+安装)
  • (* IOB=“true“ *)
  • 脚本复习--高精度空转(Xenium、CosMx)的细胞邻域分析(R版本)
  • 单链表队列