使用注解配置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配置。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。