MyBatis 结果集映射
类型别名
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
结果集映射流程
resultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
本质原理类型于直接使用SQL的AS关键字
<select id="getUserById" parameterType="int" resultType="com.alsritter.pojo.User">
select name as username,pwd as password from users where id = #{id};
</select>
<resultMap id="UserMap" type="com.alsritter.pojo.User">
<!--column:数据库中的字段,property:实体类中的属性-->
<!--本质就是指定映射-->
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserById" parameterType="int" resultMap="UserMap">
select * from users where id = #{id};
</select>
当 pojo 里面是对象时
<resultMap id="blogResult" type="Blog">
<!-- 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能 -->
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
<!-- association – 一个复杂类型的关联;许多结果将包装成这种类型 -->
<association javaType="Author" property="author">
<id property="id" column="author_id"/>
<result property="username" column="author_username"/>
<result property="password" column="author_password"/>
<result property="email" column="author_email"/>
<result property="bio" column="author_bio"/>
</association>
</resultMap>
使用注解的方式
参考资料 Spring Boot 实战 —— MyBatis(注解版)使用方法
也可以用在 @Results 中使用 id 来标识一个映射关系,然后可以用 @ResultMap 复用这个映射关系:
@Select("SELECT * FROM users")
@Results(id = "user", value = {
@Result(property = "userSex", column = "user_sex"),
@Result(property = "nickName", column = "nick_name")
})
@Select("SELECT * FROM users WHERE id = #{id}")
List<UserEntity> getAll();
@ResultMap("user")
@Select("SELECT * FROM users WHERE id = #{id}")
UserEntity getUserById(Integer id);
结果集映射到 Bean
如果数据库返回的字段名和数据元的字段名称相同,且 没有复杂的类型,则可以直接把结果集映射到一个数据元上(JavaBean)
这个也是默认的方式
@Data@ToString@AllArgsConstructor@NoArgsConstructor
public class User {
private int id;
private String name;
private String pwd;
}
public interface UserMapper {
//根据id查询用户
User getUserById(int id);
}
<select id="getUserById" parameterType="int" resultType="com.alsritter.pojo.User">
select * from users where id = #{id};
</select>
@Test
public void test(){
try(SqlSession sqlSession = MyBatisUtils.getSqlSession()) {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User userById = mapper.getUserById(1);
System.out.println(userById);
}
}