MyBatis简单介绍

Mybatis是一个流行的持久层框架,它简化了数据库操作的编写,提供了灵活的SQL映射和参数处理机制。
今天从MyBatis框架的基本概念、核心功能和用法开始学习。

基本概念:

1. Mapper接口:定义数据库操作的方法。

public interface UserMapper {
    User selectUserById(int id);
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(int id);
}

示例中,UserMapper接口定义了selectUserById、insertUser、updateUser和deleteUser等数据库操作的方法。这些方法的具体实现将由MyBatis框架根据Mapper接口与SQL映射文件的配置来完成。

在实际应用中,我们可以通过SqlSession对象获取Mapper接口的实现类,然后调用Mapper接口中定义的方法来执行数据库操作。通过Mapper接口的使用,可以更加方便地管理数据库操作,并实现Java方法与SQL操作的关联。

// 获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();

// 获取Mapper接口的实现类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 调用Mapper接口的方法执行数据库操作
User user = userMapper.selectUserById(1);

// 关闭SqlSession
sqlSession.close();

2. SQL映射文件:存储SQL语句和参数映射信息。

SQL映射文件是MyBatis框架中用于定义SQL语句和参数映射关系的XML文件。在SQL映射文件中,你可以编写SQL语句,并定义参数映射关系,以便MyBatis能够将Java对象和数据库表进行映射。

以下是一个简单的SQL映射文件示例:

<?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.example.mapper.UserMapper">
  
  <!-- 定义查询用户信息的SQL语句 -->
  <select id="selectUserById" parameterType="int" resultType="com.example.model.User">
    SELECT * FROM users WHERE id = #{id}
  </select>
  
  <!-- 定义插入用户信息的SQL语句 -->
  <insert id="insertUser" parameterType="com.example.model.User">
    INSERT INTO users (id, name, email) VALUES (#{id}, #{name}, #{email})
  </insert>
  
  <!-- 定义更新用户信息的SQL语句 -->
  <update id="updateUser" parameterType="com.example.model.User">
    UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
  </update>
  
  <!-- 定义删除用户信息的SQL语句 -->
  <delete id="deleteUser" parameterType="int">
    DELETE FROM users WHERE id = #{id}
  </delete>
  
</mapper>

示例中,SQL映射文件中包含了查询、插入、更新和删除用户信息的SQL语句。每个SQL语句都有一个唯一的id,指定了方法名,参数类型和返回结果类型。通过SQL映射文件,可以将Java对象和数据库操作进行有效的映射,实现数据的CRUD操作。

接下来我们具体说一说SQL映射文件的一些重要内容:

1. 命名空间(namespace)

SQL映射文件中的命名空间用于唯一标识该映射文件,通常是Mapper接口的全限定名。

<mapper namespace="com.example.mapper.UserMapper">
    <!-- SQL语句和参数映射定义 -->
</mapper>

2. SQL语句定义

在SQL映射文件中可以定义各种SQL语句,如查询、插入、更新、删除等操作。

<select id="selectUserById" parameterType="int" resultType="com.example.model.User">
    SELECT * FROM users WHERE id = #{id}
</select>

3. 参数映射

可以使用#{}语法将Java对象中的属性值映射到SQL语句中,MyBatis会根据参数映射替换相应的值。

4. 结果映射

通过resultTyperesultMap定义结果映射,将查询结果映射为Java对象或基本类型。

5. 动态SQL

MyBatis支持动态SQL,可以根据条件动态拼接SQL语句,避免冗余的代码。

<select id="selectUserByCondition" parameterType="com.example.model.User" resultType="com.example.model.User">
    SELECT * FROM users
    <where>
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
</select>

3. SqlSessionFactory:工厂类,用于创建SqlSession对象。

SqlSessionFactory是MyBatis框架中的一个重要接口,它代表了一个数据库会话工厂,负责创建和管理SqlSession对象,是MyBatis与数据库交互的入口。

1. 创建SqlSessionFactory

  • 通常通过SqlSessionFactoryBuilder来构建SqlSessionFactory对象。SqlSessionFactoryBuilder是一个用于构建SqlSessionFactory的构建器类。

2. SqlSessionFactory的作用

  • SqlSessionFactory负责创建SqlSession对象,SqlSession是与数据库交互的主要会话对象。
  • SqlSessionFactory还负责管理数据库连接、事务等资源,确保数据库操作的正确性和性能。

3. SqlSessionFactory的生命周期

  • SqlSessionFactory通常是一个应用程序中的单例对象,其创建和销毁一般由应用程序来管理。
  • 在应用程序启动时创建SqlSessionFactory,并在应用程序关闭时销毁,确保SqlSessionFactory的生命周期与应用程序保持一致。

4. 配置SqlSessionFactory

  • 配置SqlSessionFactory通常需要包括数据库连接信息、映射文件的位置、缓存配置等。
  • SqlSessionFactory的配置可以通过XML配置文件或Java代码方式进行。

示例代码如下所示:

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

示例中,通过读取mybatis-config.xml配置文件并使用SqlSessionFactoryBuilder构建了SqlSessionFactory对象。通过SqlSessionFactory对象可以获取SqlSession,进而执行数据库操作。

4. SqlSession:与数据库交互的会话对象。

SqlSession是MyBatis框架中的一个重要接口,它代表了与数据库交互的会话对象。SqlSession提供了执行SQL语句、提交事务、获取Mapper接口等功能,是MyBatis框架与数据库交互的主要入口。

1. 功能特点
  • 执行SQL语句:通过SqlSession可以执行数据库的查询、插入、更新、删除等操作。
  • 事务管理:SqlSession支持事务的控制,可以提交事务或回滚事务。
  • 缓存管理:SqlSession内部维护了一级缓存,可以提高数据库查询的性能。
  • 获取Mapper接口:通过SqlSession可以获取Mapper接口的实现类,执行数据库操作。
2. 获取SqlSession
  • 通常可以通过SqlSessionFactory来获取SqlSession对象,SqlSessionFactory是用于创建SqlSession对象的工厂类。
  • SqlSession对象在使用完成后需要手动关闭,确保资源释放和事务处理。
3. 执行SQL操作
  • 通过SqlSession的方法如selectOne、selectList、insert、update、delete等来执行SQL操作。
  • 在执行SQL操作时,可以传入参数和获取返回结果,实现与数据库的交互。
4. 事务管理
  • SqlSession支持事务的管理,可以手动提交事务或回滚事务。
  • 通过调用commit方法提交事务,调用rollback方法回滚事务。
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
    // 执行查询操作
    User user = sqlSession.selectOne("com.example.mapper.UserMapper.selectUserById", 1);
    System.out.println(user);

    // 执行插入操作
    sqlSession.insert("com.example.mapper.UserMapper.insertUser", newUser);
    
    // 提交事务
    sqlSession.commit();
} catch (Exception e) {
    // 发生异常时回滚事务
    sqlSession.rollback();
} finally {
    // 关闭SqlSession
    sqlSession.close();
}

核心功能

1. SQL映射

通过SQL映射文件定义SQL语句和参数映射,实现与数据库的交互。

2. 参数处理

支持各种参数传递方式,如基本类型、对象、集合等。
在MyBatis框架中,参数处理是指将Java方法的参数与SQL语句中的参数进行映射和处理的过程。MyBatis提供了多种方式来处理参数,包括基本类型、对象、集合等。以下是一些常用的参数处理方式:

1. 基本类型参数

可以直接在SQL语句中使用基本类型的参数,使用#{}语法进行参数占位符的替换。

<select id="selectUserById" parameterType="int" resultType="com.example.model.User">
    SELECT * FROM users WHERE id = #{id}
</select>

2. 对象参数

可以将Java对象作为参数传递给SQL语句,MyBatis会自动映射对象的属性到SQL语句中。

<select id="selectUserByInfo" parameterType="com.example.model.User" resultType="com.example.model.User">
    SELECT * FROM users WHERE name = #{name} AND age = #{age}
</select>
  1. Map参数:可以使用Map作为参数传递给SQL语句,Map中的key会与SQL语句中的占位符匹配。
<select id="selectUserByMap" parameterType="java.util.Map" resultType="com.example.model.User">
    SELECT * FROM users WHERE name = #{name} AND age = #{age}
</select>

4. 集合参数

可以传递集合类型作为参数,如List、Array等,MyBatis会自动处理集合中的元素映射到SQL语句中。

<select id="selectUsersByIdList" parameterType="java.util.List" resultType="com.example.model.User">
    SELECT * FROM users WHERE id IN
    <foreach item="id" collection="list" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

3. 动态SQL

支持动态SQL语句的构建,根据条件灵活拼接SQL。

4. 缓存机制

提供一级缓存和二级缓存,提升数据库操作性能。
MyBatis框架提供了两级缓存机制,用于提高数据库访问性能。

一级缓存(Local Cache):
  • 作用:一级缓存是SqlSession级别的缓存,即在同一个SqlSession中执行的查询结果会被缓存起来,可以减少重复查询数据库的次数。
  • 使用方法:一级缓存是MyBatis默认开启的,无需额外配置,它会在SqlSession生命周期内缓存查询结果。
  • 注意事项:一级缓存是SqlSession级别的,当SqlSession关闭后缓存失效;如果在同一个SqlSession中执行了插入、更新、删除等修改操作,会导致一级缓存失效。
二级缓存(Global Cache):
  • 作用:二级缓存是Mapper级别的缓存,即多个SqlSession共享同一个Mapper接口的缓存,可以减少跨SqlSession的重复查询。
  • 使用方法:需要在MyBatis配置文件中开启二级在Mapper缓存,并接口的映射文件中配置 <cache/> 标签来启用二级缓存。
  • 注意事项:需要注意二级缓存的缓存策略、过期时间等配置,以避免缓存数据过期或不一致的情况。

以下是一个简单的配置示例,用于开启二级缓存和在Mapper接口中启用缓存:

<!-- MyBatis配置文件 -->
<configuration>
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
</configuration>

<!-- Mapper接口映射文件 -->
<mapper namespace="com.example.mapper.UserMapper">
    <cache/>
    <!-- 其他SQL语句配置 -->
</mapper>

通过合理配置和使用一级缓存和二级缓存,可以有效提高数据库访问性能,减少重复查询,加快数据访问速度。

5. 事务管理: 支持事务的控制,保证数据操作的原子性和一致性。

事务管理是数据库操作中非常重要的一部分,它确保了数据库操作的一致性和完整性。
在MyBatis框架中,事务管理主要通过SqlSession来实现。以下是关于事务管理的一些重要信息:

1. 事务的概念

  • 事务是一组数据库操作,要么全部成功提交,要么全部失败回滚,保证数据库操作的一致性和完整性。

2. 事务的特性(ACID)

  • 原子性(Atomicity):事务是一个不可分割的工作单元,要么全部执行成功,要么全部失败回滚。
  • 一致性(Consistency):事务执行前后数据库的一致性约束不会被破坏。
  • 隔离性(Isolation):多个事务并发执行时,彼此不会影响,每个事务应该感觉不到其他事务的存在。
  • 持久性(Durability):事务一旦提交,其结果应该是永久性的,不会丢失。

3. 在MyBatis中管理事务

  • MyBatis通过SqlSession来管理事务,可以通过以下方法控制事务的提交和回滚:
    • commit():提交事务,将事务中的操作永久保存到数据库。
    • rollback():回滚事务,撤销事务中的操作,数据库恢复到事务开始之前的状态。

4. 事务的控制

  • 在MyBatis中,可以通过SqlSession的commit()rollback()方法来手动控制事务的提交和回滚。
  • 可以使用自动提交模式(默认为false),在每次执行SQL语句后自动提交事务。

示例代码如下所示:

SqlSession sqlSession = sqlSessionFactory.openSession();
try {
    // 执行数据库操作
    // ...
    
    // 提交事务
    sqlSession.commit();
} catch (Exception e) {
    // 发生异常时回滚事务
    sqlSession.rollback();
} finally {
    // 关闭SqlSession
    sqlSession.close();
}

用法

  1. 配置:创建SqlSessionFactory对象,配置数据源、映射文件等。
  2. SQL映射:编写SQL映射文件,定义SQL语句和参数映射。
  3. Mapper接口:定义Mapper接口,与SQL映射文件对应,提供数据库操作的方法。
  4. 调用:通过SqlSession对象获取Mapper接口的实现类,调用方法执行数据库操作。

总的来说,MyBatis框架通过SQL映射、参数处理和灵活的SQL构建机制,简化了数据库操作的编写过程,提高了开发效率。

  • 22
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值