前言 本着更深入地使用注解来开发,慢慢地发现脱离了XML的MyBatis好多好多的坑。我觉得很大的原因还是来自于官方文档的不完善,以及使用注解开发持久层的人并不多见,导致网络上的相关讨论过于贫瘠并重复化,毕竟对于复杂查询的支持,我认为还没有在XML里写一条SQL方便呢~
所以这篇文章用于补充一语带过的官方文档,记录下自己趟过的坑。
正文 一对一映射 注解化一对一映射其实就是将XML中的ResultType
属性对应的实体写在@Results
注解中。其中的@Result
填入实体的属性,而若该属性为实体中的实体,则需要@One注解引入。
1 2 3 4 5 6 7 8 9 10 11 12 @Select("select answer_id, answer_content, liked_count, create_time, question_id, user_id from answer where create_time > #{createTime} order by liked_count desc, create_time desc limit 0,10") @Results({ @Result(id = true, column = "answer_id", property = "answerId", javaType = Integer.class), @Result(column = "answer_content", property = "answerContent"), @Result(column = "liked_count", property = "likedCount", javaType = Integer.class, jdbcType = JdbcType.INTEGER), @Result(column = "create_time", property = "createTime"), @Result(column = "question_id", property = "question", javaType = Question.class, one = @One(select = "selectQuestionById")), @Result(column = "user_id", property = "user", one = @One(select = "selectUserById")) }) List<Answer> listAnswerByCreateTime (@Param("createTime") long createTime) ;
值得注意的是,映射中的property
属性的值不可和其他实体属性一样,应该填写所返回的实体名称。
例如下面代码,我返回的实体为Answer
类下的Question
类,则property
中不可写questionId
,而得写question
。同时@One中select属性对应的方法若在不同类,则需要写出完整的包名(com.xxx.xxx.getxxxByxx)。
1 2 @Result(column = "question_id", property = "question", javaType = Question.class, one = @One(select = "selectQuestionById"))
需要注意的是,从@One传递过来的查询条件也需要在主查询语句中查询出来,也就是上面的listAnswerByCreateTime
方法需要查询出question_id和user_id,千万别漏了。否则报你错哦!
1 2 3 4 5 6 7 @Select("select question_id, question_title from question where question_id = #{questionId}") @ResultType(Question.class) Question selectQuestionById (@Param("questionId") Integer questionId) ;@Select("select user_id, username, avatar_url, simple_desc from user where user_id = #{userId}") @ResultType(User.class) User selectUserById (@Param("userId") Integer userId) ;
由此查询得出的结果集为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 "answerList" : [ { "answerId" : 42 , "answerContent" : "这是回答!" , "likedCount" : 3 , "createTime" : 1520508016650 , "userId" : null , "questionId" : null , "likeState" : null , "commentCount" : null , "question" : { "questionId" : 1 , "questionTitle" : "Spring,Django,Rails,Express这些框架技术的出现都是为了解决什么问题,现在这些框架都应用在哪些方面?" , "createTime" : null , "userId" : null , "user" : null }, "user" : { "userId" : 11218 , "weiboUserId" : null , "email" : null , "username" : "amosamos" , "password" : null , "joinTime" : null , "avatarUrl" : "https://avatars3.githubusercontent.com/u/16012509?s=400&u=6fe0dd08943216aeff2d3c9d1b8c3e602f6de8e9&v=4" }, "answerCommentList" : null } ]