使用注解配置Mapper
前面章节中我们配置MyBatis的映射关系时都是使用的XML配置,这是最基础的一种配置方式,但编写XML文件比较繁琐,实际上对于比较简单的映射关系,我们还可以直接使用注解方式进行配置。
配置注解扫描
采用注解方式配置的Mapper由于没有Mapper XML,我们无法通过<mapper resource=""/>方式配置Mapper,这里需要将配置方式改为包扫描。mynatis-config.xml中,我们将<mappers>配置项改为下面形式。
<mappers>
<package name="com.gacfox.demo.mapper"/>
</mappers>
这样配置后,对应包下的Mapper接口类就能被MyBatis框架识别到了。
SQL注解
MyBatis提供了@Select、@Insert、@Delete、@Update注解分别用来执行查询、插入、删除、更新的SQL语句,对应XML配置中的标签。下面是一个使用注解配置Mapper的例子,该Mapper没有对应的XML文件。
package com.gacfox.demo.mapper;
import com.gacfox.demo.model.Role;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface RoleMapper {
@Select("SELECT role_id,rolename FROM t_role")
List<Role> selectAllRoles();
@Insert("INSERT INTO t_role (rolename) VALUES (#{rolename})")
void insertRole(String rolename);
}
这里SQL操作我们使用注解进行了配置,@Select中我们配置了一条查询语句,@Insert中我们配置了一条插入语句,写法和XML中相同。对于删除、更新操作也是类似的。
映射注解
除了SQL注解,我们还可以使用@Results和@Result注解,它们的作用类似XML配置中的<resultMap>,用来手动配置查询结果到Java对象的映射关系。
package com.gacfox.demo.mapper;
import com.gacfox.demo.model.Role;
import org.apache.ibatis.annotations.*;
import java.util.List;
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配置和注解配置的使用场景
通过上面介绍我们可以看到,注解配置十分简洁,它能够满足大部分使用场景,但相比XML配置它缺少一些细节上的功能,在一些特殊情况下可能无法满足我们的要求。实际开发中,两种方式是可以结合使用的,对于简单的单表增删改查,我们可以使用注解方式;对于比较复杂的SQL语句、关联查询和映射关系配置中,则推荐使用XML配置。