我们可以通过namespace来绑定到一个接口上,利用接口的特性,可以直接指明方法的行为,而实际实现则是由Mybatis来完成。

我们可以直接将映射器的命名空间修改为我们的接口,一般将接口和映射器文件放在一起:

<mapper namespace="com.test.mapper.TestMapper">
    <select id="selectStudent" resultType="Student">
        SELECT * FROM STUDENT
    </select>
</mapper>

resultType表示SQL语句的结果返回到什么Java类型里,这里可以使用别名(如果类定义了别名的话)。使用resultType时,MyBatis 会在幕后自动创建一个 ResultMap,再根据属性名来映射列到 JavaBean 的属性上。如果列名和属性名不能匹配上,可以在 SELECT 语句中设置列别名(这是一个基本的 SQL 特性)来完成匹配。

<select id="selectUsers" resultType="User">
  select
    user_id             as "id",
    user_name           as "userName",
    hashed_password     as "hashedPassword"
  from some_table
  where id = #{id}
</select>

这样定义映射器后,我们就需要修改一下配置文件中的mapper定义,使用resource而不是url

<mappers>
    <mapper resource="com/test/mapper/TestMapper.xml"/>
</mappers>

接口名称作为命名空间后,接口内的方法声明就作为每个SQL语句id,这样可以通过调用接口的某个方法来实现SQL语句。

public interface TestMapper {
    List<Student> selectStudent();
}

// 通过接口
public static void main(String[] args) {
    try (SqlSession sqlSession = MybatisUtil.getSession(true)){
        TestMapper testMapper = sqlSession.getMapper(TestMapper.class);
        List<Student> student = testMapper.selectStudent();
        student.forEach(System.out::println);
    }
}

这是使用resource实现映射器的方法。

结果映射(ResultMap)

resultMap 元素是 MyBatis 中最重要最强大的元素。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。resultMap的功能比resultType更强大,它是一个显示配置。

<resultMap id="Test" type="Student">
    <result column="sid" property="sid"/>
    <result column="sex" property="name"/>
    <result column="name" property="sex"/>
</resultMap>

resultMap有一个id,表示名称,可以在SQL语句中指定只用哪个resultMap。type为指定的Java类型,这表示将SQL查询的结果返回到什么类型中去,而具体的返回细节还可以再详细设定。
result属性中column表示SQL结果表中的某一列,property表示将该列值赋给Java类的某个字段。

结果映射

  • id - 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
  • result - 注入到字段或 JavaBean 属性的普通结果
  • constructor - 用于在实例化类时,注入结果到构造方法中
    • idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能
    • arg - 将被注入到构造方法的一个普通结果
  • collections - 一个复杂类型的集合
  • association - 一个复杂类型的关联;许多结果将包装成这种类型

id标签用于在多条记录中辨别是否为同一个对象的数据,即表中有一列数据存在多条记录相等的情况,那么就可以id将它们映射为一个Java对象,而不是多个。

当没有指定constructor构造方法时,MyBatis会根据result和id的设定来进行映射。如果选择了constructor,那么MyBatis会根据所选择构造方法来进行处理。

<resultMap id="test" type="Student">
    <constructor>
        <arg column="sid" javaType="Integer"/>
        <arg column="name" javaType="String"/>
    </constructor>
</resultMap>

值得注意的是,指定构造方法后,若此字段被填入了构造方法作为参数,将不会通过反射给字段单独赋值,而构造方法中没有传入的字段,依然会被反射赋值。

分类: Mybatis

0 条评论

发表评论

邮箱地址不会被公开。