一、Results的用法

用法一: 当数据库字段名与实体类对应的属性名不一致时,可以使用@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();
  1. 用法二:当@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)
  1. 用法三:需要通过查询到的字段去查询另外一个方法,将查询结果作为本次查询的一个属性
  • @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不能被识别

mybatis result set 内存没回收 mybatis @result_bc

二、@ResultMap的用法

@ResultMap注解的使用,其实就是引用已定义好的@Results

@ResultMap:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface ResultMap {
    String[] value();
}

参考文章参考文章