Mybatis多表联结查询高级结果映射

假设需要联结一个app表和evaluation表
1.在被联结表(这里是evaluation表)的mapper.xml文件里新建一个resultMap,列表中添加需要获取的字段:

id="EvaluationJoinMap" type="包名.model.Evaluation"
        extends="BaseResultMap">
        <id property="id" column="evaluation_id" />
        <result property="appId" column="evaluation_app_id" />

(property值是Evaluation.java里的一个属性字段,column值取后面第三步查询语句里相应的别名,联结表后有冲突的字段取别名)

2.在联结表(这里是app表)的mapper.xml文件里新建一个resultMap:

<resultMap type="包名.model.App" id="EvaluationResultMap"
        extends="BaseResultMap">
        <collection property="appEvaluationList" javaType="list" ofType="包名.model.Evaluation"
            resultMap="包名.dao.EvaluationMapper.EvaluationJoinMap">
        collection>
resultMap>

(特别说明:我的EvaluationMapper.xml放在mapper层下,但是引用地址是”包名.dao.EvaluationMapper.EvaluationJoinMap”,是因为在mapper.xml文件中有一句将地址指向这里)

3.在联结表(这里是app表)的mapper.xml文件里新建一条查询语句:

<select id="getAppEvaluation" resultMap="EvaluationResultMap">
        select app.* ,
        evaluation.id
        evaluation_id,
        evaluation.app_id evaluation_app_id,
        from
        app join
        evaluation on
        app.id =
        evaluation.app_id
select>

4.特别重要容易被人忽视的一步,在第二步新建的resultMap中新建了一个property为appEvaluationList的,这个property需要在App.java中添加,不添加就会报错(There is no getter for property named ‘appEvaluationList’ in ‘class 包名.model.App’):

@Transient
    List appEvaluationList;

    public List getAppEvaluationList() {
        return appEvaluationList;
    }

    public void setEvaluationList(List appEvaluationList) {
        this.appEvaluationList = appEvaluationList;
    }

这篇文章是根据我自己的工程加经验来写的,如果有疑问,欢迎探讨。

你可能感兴趣的:(MySQL,mybatis,多表查询)