Mappers:Mybatis框架中的关键组件

发布时间:2023-05-23

一、Mapper介绍

Mapper作为Mybatis框架中的一个关键组件,用于定义与数据库交互的方法。在Mybatis中,Mapper需要定义在XXXMapper.xml文件中,并对应于一个Java接口。 XXXMapper.xml文件主要包括两部分内容:Mybatis配置信息和SQL语句。其中,Mybatis配置信息包括数据源信息、事务管理器、全局配置、对象工厂、插件等配置,SQL语句主要包括select、insert、update、delete等操作,使用XML标签定义。 Java接口中定义了Mapper中所需要的方法,每个方法对应一个在XXXMapper.xml文件中定义的SQL语句,并且使用注解或XML标签对方法进行配置。例如,使用@Select注解定义一个select操作:

@Select("SELECT * FROM users WHERE id = #{id}")
User getUserById(int id);

二、Mapper的分类

Mapper主要分为两种类型:基于XML配置的Mapper和基于注解的Mapper。

1、基于XML配置的Mapper

基于XML配置的Mapper是Mybatis最初的实现方式,通过定义XML文件实现Java代码与SQL语句的分离。每个Mapper接口对应一个XML文件,其中Mapper接口中的每个方法对应XML文件中的一个SQL语句。 例如,在StudentMapper.xml文件中定义查询所有学生信息的SQL语句:

<select id="selectAllStudents" resultmap="student">
    SELECT * FROM students
</select>

对应的Java接口中定义selectAllStudents方法,并使用@Select注解指定该方法对应的SQL语句:

@Select("selectAllStudents")
List<Student> selectAllStudents();

2、基于注解的Mapper

基于注解的Mapper是Mybatis的扩展实现方式,在Mapper接口中直接使用注解定义SQL语句,省去了XML文件的编写。相比XML配置方式,基于注解的Mapper更加简洁明了。 例如,使用@Select注解查询所有学生信息:

@Select("SELECT * FROM students")
List<Student> selectAllStudents();

三、Mappers的作用

在Mybatis中,Mappers扮演着非常重要的角色,可以提高代码的可维护性和重用性。

1、解耦Java代码和SQL语句

Mappers的最主要作用就是将Java代码和SQL语句解耦,使Java代码更加简洁、易于维护。 例如,在Java代码中,使用@Select注解查询学生信息:

@Select("SELECT * FROM students WHERE id = #{id}")
Student selectStudentById(int id);

虽然注解使用了SQL语句,但是Java代码本身并没有涉及到SQL语句,维护起来更加方便。

2、提高代码的重用性

由于Mappers的存在,多个Java类可以共享同一个Mapper的方法,实现代码重用,减少工作量。 例如,在StudentMapper接口中定义查询所有学生信息的方法,可以在不同的Java类中调用:

public class ClassA {
    @Autowired
    private StudentMapper studentMapper;
    public List<Student> getAllStudents() {
        return studentMapper.selectAllStudents();
    }
}
public class ClassB {
    @Autowired
    private StudentMapper studentMapper;
    public List<Student> getAllStudents() {
        return studentMapper.selectAllStudents();
    }
}

3、简化操作

使用Mappers可以简化操作,减少代码量。例如,使用Mybatis中的动态SQL可以根据条件拼接SQL语句,省去手动拼接SQL语句的繁琐过程。 例如,在StudentMapper中定义查询学生信息的方法,根据不同的条件拼接SQL语句:

@SelectProvider(type = StudentSqlProvider.class, method = "selectStudents")
List<Student> selectStudents(Map<String, Object> paramMap);

其中,StudentSqlProvider类中定义了根据条件查询学生信息的方法:

public String selectStudents(Map<String, Object> paramMap) {
    // 根据参数动态拼接SQL语句,返回拼接完成的SQL语句
    return "SELECT * FROM students WHERE 1 = 1" + generateDynamicSQL(paramMap);
}

四、Mappers的注解介绍

Mybatis提供了丰富的注解,用于配置Mapper中的方法,以下是常用注解介绍。

1、@Select

用于配置查询操作的SQL语句。例如:

@Select("SELECT * FROM students WHERE id = #{id}")
Student selectStudentById(int id);

2、@Insert

用于配置插入操作的SQL语句。例如:

@Insert("INSERT INTO students (name, age, sex) VALUES (#{name}, #{age}, #{sex})")
int insertStudent(Student student);

3、@Update

用于配置更新操作的SQL语句。例如:

@Update("UPDATE students SET name = #{name}, age = #{age}, sex = #{sex} WHERE id = #{id}")
int updateStudent(Student student);

4、@Delete

用于配置删除操作的SQL语句。例如:

@Delete("DELETE FROM students WHERE id = #{id}")
int deleteStudentById(int id);

5、@Result

用于定义SQL查询结果与Java对象的映射关系。例如:

@Results(id = "student", value = {
    @Result(column = "id", property = "id", id = true),
    @Result(column = "name", property = "name"),
    @Result(column = "age", property = "age"),
    @Result(column = "sex", property = "sex")
})

五、总结

Mappers是Mybatis框架中的关键组件,用于定义与数据库交互的方法,将Java代码和SQL语句解耦,提高代码的可维护性和重用性。Mappers分为基于XML配置的Mapper和基于注解的Mapper两种类型。除此之外,Mappers还可以简化操作,减少代码量。Mybatis提供了丰富的注解,用于配置Mapper中的方法。