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

Mybatis持久层框架项目实战:入门与初级教程

概述

本文深入讲解了Mybatis持久层框架项目实战的各个方面,包括环境搭建、基本使用、动态SQL的应用、与Spring的整合以及高级特性。通过实际项目案例,进一步展示了如何在实际开发中应用这些技术。文中详细介绍了配置、代码实现、关键概念和操作步骤,帮助读者全面掌握Mybatis持久层框架项目实战。

Mybatis 持久层框架项目实战:入门与初级教程
Mybatis 简介与环境搭建

Mybatis 是什么

Mybatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。Mybatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。Mybatis 可以使用简单的 XML 或注解进行配置和原始映射,将接口和 Java 的 POJO 传递给任意类型的关系数据库,并且它支持自定义 SQL、存储过程以及高级映射。

Mybatis 的核心概念

  • SqlSessionFactory:Mybatis 的工厂类,用于创建 SqlSession 对象。
  • SqlSession:用于执行数据库操作,可以理解为一个轻量级的数据库会话。
  • Configuration:配置类,包含了 Mybatis 的所有配置信息,如数据源、事务管理器、环境配置等。
  • Mapper:映射器接口,用于定义数据库操作的接口方法。

开发环境设置

IDE 配置

选择一个合适的开发环境,如 IntelliJ IDEA 或 Eclipse,并安装必要的插件,如 Lombok 插件。

依赖引入

在项目的 pom.xml 文件中引入 Mybatis 和其他必要的依赖:

<dependencies>
    <!-- Mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
    <!-- MySQL Driver -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>
    <!-- Junit for testing -->
    <dependency>
        <groupId>junit</groupId>
       . . .
</dependencies>
Mybatis 的基本使用

配置数据源和数据库连接

在 Mybatis 中,你需要配置数据源和数据库连接。这通常在 mybatis-config.xml 文件中完成。

<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/mydb"/>
                . . .
            </dataSource>
        </environment>
    </environments>
</configuration>

映射文件的编写

映射文件定义了 SQL 语句和 Java 方法之间的映射关系。例如,下面是一个简单的映射文件(UserMapper.xml):

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

CRUD 操作的实现

创建(Insert)

创建一个新的用户:

<insert id="insertUser" parameterType="com.example.model.User">
    INSERT INTO user (name, email) VALUES (#{name}, #{email})
</insert>

读取(Select)

查询用户信息:

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

更新(Update)

更新用户信息:

<update id="updateUser" parameterType="com.example.model.User">
    UPDATE user SET name = #{name}, email = #{email} WHERE id = #{id}
</update>

删除(Delete)

删除用户:

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

if 标签

if 标签用于条件判断,如果条件为真,则包含的内容将被包含在最终的 SQL 语句中。

<select id="selectUser" resultType="com.example.model.User">
    SELECT * FROM user WHERE 1=1
    <if test="name != null">
        AND name = #{name}
    </if>
    <if test="email != null">
        AND email = #{email}
    </if>
</select>

choose 标签

choose 标签类似于 Java 中的 switch 语句,用来选择一个条件。

<select id="selectUser" resultType="com.example.model.User">
    SELECT * FROM user WHERE 1=1
    <choose>
        <when test="id != null">
            AND id = #{id}
        </when>
        <when test="name != null">
            AND name = #{name}
        </when>
        <otherwise>
            AND email = #{email}
        </otherwise>
    </choose>
</select>

foreach 标签

foreach 标签用于遍历集合中的元素。常用于处理 IN 条件。

<select id="selectUsersByIds" resultType="com.example.model.User">
    SELECT * FROM user WHERE id IN
    <foreach item="item" index="index" collection="ids" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>

其他常用标签介绍

  • trim 标签可以添加前缀和后缀,通常用于动态 SQL 的拼接。
  • where 标签可以自动处理 SQL 语句的 WHERE 关键字。
  • set 标签可以自动处理 SQL 语句的 SET 关键字。
<update id="updateUser" parameterType="com.example.model.User">
    UPDATE user
    <set>
        <if test="name != null">name = #{name},</if>
        <if test="email != null">email = #{email},</if>
    </set>
    WHERE id = #{id}
</update>
Mybatis 与 Spring 的整合

Spring 与 Mybatis 整合的必要性

Spring 和 Mybatis 的整合可以使得 Mybatis 的配置和数据库操作更加简洁和灵活。Spring 可以管理 Mybatis 的数据源和 SqlSessionFactory 的生命周期,简化代码的维护。

Spring 配置文件的编写

在 Spring 的配置文件中,需要配置数据源、SqlSessionFactory 和 Mapper 接口的扫描。

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
    <property name="username" value="root"/>
    <property name="password" value="password"/>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations" value="classpath*:mapper/*.xml"/>
</bean>

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.example.mapper"/>
</bean>

Mybatis 与 Spring 事务管理

在 Spring 中配置事务管理,可以使用 AOP 和 Spring 的事务管理器来管理 Mybatis 的事务。

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

使用注解配置事务

在 Mapper 接口的方法上使用 @Transactional 注解来配置事务。

import org.springframework.transaction.annotation.Transactional;

@Transactional
public interface UserMapper {
    @Override
    void updateUser(User user);

    @Override
    void deleteUserById(int id);
}
Mybatis 的高级特性

分页查询

Mybatis 提供了自定义 SQL 的方式来实现分页查询。使用 RowBounds 类来实现分页。

public List<User> getUsersByPage(int offset, int limit) {
    return sqlSession.selectList("com.example.mapper.UserMapper.getUsersByPage", new RowBounds(offset, limit));
}

结果集的延迟加载

Mybatis 支持延迟加载,可以在需要的时候加载数据,减少不必要的查询。

<resultMap id="UserResultMap" type="com.example.model.User">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="email" property="email"/>
    <association property="address" javaType="com.example.model.Address" select="selectAddressById" column="addressId" fetchType="lazy"/>
</resultMap>

二级缓存的配置与使用

Mybatis 的二级缓存可以提高查询性能,需要在配置文件中开启缓存。

<cache-refresher class="com.example.cache.CacheRefresher"/>
<cache>
    <type>PER_CLASS</type>
    <flushInterval>1000</flushInterval>
    <size>1000</size>
    <blocking/>
</cache>
实战项目案例

实际项目需求分析

假设我们正在开发一个简单的图书管理系统,需要支持添加、删除、查询图书信息。整个项目需要支持数据库操作,并且需要具备分页查询和延迟加载的功能。

项目结构设计

项目结构如下:

mybatis-demo
│
├── src
│   ├── main
│   │   ├── java
│   │   │   ├── com
│   │   │   │   ├── example
│   │   │   │   │   ├── BookService.java
│   │   │   │   │   ├── BookServiceImpl.java
│   │   │   │   │   ├── BookMapper.java
│   │   │   │   │   ├── BookMapper.xml
│   │   │   │   │   └── config
│   │   │   │   │       └── MybatisConfig.java
│   │   │   └── resources
│   │   │       ├── mapper
│   │   │       │   └── BookMapper.xml
│   │   │       └── mybatis-config.xml
│   └── test
│       └── java
│           └── com
│               └── example
│                   └── BookServiceTest.java
├── pom.xml
└── README.md

关键代码实现与解析

Mybatis 配置文件

<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/bookdb"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mapper/BookMapper.xml"/>
    </mappers>
</configuration>

Mapper 接口

package com.example;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

@Mapper
public interface BookMapper {
    @Select("SELECT * FROM book WHERE id = #{id}")
    Book selectBookById(int id);
}

Mapper XML 文件

<mapper namespace="com.example.BookMapper">
    <select id="selectBookById" resultType="com.example.Book">
        SELECT * FROM book WHERE id = #{id}
    </select>
</mapper>

服务层实现

package com.example;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

public class BookServiceImpl implements BookService {
    private SqlSessionFactory sqlSessionFactory;

    public BookServiceImpl(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    @Override
    public Book getBookById(int id) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            BookMapper mapper = session.getMapper(BookMapper.class);
            return mapper.selectBookById(id);
        }
    }
}

分页查询

public List<Book> getBooksByPage(int offset, int limit) {
    try (SqlSession session = sqlSessionFactory.openSession()) {
        BookMapper mapper = session.getMapper(BookMapper.class);
        return mapper.selectBooksByPage(offset, limit);
    }
}

延迟加载


<resultMap id="BookResultMap" type="com.example.Book">
    <id column="id" property="id"/>
    <result column="title" property="title"/>
    <result column="author" property="author"/>
    <association property="publisher" javaType="com.example.Publisher" select="selectPublisherById" column="publisherId" fetchType="lazy"/>
</resultMap>
``

通过以上步骤,我们完成了 Mybatis 的基本使用、动态 SQL 的应用、Mybatis 与 Spring 的整合以及 Mybatis 的高级特性。希望这篇文章能帮助你更好地理解和使用 Mybatis。
点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消