为了账号安全,请及时绑定邮箱和手机立即绑定

Mybatis持久层框架入门教程

标签:
Java SSM 数据库
概述

Mybatis是一个优秀的持久层框架,它通过XML或注解的方式将SQL语句和Java代码分离,简化了数据访问层的开发。本文将详细介绍Mybatis持久层框架入门的相关内容,包括其基本概念、特点、应用场景以及核心配置等。

Mybatis简介
Mybatis的基本概念

Mybatis 是一个支持普通 SQL 查询、存储过程和高级映射的优秀持久层框架。它通过 XML 或注解的方式将 SQL 语句和 Java 代码分离。Mybatis 既解决了 JDBC 代码冗余的问题,又简化了数据访问层的开发,使得 Java 程序员能够以最小的代价将传统 DAO 层代码转换为 DAO 层的持久化对象。

Mybatis 的特点如下:

  • 简单易学:Mybatis 是一个非常易于上手的持久层框架。
  • 灵活的 SQL 语句:Mybatis 允许使用原始的 SQL 来执行查询,支持编写复杂的 SQL 语句。
  • 支持存储过程:可以使用存储过程来封装复杂的业务逻辑。
  • 支持高级映射:支持一对一、一对多、多对多的关联映射。
  • 支持自定义类型处理器:可以处理数据库的特殊类型。
  • 支持延迟加载:可以与第三方缓存框架结合使用,提高查询速度。
  • 配置简单:Mybatis 采用 XML 方式编写,配置文件易于维护。
Mybatis的优势和应用场景

Mybatis的优势

  • 减少数据库相关操作代码:Mybatis 通过 XML 或注解的方式将 SQL 语句和 Java 代码分离,降低了数据库操作的复杂度。
  • 支持复杂查询:Mybatis 支持复杂的 SQL 查询和存储过程,可以轻松地处理复杂的数据库操作。
  • 支持动态 SQL:Mybatis 提供了动态 SQL 的功能,可以根据不同的条件生成不同格式的 SQL 语句,提高了代码的灵活性。
  • 支持高级映射:Mybatis 支持一对一、一对多、多对多的关联映射,可以轻松地处理复杂的数据关系。
  • 支持自定义类型处理器:Mybatis 支持自定义类型处理器,可以处理数据库的特殊类型,如自定义的日期类型、枚举类型等。
  • 支持第三方缓存:Mybatis 支持与第三方缓存框架结合使用,可以提高查询速度,降低数据库压力。

Mybatis的应用场景

  • 需要复杂 SQL 语句处理的项目:例如商业智能系统、数据仓库系统等。
  • 需要动态 SQL 语句处理的项目:例如 CRM、ERP 系统等。
  • 需要高性能查询的项目:例如电子商务系统、金融系统等。
Mybatis的下载与集成

下载 Mybatis

Mybatis 的最新版本可以在其官方网站或 Maven 中央仓库中找到。以 Mybatis 3.5.7 版本为例,下载后,需要解压到指定目录,以方便后续的使用。

Mybatis的集成

Mybatis 的集成可以通过 Maven、Gradle 或者手动添加 JAR 包来完成。这里以 Maven 为例,以下是 Maven 的依赖配置:

<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
</dependencies>

手动添加 JAR 包的示例如下:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>
Mybatis核心配置
Mybatis核心配置文件详解

核心配置文件结构

Mybatis 的核心配置文件是一个 XML 文件,通常命名为 mybatis-config.xml。该配置文件主要包括以下几个部分:

  • 数据库环境配置:配置数据库连接信息。
  • 设置:配置 Mybatis 的运行环境。
  • 映射文件:配置映射文件的位置。
  • 类型别名:配置常用的类型别名。
  • 映射器:配置映射器的位置。

一个典型的 Mybatis 配置文件结构如下:

<?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.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

数据库环境配置

数据库环境配置包括数据库连接信息,具体如下:

<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
            <property name="username" value="root"/>
            <property name="password" value="123456"/>
        </dataSource>
    </environment>
</environment>

数据库连接池的使用

数据库连接池可以显著提升应用程序的性能和效率。Mybatis 支持多种数据库连接池,如 POOLEDJNDI 等。下面是一个使用 POOLED 连接池的示例:

<dataSource type="POOLED">
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
</dataSource>

其中 driverurlusernamepassword 分别表示数据库驱动类名、URL、用户名和密码。

设置部分

Mybatis 的运行环境配置可以通过 <settings> 标签进行设置,例如:

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

映射文件配置

映射文件通常定义在 mappers 标签中,如下:

<mappers>
    <mapper resource="com/example/mapper/UserMapper.xml"/>
</mappers>

类型别名配置

类型别名可以通过 <typeAliases> 标签进行配置,如下:

<typeAliases>
    <typeAlias alias="User" type="com.example.model.User"/>
    <typeAlias alias="Order" type="com.example.model.Order"/>
</typeAliases>
Mybatis映射文件解析
映射文件的基本结构

Mybatis 的映射文件定义了 SQL 语句的执行方式和结果集的映射关系。一个典型的映射文件结构如下:

<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUserById" resultType="com.example.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
    <insert id="insertUser">
        INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
    </insert>
    <update id="updateUser">
        UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
    </update>
    <delete id="deleteUserById">
        DELETE FROM user WHERE id = #{id}
    </delete>
</mapper>

SQL语句的编写与执行

Mybatis 支持 SELECTINSERTUPDATEDELETE 等基本 SQL 语句的编写与执行。

示例:插入用户信息

<insert id="insertUser">
    INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>

示例:更新用户信息

<update id="updateUser">
    UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>

示例:删除用户信息

<delete id="deleteUserById">
    DELETE FROM user WHERE id = #{id}
</delete>

结果集映射配置

Mybatis 支持结果集的自动映射,可以将查询结果映射到 Java 对象中。例如,以下 SQL 语句查询用户信息:

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

其中 resultType 属性指定了查询结果映射到哪个 Java 类。

复杂映射文件示例

示例:一对一映射

<resultMap id="User" type="com.example.model.User">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="age" property="age"/>
    <association property="address" javaType="com.example.model.Address">
        <id column="address_id" property="id"/>
        <result column="address_name" property="name"/>
    </association>
</resultMap>

<select id="selectUserWithAddress" resultMap="User">
    SELECT user.id, user.name, user.age, address.address_id, address.address_name
    FROM user
    LEFT JOIN address ON user.id = address.user_id
</select>

示例:一对多映射

<resultMap id="Order" type="com.example.model.Order">
    <id column="order_id" property="id"/>
    <result column="order_name" property="name"/>
    <collection property="items" javaType="java.util.List" ofType="com.example.model.Item">
        <id column="item_id" property="id"/>
        <result column="item_name" property="name"/>
    </collection>
</resultMap>

<select id="selectOrderWithItems" resultMap="Order">
    SELECT order.order_id, order.order_name, item.item_id, item.item_name
    FROM order
    LEFT JOIN item ON order.id = item.order_id
</select>
Mybatis CRUD操作
基本的增删改查操作

Mybatis 提供了丰富的 SQL 语句支持,可以轻松地实现增删改查操作。

示例:查询用户信息

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

示例:插入用户信息

<insert id="insertUser">
    INSERT INTO user (id, name, age) VALUES (#{id}, #{name}, #{age})
</insert>

示例:更新用户信息

<update id="updateUser">
    UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}
</update>

示例:删除用户信息

<delete id="deleteUserById">
    DELETE FROM user WHERE id = #{id}
</delete>
动态SQL的使用

Mybatis 提供了动态 SQL 的功能,可以根据不同的条件生成不同格式的 SQL 语句。动态 SQL 通过 <if><choose><when><otherwise> 等标签实现。

示例:动态SQL

<select id="selectUserByCondition" resultType="com.example.model.User">
    SELECT * FROM user WHERE 1=1
    <if test="id != null">
        AND id = #{id}
    </if>
    <if test="name != null">
        AND name = #{name}
    </if>
    <if test="age != null">
        AND age = #{age}
    </if>
</select>
批量操作与事务处理

Mybatis 支持批量操作,可以提高批量插入、更新和删除的效率。事务处理可以确保数据的一致性。

批量操作

List<User> users = new ArrayList<>();
users.add(new User(1, "Tom", 20));
users.add(new User(2, "Jerry", 25));
users.add(new User(3, "Bob", 22));
userMapper.insertBatch(users);

事务处理

try {
    sqlSession.beginTransaction();
    userMapper.insertUser(new User(1, "Tom", 20));
    userMapper.insertUser(new User(2, "Jerry", 25));
    sqlSession.commit();
} catch (Exception e) {
    sqlSession.rollback();
    e.printStackTrace();
}
Mybatis与Spring集成
Spring与Mybatis整合的基本方法

Spring 与 Mybatis 的整合可以通过 Mybatis 的 SqlSessionFactorySqlSessionTemplate 实现。以下是一个简单的整合示例:

@Configuration
public class MybatisConfig {
    @Bean
    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource());
        return factoryBean.getObject();
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        return dataSource;
    }
}
Mybatis的自动扫描与配置

Spring 支持 Mybatis 的自动扫描与配置,可以通过 MapperScannerConfigurer 实现。以下是一个简单的配置示例:

@Configuration
public class MybatisAutoScanConfig {
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        return factoryBean;
    }

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.example.mapper");
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
        return mapperScannerConfigurer;
    }
}
Mybatis的接口方式调用

Spring 支持 Mybatis 的接口方式调用,可以通过 MapperFactoryBean 实现。以下是一个简单的接口示例:

public interface UserMapper {
    User selectUserById(int id);
    void insertUser(User user);
    void updateUser(User user);
    void deleteUserById(int id);
}
Mybatis的高级用法
分页查询

分页查询可以通过 Mybatis 的插件机制实现。以下是一个简单的插件示例:

@Override
public Object plugin(Object target) {
    return Plugin.wrap(target, new PageInterceptor());
}

@Override
public void setProperties(Properties properties) {
    this.properties = properties;
}
缓存机制

Mybatis 支持一级缓存和二级缓存,可以提高查询速度,降低数据库压力。

一级缓存

一级缓存是 SqlSession 级别的缓存,每个 SqlSession 中都内置了一个缓存,用于缓存查询结果。当同一个 SqlSession 内部执行相同的查询语句时,会优先从缓存中获取数据,如果缓存中没有,再去数据库中查询。

二级缓存

二级缓存是 Mapper 级别的缓存,用于所有 SqlSession 之间的数据共享,可以缓存同一 Mapper 中的多个 SqlSession 的查询结果。二级缓存默认是关闭的,需要在配置文件中开启。

<cache/>
扩展插件使用

Mybatis 支持扩展插件机制,可以在 SQL 语句执行前后插入自定义的代码。以下是一个简单的插件示例:

@Override
public Object plugin(Object target) {
    return Plugin.wrap(target, new PerformanceInterceptor());
}

@Override
public void setProperties(Properties properties) {
    this.properties = properties;
}

插件可以通过 @Intercepts 注解指定插桩的目标。

@Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})})
public class PerformanceInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = invocation.proceed();
        long end = System.currentTimeMillis();
        System.out.println("执行时间:" + (end - start));
        return result;
    }
}

插件可以通过 @Signature 注解定义插桩的方法和参数。

以上是 Mybatis 的高级用法,包括分页查询、缓存机制和扩展插件使用。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消