前面章节中我们配置MyBatis的映射关系时都是使用的XML配置,这是最基础的一种配置方式,但编写XML文件比较繁琐,实际上对于比较简单的映射关系,我们还可以直接使用注解的方式进行配置。我们这里还是以SpringBoot工程为例进行介绍。
MyBatis提供了@Select
、@Insert
、@Delete
、@Update
注解分别用来执行查询、插入、删除、更新的SQL语句,对应XML配置中的标签。下面是一个使用注解配置Mapper的例子,该Mapper没有对应的XML文件。
package com.gacfox.demomb.dao;
import com.gacfox.demomb.model.Role;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface RoleMapper {
@Select("select role_id as roleId, rolename from t_role")
List<Role> selectAllRoles();
@Insert("insert into t_role (rolename) values (#{rolename})")
void insertRole(String rolename);
}
代码中,我们在接口上增加了@Mapper
注解,这能让MyBatis为其生成代理Bean供注入使用。而真正的SQL操作我们也同样使用注解进行了配置,@Select
中我们配置了一条查询语句,@Insert
中我们配置了一条插入语句,写法和XML中相同。对于删除、更新操作也是类似的。
除了SQL注解,我们还可以使用@Results
和@Result
注解,它们的作用类似XML配置中的<resultMap>
,用来手动配置查询结果到Java对象的映射关系。
package com.gacfox.demomb.dao;
import com.gacfox.demomb.model.Role;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface RoleMapper {
@Select("select role_id, rolename from t_role")
@Results(id = "roleMap", value = {
@Result(column = "role_id", property = "roleId", javaType = Long.class),
@Result(column = "rolename", property = "rolename", javaType = String.class)
})
List<Role> selectAllRoles();
@Insert("insert into t_role (rolename) values (#{rolename})")
void insertRole(String rolename);
}
代码中我们在selectAllRoles()
方法上标注了@Results
和@Result
注解,将查询结果集映射到Role
类的对应字段上。
通过上面介绍我们可以看到,注解配置十分简洁,能够满足大部分使用场景,但相比XML配置它缺少一些细节上的功能,在一些特殊情况下可能无法满足我们的要求。实际开发中,两种方式是可以结合使用的:对于简单的单表增删改查,我们可以使用注解方式;对于比较复杂的SQL语句、关联查询和映射关系配置中,则推荐使用XML配置。