用法一: 当数据库字段名与实体类对应的属性名不一致时,可以使用@Results映射来将其对应起来。column为数据库字段名,porperty为实体类属性名,jdbcType为数据库字段数据类型,id为是否为主键
@Select("select id, name, class_id from student”)
@Results({
//column为数据库字段名,porperty为实体类属性名,jdbcType为数据库字段数据类型,id为是否为主键
@Result(column=“id”, property=“id”, jdbcType=JdbcType.INTEGER, id=true),
@Result(column=“name”, property=“name”, jdbcType=JdbcType.VARCHAR),
@Result(column=“class_id”, property=“classId”, jdbcType=JdbcType.INTEGER)
})
List selectAll();
- 用法二:当@results这段代码需要在多个方法中用到时,为了提高代码复用性,可以为@results指定id,然后使用@resultMap注解来复用这段代码(通过id匹配)
@Select("select id, name, class_id from student")
@Results(id="studentMap",value={
@Result(column=“id”, property=“id”, jdbcType=JdbcType.INTEGER, id=true),
@Result(column=“name”, property=“name”, jdbcType=JdbcType.VARCHAR),
@Result(column=“class_id”, property=“classId”, jdbcType=JdbcType.INTEGER)
})
List selectAll();
@Select("select id, name, class_id from student”
" where id = #{id}")
@resultMap("studentMap")
student getStudent (@param("id") long id)
- 用法三:需要通过查询到的字段去查询另外一个方法,将查询结果作为本次查询的一个属性
- @one表示一对一:如下面的属性,studentMate类型为Student,查询studentMate的方法查询出一个
- @many表示一对多:students类型为List,查询students的方法查询出多个
----student的属性
public class Student {
private Integer id;
private String name;
private String classId;
//查询自己班的同学(一对一)
private List<Student> students;
//查询自己的同桌(通过自己的id可以查询出同桌的信息)(一对多)
private Student studentMate;
}
@Select("SELECT * " +
" FROM student " +
" WHERE id = #{id} ")
@Results(id=“studentMap”,
value={
@Result(column=“id”, property=“id”,id=true),
@Result(column=“{id = ID}”, property=“studentMate”, //将查询到结果映射到java属性studentMate
//这里要写的是子查询的路径,而不是sql语句,同时,子查询可以复用父查询的colum参数
one=@One(select=“com.example.DemoDao.selectMetaById”))
})
//查询出自己信息的同时查询出同桌的信息
Student selectInfoAndMeta(@param("id") long id);
-------------------------------------------------------------------------------------------------------------------
@Select("SELECT * " +
" FROM student " +
" WHERE id = #{id} ")
@Results(id=“studentMap”,
value={
@Result(column=“id”, property=“id”,id=true),
@Result(column=“{id = ID}”, property=“students”,//将查询到结果映射到java属性students
//这里要写的是子查询的路径,而不是sql语句。@Many中常用的属性只有selet,用于指定关联查询的方法
many=@many(select=“com.example.DemoDao.selectAllById”))
})
//查询出自己信息的同时查询出全班的信息
Student selectInfoAndAll(@param("id") long id);
传递多个参数时:@Result(column=“{id = ID,name = NAME}”, property=“***”)
----这个是重点----
等号右侧的ID和NAME是查出来的数据,分别赋给selectAllById方法中的id和name参数,去查询对应的信息(右边赋值给左边)
重点注意:@Results需要和@Select结合,不然单独的@Results不能被识别
二、@ResultMap的用法
@ResultMap注解的使用,其实就是引用已定义好的@Results
@ResultMap:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface ResultMap {
String[] value();
}
参考文章参考文章