手记

Mybatis持久层框架教程:入门与实践

概述

Mybatis持久层框架教程将带你深入了解Mybatis的工作原理和使用方法,包括环境搭建、基本用法、动态SQL以及与Spring的集成。文章详细介绍了Mybatis的各种特性和应用场景,帮助你高效地完成数据库操作。

Mybatis持久层框架教程:入门与实践
Mybatis简介

Mybatis是什么

Mybatis是一个优秀的持久层框架,它支持定制化SQL查询,存储过程和高级映射。Mybatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。Mybatis可以使用XML配置文件或者注解来配置和映射原始类型、接口和Java POJO(Plain Old Java Object,普通的Java对象)为数据库中的记录。

Mybatis的优点和适用场景

  • 简单易用:Mybatis提供了简单的API,使得开发人员可以快速地完成数据库的操作。
  • 高效:Mybatis使用了动态SQL,可以在运行时动态生成SQL语句,避免了硬编码SQL的麻烦和错误。
  • 灵活:Mybatis允许用户编写自己的SQL语句,可以使用XML或注解来映射查询结果,可以根据需要灵活地自定义SQL。
  • 易于维护:Mybatis的SQL语句和Java代码分离,使得SQL语句易于维护和调整。
  • 适用于中小型项目:对于中小型项目,Mybatis提供了足够的灵活性和性能,可以满足项目的需求。

适用场景:

  • 当项目需要高度自定义SQL时。
  • 当项目对性能有较高要求,需要手动优化SQL时。
  • 当项目规模中等,需要灵活控制数据库操作时。

Mybatis与JDBC的区别

  • JDBC 是Java提供的标准数据库连接接口,用于执行SQL语句并处理查询结果。它需要手动处理SQL语句的执行和结果集的解析。JDBC的代码通常包含大量的SQL字符串拼接,这容易导致SQL注入攻击和维护困难。

  • Mybatis 则是基于JDBC的持久层框架,提供了更高级的抽象来处理数据库操作。它通过配置文件或注解来管理和执行SQL语句,可以将结果集映射到Java对象,减少了硬编码SQL的麻烦。此外,Mybatis还支持动态SQL和存储过程的调用,提高了开发效率和代码的可维护性。
Mybatis环境搭建

开发环境准备

在开始之前,确保你已经安装了Java开发环境和一个IDE(如IntelliJ IDEA或Eclipse)。此外,还需要一个数据库环境(如MySQL或PostgreSQL)和数据库客户端(如MySQL Workbench或pgAdmin)。具体步骤如下:

  1. 安装Java环境。
  2. 安装并配置IDE。
  3. 安装数据库,并创建数据库表。例如,创建一个名为user的表:
CREATE TABLE `user` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(50) NOT NULL,
  `password` VARCHAR(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建Mybatis项目

  1. 创建一个新的Java项目,并将项目命名为mybatis-tutorial
  2. 在项目中添加Mybatis依赖。如果你使用Maven,可以在pom.xml文件中添加如下依赖:
<dependencies>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.26</version>
    </dependency>
</dependencies>
  1. 创建一个数据库表,用于测试Mybatis的功能。以下是一个简单的SQL脚本,用于创建一个名为user的表:
CREATE TABLE `user` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(50) NOT NULL,
  `password` VARCHAR(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

配置Mybatis核心配置文件

Mybatis的核心配置文件通常命名为mybatis-config.xml,它位于项目的resources目录下。配置文件示例如下:

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

此配置文件定义了数据库连接信息以及数据源类型。其中,<mapper>标签用于将SQL映射文件与配置文件关联。

Mybatis基本用法

SQL映射文件

SQL映射文件用于定义SQL语句和对应的Java对象映射。通常,映射文件的命名方式为{EntityName}Mapper.xml,比如UserMapper.xml

下面是一个UserMapper.xml的示例:

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

{ }和${ }的区别

在Mybatis中,#{}${}都是用于替换SQL语句中的参数,但是它们的使用场景和处理方式有所不同。

  • #{}:这是Mybatis的占位符,用于预编译SQL语句中的参数。它会将参数类型转换为SQL类型,并防止SQL注入攻击。
<select id="selectById" resultType="com.example.model.User">
    SELECT * FROM user WHERE id = #{id}
</select>
  • ${}:这是JDBC的占位符,用于直接插入SQL语句中的参数。这种方式直接将参数值插入到SQL语句中,容易导致SQL注入攻击。
<select id="selectById" resultType="com.example.model.User">
    SELECT * FROM user WHERE id = ${id}
</select>

持久化操作(增删改查)

持久化操作包括插入、更新、删除和查询操作。下面是一些示例代码:

public class UserMapper {
    private SqlSessionFactory sqlSessionFactory;

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

    public User selectById(int id) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            return session.selectOne("com.example.mapper.UserMapper.selectById", id);
        }
    }

    public void insertUser(User user) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            session.insert("com.example.mapper.UserMapper.insertUser", user);
            session.commit();
        }
    }

    public void updateUser(User user) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            session.update("com.example.mapper.UserMapper.updateUser", user);
            session.commit();
        }
    }

    public void deleteUserById(int id) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            session.delete("com.example.mapper.UserMapper.deleteUserById", id);
            session.commit();
        }
    }
}
Mybatis动态SQL

Mybatis支持通过XML标签动态生成SQL语句,这使得SQL语句更加灵活。常见的动态SQL标签包括<if><choose><when><otherwise><foreach>等。

if条件判断

<if>标签用于根据条件生成SQL片段。以下是示例代码:

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

choose/when/otherwise选择

<choose><when><otherwise>标签用于生成多条件分支的SQL语句。以下是示例代码:

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

foreach循环

<foreach>标签用于生成循环的SQL片段,通常用于批量插入或查询。以下是示例代码:

<insert id="insertUsers" parameterType="list">
    INSERT INTO user (username, password) VALUES
    <foreach item="user" index="index" collection="list"
             open="(" separator="),(" close=")">
        #{user.username}, #{user.password}
    </foreach>
</insert>
Mybatis高级特性

结果集处理(嵌套结果映射)

Mybatis支持嵌套结果映射,可以将一行数据映射为多个Java对象。例如,User对象可能有一个Address对象的属性。具体的使用场景如下:

<resultMap id="UserWithAddress" type="com.example.model.User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <association property="address" javaType="com.example.model.Address">
        <id property="id" column="address_id"/>
        <result property="street" column="street"/>
        <result property="city" column="city"/>
        <result property="state" column="state"/>
        <result property="zip" column="zip"/>
    </association>
</resultMap>

<select id="selectUserWithAddress" resultMap="UserWithAddress">
    SELECT u.id, u.username, a.id as address_id, a.street, a.city, a.state, a.zip
    FROM user u
    LEFT JOIN address a ON u.id = a.user_id
</select>

分页查询

Mybatis支持分页查询,可以通过RowBounds类实现。具体使用方法如下:

public List<User> selectUsersWithPagination(int offset, int limit) {
    try (SqlSession session = sqlSessionFactory.openSession()) {
        return session.selectList("com.example.mapper.UserMapper.selectUsersWithPagination", null, new RowBounds(offset, limit));
    }
}

第三方插件的使用

Mybatis支持通过插件来扩展功能。插件的工作原理是替换Mybatis的默认执行器,以在执行SQL之前或之后进行额外的操作。具体插件实现如下:

示例插件代码:

@Intercepts({
    @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
})
public class MyPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 在执行SQL之前的操作
        System.out.println("Before executing SQL");
        Object result = invocation.proceed();
        // 在执行SQL之后的操作
        System.out.println("After executing SQL");
        return result;
    }
}

mybatis-config.xml中配置插件:

<plugins>
    <plugin interceptor="com.example.plugin.MyPlugin">
        <!-- 插件配置 -->
    </plugin>
</plugins>

通过以上介绍和示例,你已经了解了如何使用Mybatis进行持久层开发。Mybatis提供了丰富的功能来简化数据库操作,同时也保持了足够的灵活性,使得开发者可以编写高效的数据库访问代码。希望这篇文章能帮助你更好地理解和使用Mybatis。

0人推荐
随时随地看视频
慕课网APP