一、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中的方法。