Mybatis简介

本文详细介绍了MyBatis框架的基本使用流程,包括环境搭建、配置文件解析、动态SQL运用及缓存机制。深入探讨了SqlSessionFactory、SqlSession及Mapper的生命周期管理,适合初学者快速上手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、入门

1、导入mybatis相关jar包
2、获取 SqlSession。


通过 SqlSessionFactoryBuilder 获取到 SqlSessionFactory,然后再通过 SqlSessionFactory 获取到 SqlSession。


2-1、获取 SqlSessionFactoryBuilder 的两种方式

1、xml配置获取

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

2、java代码获取

//构建数据库连接池, POOLED:这是JDBC连接对象的数据源连接池的实现,用来避免创建新的连接实例时必要的初始连接和认证时间
        PooledDataSource dataSource = new PooledDataSource();
        dataSource.setDriver("oracle.jdbc.OracleDriver");
        dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        //事务方式
        TransactionFactory transactionFactory = new JdbcTransactionFactory();

        //运行环境
        Environment environment = new Environment("development", transactionFactory, dataSource);

        //构建Configuration对象
        Configuration configuration = new Configuration(environment);

        //注册一个mybatis上下文别名
        configuration.getTypeAliasRegistry().registerAlias("person", Person.class);

        //加入一个映射器
        configuration.addMapper(PersonMapper.class);//sql通过注解方式,而不是xml方式

        //使用sqlsessionFactoryBuild构建sqlsessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

        return sqlSessionFactory;

注解sql mapper接口代码:

public interface PersonMapper2 {
    @Select("SELECT * FROM PERSON WHERE id = #{id}")
    Person2 selectByPrimaryKey(Integer id);
}

通过xml配置,mapper类只是个接口,具体sql在xml文件中; 

2-2、获取SqlSession

SqlSession session = sqlSessionFactory.openSession();
try {
  PersonMapper mapper = session.getMapper(PersonMapper.class);
  PersonMapper person = mapper.selectByPrimaryKey(1);
} finally {
  session.close();
}

3、对象的生命周期

SqlSessionFactoryBuilder:

这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。

SqlSessionFactory:

SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏味道(bad smell)”。因此 SqlSessionFactory 的最佳作用域是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

SqlSession:

每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。

映射器实例(Mapper Instances):

映射器是一个你创建来绑定你映射的语句的接口。映射器接口的实例是从 SqlSession 中获得的。因此从技术层面讲,任何映射器实例的最大作用域是和请求它们的 SqlSession 相同的。尽管如此,映射器实例的最佳作用域是方法作用域。也就是说,映射器实例应该在调用它们的方法中被请求,用过之后即可废弃。并不需要显式地关闭映射器实例,尽管在整个请求作用域(request scope)保持映射器实例也不会有什么问题,但是很快你会发现,像 SqlSession 一样,在这个作用域上管理太多的资源的话会难于控制。所以要保持简单,最好把映射器放在方法作用域(method scope)内。

  PersonMapper mapper = session.getMapper(PersonMapper.class);

二、xml配置

xm可以l配置的内容如下:

1、propeties:属性配置

<properties resource="org/mybatis/example/config.properties">
  <property name="username" value="dev_user"/>
  <property name="password" value="F2Fa3!33TYyg"/>
</properties>

如上引入了属性,下面的配置就可以直接引用config.properties中的值了

<dataSource type="POOLED">
  <property name="driver" value="${driver}"/>
  <property name="url" value="${url}"/>
  <property name="username" value="${username}"/>
  <property name="password" value="${password}"/>
</dataSource>

2、settings

如设置缓存、懒加载等

<settings>
  <setting name="cacheEnabled" value="true"/>
  <setting name="lazyLoadingEnabled" value="true"/>
</settings>

3、environments(环境配置)

<environments default="development"><!--默认的环境 ID-->
  <environment id="development"><!--每个 environment 元素定义的环境 ID-->
    <transactionManager type="JDBC"><!--事务管理器的配置-->
      <property name="..." value="..."/>
    </transactionManager>
    <dataSource type="POOLED"><!--数据源的配置-->
      <property name="driver" value="${driver}"/>
      <property name="url" value="${url}"/>
      <property name="username" value="${username}"/>
      <property name="password" value="${password}"/>
    </dataSource>
  </environment>
</environments>

事务管理器(transactionManager):
在 MyBatis 中有两种类型的事务管理器(也就是 type=”[JDBC|MANAGED]”):
JDBC – 这个配置就是直接使用了 JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 默认情况下它会关闭连接
注意:如果你正在使用 Spring + MyBatis,则没有必要配置事务管理器, 因为 Spring 模块会使用自带的管理器来覆盖前面的配置

数据源(dataSource):
有三种内建的数据源类型(也就是 type=”[UNPOOLED|POOLED|JNDI]”):
UNPOOLED– 这个数据源的实现只是每次被请求时打开和关闭连接。
POOLED– 这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来,避免了创建新的连接实例时所必需的初始化和认证时间。 这是一种使得并发 Web 应用快速响应请求的流行处理方式。
JNDI – 这个数据源的实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
可以配置多数据源,然后使用SqlSessionFactory build(不同的参数)来实现不同的数据源环境;

4、映射器(mappers)

<!-- 使用相对于类路径的资源引用 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
</mappers>

三、Mapper XML 文件

SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):
cache – 给定命名空间的缓存配置。
cache-ref – 其他命名空间缓存配置的引用。
resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
sql – 可被其他语句引用的可重用语句块。
insert – 映射插入语句
update – 映射更新语句
delete – 映射删除语句
select – 映射查询语句

四、动态sql

1、if

<select id="findActiveBlogWithTitleLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  WHERE state = ‘ACTIVE’ 
  <if test="title != null">
    AND title like #{title}
  </if>
</select>

2、choose (when, otherwise)

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
    <when test="title != null">
      AND title like #{title}
    </when>
    <when test="author != null and author.name != null">
      AND author_name like #{author.name}
    </when>
    <otherwise>
      AND featured = 1
    </otherwise>
  </choose>
</select>

3、where, set

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  <where> 
    <if test="state != null">
         state = #{state}
    </if> 
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>

where 元素只会在至少有一个子元素的条件返回 SQL 子句的情况下才去插入“WHERE”子句。而且,若语句的开头为“AND”或“OR”,where 元素也会将它们去除。

4、foreach

五、mybatis缓存

1、一级缓存
一级缓存是指SqlSession。一级缓存的作用域是一个SqlSession。Mybatis默认开启一级缓存。
2、二级缓存
二级缓存是指mapper映射文件。二级缓存的作用域是同一个namespace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存。

<setting name="cacheEnabled" value="true" />

3、自定义缓存

3-1、自定义缓存类实现mybatis提供的Cache 接口
3-2、需要在mybatis的配置文件里手动设置缓存可用

<setting name="cacheEnabled" value="true"/>

3-3、在对应的mapper里设置我们想用的自定义缓存类

<cache type="org.mybatis.caches.redis.RedisCache"/>

 

 

 

 

### MyBatis框架简介 MyBatis 是一款优秀的持久层框架,其核心功能在于支持定制化的 SQL 查询、存储过程以及高级映射[^3]。它能够显著减少 JDBC 编码量,消除手动设置参数和获取结果集的过程。通过简单的 XML 配置或者注解方式,MyBatis 可以将 Java 接口和 POJO 映射为数据库中的记录。 #### 功能特点 - **SQL 定制化**:允许开发者编写自定义的 SQL 语句,满足复杂查询需求。 - **动态 SQL 支持**:提供强大的动态 SQL 构建能力,可以根据条件生成不同的 SQL 语句。 - **映射机制**:通过 XML 或者注解实现 Java 对象与数据库表之间的映射关系。 - **缓存支持**:内置一级缓存(Session 级别),并可扩展二级缓存提升性能。 - **事务管理**:集成 JDBC 的事务处理逻辑,简化开发难度。 --- ### 工作原理详解 MyBatis 的工作流程主要分为以下几个阶段: 1. **配置解析** - MyBatis 初始化时会加载全局配置文件 `mybatis-config.xml` 和 Mapper 文件。这些文件包含了数据源信息、事务管理器配置以及 SQL 映射规则等内容[^5]。 2. **构建 SqlSessionFactory** - 使用 `SqlSessionFactoryBuilder` 解析配置文件后生成 `SqlSessionFactory` 实例。该实例负责创建后续所需的 `SqlSession` 对象[^5]。 3. **创建 SqlSession** - 每次执行数据库操作前都需要打开一个新的 `SqlSession`。它是 MyBatis 提供的一个轻量级对象,封装了底层 JDBC 连接池的功能,并提供了增删改查方法接口[^4]。 4. **SQL 封装与执行** - 当调用某个 DAO 方法时,MyBatis 会根据传入的方法名匹配对应的 Mapper 中声明的 SQL 节点。随后利用反射技术提取输入参数值替换占位符位置形成完整的 SQL 文本[^1]。 - 执行完毕之后再依据返回的数据结构自动转换为目标类型的实体类列表或其他形式的结果集合[^1]。 5. **结果映射** - 数据库查询得到 ResultSet 后交由 ResultHandler 处理,按照预先设定好的字段对应关系逐一赋值给目标 Bean 属性完成最终的对象组装过程[^3]。 以下是典型的代码示例展示如何初始化 MyBatis 并执行 CRUD 操作: ```java // 加载配置文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); try (SqlSession session = sqlSessionFactory.openSession()) { // 获取Mapper代理对象 UserMapper mapper = session.getMapper(UserMapper.class); // 插入一条新纪录 int result = mapper.insertUser(new User()); } catch(Exception e){ System.out.println(e.getMessage()); } ``` --- ### 总结 综上所述,MyBatis 不仅具备高度灵活性还拥有良好的兼容性和扩展性,在实际项目中被广泛应用于中小型系统的快速搭建当中[^4]。通过对原生 JDBC API 的抽象封装极大地方便了程序猿们日常编码作业的同时也保留了一定程度上的自由度去应对各种特殊场景下的业务诉求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值