MyBatis 的简介(1)

104 阅读3分钟

MyBatis 的优点

1. 简化 SQL 操作:通过注解和 XML 映射文件的方式,简化了传统的 DAO 层的 SQL 操作。
2. 动态 SQL:支持动态 SQL,可以根据条件动态生成 SQL 语句,极大地提高了 SQL 的灵活性。
3. 缓存机制:提供了一级缓存和二级缓存机制,提高了数据库访问的性能。
4. 插件机制:提供了插件机制,可以在 SQL 执行的各个阶段进行拦截,进行自定义操作。
5. 易于集成:与 Spring 框架无缝集成,方便进行事务管理和依赖注入。

示例总结

以下是一个完整的示例,展示了如何使用 MyBatis 进行增删改查操作,并结合动态 SQL:

EmpMapper 接口


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);
}

EmpMapper.xml 映射文件

<!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>

Emp 类


import java.time.LocalDate;
import java.time.LocalDateTime;

public class Emp {
    private Integer id;   // 主键
    private String username;  // 用户名
    private String password;  // 密码
    private String name;  // 姓名
    private Short gender; // 性别
    private String image; // 图像
    private Short job;    // 职位
    private LocalDate entrydate; // 入职时间
    private Integer deptId; // 部门ID
    private LocalDateTime createTime; // 创建时间
    private LocalDateTime updateTime; // 修改时间

    // 生成 getter 和 setter 方法
    // ...
}

测试类


import com.itheima.demoquickstart.mapper.EmpMapper;
import com.itheima.demoquickstart.pojo.Emp;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@SpringBootTest
class DemoQuickstartApplicationTests {

    @Autowired
    private EmpMapper empMapper;

    @Test
    public void testInsert() {
        // 创建员工对象
        Emp emp = new Emp();
        emp.setUsername("jack");
        emp.setName("杰克");
        emp.setImage("1.jpg");
        emp.setGender((short) 1);
        emp.setJob((short) 1);
        emp.setEntrydate(LocalDate.of(2000, 1, 1));
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        emp.setDeptId(1);

        // 调用添加方法
        empMapper.insert(emp);

        // 输出插入的员工信息
        System.out.println("插入的员工信息: " + emp);
        System.out.println("部门ID: " + emp.getDeptId());
    }

    @Test
    public void testList() {
        // 假设要查询的条件
        String name = null;
        Short gender = 1;
        LocalDate begin = null;
        LocalDate end = null;

        // 调用查询方法
        List<Emp> empList = empMapper.list(name, gender, begin, end);

        // 输出查询的员工信息
        empList.forEach(emp -> System.out.println("查询的员工信息: " + emp));
    }

    @Test
    public void testUpdate() {
        // 创建员工对象
        Emp emp = new Emp();
        emp.setId(1); // 假设要更新的员工ID为1
        emp.setUsername("jack_updated");
        emp.setName("杰克更新");
        emp.setImage("1_updated.jpg");
        emp.setGender((short) 1);
        emp.setJob((short) 1);
        emp.setEntrydate(LocalDate.of(2000, 1, 1));
        emp.setUpdateTime(LocalDateTime.now());
        emp.setDeptId(1);

        // 调用更新方法
        empMapper.update(emp);

        // 输出更新的员工信息
        System.out.println("更新的员工信息: " + emp);
    }

    @Test
    public void testGetById() {
        // 假设要查询的员工ID为1
        Integer id = 1;

        // 调用查询方法
        Emp emp = empMapper.getById(id);

        // 输出查询的员工信息
        System.out.println("查询的员工信息: " + emp);
    }
}

      

}

总结

通过以上示例,我们可以看到 MyBatis 如何通过注解和 XML 映射文件的方式简化 SQL 操作,并支持动态 SQL。MyBatis 提供了强大的功能和灵活性,使得数据库操作更加高效和简洁。希望这些内容能帮助你更好地理解和使用 MyBatis。