菩提树结种子吗? 当前位置:首页>菩提树结种子吗?>正文

菩提树结种子吗?

发布时间:2019-04-18

原标题:SSM框架开发web项目系列(三) MyBatis之resultMap及关联映射

  前言

  在上篇MyBatis基础篇中我们独立使用MyBatis构建了一个简单的数据库访问程序,可以实现单表的基本增删改查等操作,通过该实例我们可以初步了解MyBatis操作数据库需要的一些组成部分(配置文件、实体类、SQL映射文件、Mapper接口等等)和重要对象(SqlSession、Mapper实例等等)。有了整体认知后,我们就可以进一步深入学习MyBatis的使用,resultMap本文主要围绕resultMap展开。

  resultMap作为MyBatis的Sql映射文件中重要的元素之一,主要用来实现复杂的结果映射,其子元素结构如下:

  constructor

  constructor是构造器的意思,对反射有基本了解的都应该不会陌生。借此我们先回顾一下前面定义的一个简单resulMap映射内容

<resultMap type="person" id="personResultMap" >
    <id column="id" property="id" />
    <result column="name" property="name" />
    <result column="gender" property="gender" />
</resultMap>

  上面是一个典型的在resultMap中定义数据表与实体类的映射关系,type这里用的别名指向Person类,id为该映射的唯一标识,用于在后面我们的定义语句中引用,内部的id和result分别对应主键和普通字段定义,column指数据表中字段名,property指实体类中属性名。在之前的示例中,通过这个一个映射关系,我们查询出来的结果就转化为了一个Person类对象。

  这个Person类对象并非由我们创建出来,而是由mybatis调用了Person类的默认无参构造函数创建对象,再调用set方法为对象赋值,这样才返回了我们想要的结果。下面结合之前的示例,做一些改动以便观察。

package com.mmm.pojo;
/**
 * Person实体类
 * */
public class Person {
    
    private String id;
    
    private String name;
    
    private String gender;
    
    public String getId() {
        return id;
    }
    
    public void setId(String id) {
        this.id = id;
        System.out.println("为主键属性id赋值");
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
        System.out.println("为属性name赋值");
    }
    
    public String getGender() {
        return gender;
    }
    
    public void setGender(String gender) {
        this.gender = gender;
        System.out.println("为属性gender赋值");
    }
    
    public Person() {
        System.out.println("调用无参构造创建对象");
    }
}
<select id="selectById"resultMap="personResultMap">
    select * from `person` where id = #{id}
</select>

  调用该查找方法后会看到控制台输出如下信息:

  说明确实是mybatis调用了这些方法帮我们创建了对象,基于构造器。说起构造器,在我们定义的pojo实体类中,简单的私有属性加上set/get方法声明即完成,在java类中,会默认提供一个无参的构造方法,例如这里的Person类

public Person(){}

  我们使用语句 Person p = new Person();这里即调用的该无参构造。方法都可以重载,构造方法也不例外。但是很重要的一点,我们在重载构造方法后,原本默认提供的无参构造就无法使用了,需要显示声明,这点下面会给出示例。resultMap中constructor就是基于重载的带参构造方法创建对象,如下:

<resultMap type="person" id="personResultMap" >
    <constructor>
        <idArg column="id" javaType="string" />
        <arg column="name" javaType="string" />
        <arg column="gender" javaType="string" />
    </constructor>
</resultMap>

  在实体类中添加重载的带参构造方法

public Person(String id, String name, String gender) {
    this.id = id;
    this.name = name;
    this.gender = gender;
        System.out.println("直接调用带参构造函数创建对象");
}

  再次调用查找方法后会看到控制台输出如下信息:

  这样一来,使用constructor同样拿到了数据。

  这个时候如果我们把实体类中的默认无参构造方法的显示声明删除,即只有一个带参的构造方法,这样我们再把Sql映射文件中<resultMap>内容还原成文中一开始定义的典型<id><result>等,再调用方法,为了更明显,在地址栏中通过controller层层调用到该方法,报错乍一看,一大串异常,其实标题末尾一句话就出来了

  护坡草种子价格是多少? 5月份可以播种沙打旺吗? 宿根黑心菊籽市场什么价格? 1月可以播种牵牛花吗? 冬季沙藏的蟠桃种子多少钱一斤? 内蒙古哪里有卖石榴种子的? 4月可以播种瓜子黄杨吗? 皂角育苗每亩播种量多少斤? 铜钱柳种子怎么催芽最有效? 五公分红梅多少钱?

34350 36013 94488 71884 87301 24329 16529 31070 11936 33103 66056 33181 80193 84069 95628 46814 48342 50032 30183 56945 20523 44799 11048

责任编辑:石戏龙