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。