我们可以通过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>
值得注意的是,指定构造方法后,若此字段被填入了构造方法作为参数,将不会通过反射给字段单独赋值,而构造方法中没有传入的字段,依然会被反射赋值。
0 条评论