MyBatis 简介

201 阅读2分钟

MyBatis 简介

MyBatis 是一个优秀的持久层框架,它简化了传统的 DAO 层的 SQL 操作。MyBatis 通过 XML 或注解的方式将 SQL 语句与 Java 对象进行映射,极大地减少了代码量和开发难度。

MyBatis 的主要功能

1. 简化 SQL 操作:MyBatis 通过映射文件或注解的方式,将 SQL 语句与 Java 对象进行映射,简化了传统的 DAO 层的开发。2. 动态 SQL:MyBatis 支持动态 SQL,可以根据条件动态生成 SQL 语句,极大地提高了 SQL 的灵活性。3. 缓存机制:MyBatis 提供了一级缓存和二级缓存机制,提高了数据库访问的性能。4. 插件机制:MyBatis 提供了插件机制,可以在 SQL 执行的各个阶段进行拦截,进行自定义操作。

MyBatis 的使用方式

MyBatis 提供了两种主要的使用方式:注解方式和 XML 映射文件方式。

1. 注解方式

注解方式通过在接口方法上添加注解来实现 SQL 语句的映射。以下是一个示例:


import com.itheima.demoquickstart.pojo.Emp;

import org.apache.ibatis.annotations.*;

import java.time.LocalDate;

import java.util.List;

@Mapper

public interface EmpMapper {

    @Delete("DELETE FROM emp WHERE id = #{id}")

    void delete(Integer id);

    @Options(useGeneratedKeys = true, keyProperty = "id")

    @Insert("INSERT INTO emp (username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +

            "VALUES (#{username}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})")

    void insert(Emp emp);

    @Update("UPDATE emp SET username=#{username}, name=#{name}, gender=#{gender}, image=#{image}, job=#{job}, entrydate=#{entrydate}, dept_id=#{deptId}, update_time=#{updateTime} WHERE id=#{id}")

    void update(Emp emp);

    @Select("SELECT id, username, password, name, gender, image, job, entrydate, " +

            "dept_id AS deptId, create_time AS createTime, update_time AS updateTime " +

            "FROM emp " +

            "WHERE id=#{id}")

    Emp getById(Integer id);

    List<Emp> list(@Param("name") String name, 

                   @Param("gender") Short gender, 

                   @Param("begin") LocalDate begin, 

                   @Param("end") LocalDate end);

}

2. XML 映射文件方式

XML 映射文件方式通过在 XML 文件中定义 SQL 语句,并将其与接口方法进行映射。以下是一个示例:



<!DOCTYPE mapper

  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.itheima.demoquickstart.mapper.EmpMapper">

    <select id="list" resultType="com.itheima.demoquickstart.pojo.Emp">

        SELECT * FROM emp

        <where>

            <if test="name != null">

                AND name LIKE CONCAT('%', #{name}, '%')

            </if>

            <if test="gender != null">

                AND gender = #{gender}

            </if>

            <if test="begin != null and end != null">

                AND entrydate BETWEEN #{begin} AND #{end}

            </if>

        </where>

        ORDER BY update_time DESC

    </select>

    <insert id="insert" parameterType="com.itheima.demoquickstart.pojo.Emp">

        INSERT INTO emp (username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time)

        VALUES (#{username}, #{password}, #{name}, #{gender}, #{image}, #{job}, #{entrydate}, #{deptId}, #{createTime}, #{updateTime})

    </insert>

    <update id="update" parameterType="com.itheima.demoquickstart.pojo.Emp">

        <script>

            UPDATE emp

            <set>

                <if test="username != null">username = #{username},</if>

                <if test="password != null">password = #{password},</if>

                <if test="name != null">name = #{name},</if>

                <if test="gender != null">gender = #{gender},</if>

                <if test="image != null">image = #{image},</if>

                <if test="job != null">job = #{job},</if>

                <if test="entrydate != null">entrydate = #{entrydate},</if>

                <if test="deptId != null">dept_id = #{deptId},</if>

                update_time = #{updateTime}

            </set>

            WHERE id = #{id}

        </script>

    </update>

    <select id="getById" resultType="com.itheima.demoquickstart.pojo.Emp">

        SELECT id, username, password, name, gender, image, job, entrydate, dept_id AS deptId, create_time AS createTime, update_time AS updateTime

        FROM emp

        WHERE id = #{id}

    </select>

</mapper>

动态 SQL

MyBatis 支持动态 SQL,可以根据条件动态生成 SQL 语句。动态 SQL 主要通过 <if>, <choose>, <when>, <otherwise>, <trim>, <where>, <set> 等标签来实现。

动态 SQL 示例

以下是一个动态 SQL 的示例:


    SELECT * FROM emp

    <where>

        <if test="name != null">

            AND name LIKE CONCAT('%', #{name}, '%')

        </if>

        <if test="gender != null">

            AND gender = #{gender}

        </if>

        <if test="begin != null and end != null">

            AND entrydate BETWEEN #{begin} AND #{end}

        </if>

    </where>

    ORDER BY update_time DESC

</select>

总结

MyBatis 是一个强大的持久层框架,通过注解和 XML 映射文件的方式简化了 SQL 操作。它支持动态 SQL,可以根据条件动态生成 SQL 语句,极大地提高了 SQL 的灵活性。通过 MyBatis,可以更极大地提高了 SQL 的灵活性。通过 MyBatis,可以更高效地进行数据库操作,减少代码量,提高开发效率