mybatis 一对一关系取值association 通过resultMap实现

mybatis 一对一关系取值association 通过resultMap实现

上一篇文章介绍了使用association利用mybatis进行再次查询实现一对一的关联mybatis 一对一关系取值association,现在还有一种更加简单的方式。直接利用resultMap把mybatis返回的值进行转换,转换的过程有如下几个关键点:
1、ResultMap中的配置的column一定要和数据库中查询出来的一致,可能是原始的列名,也可能是别名。
2、ResultMap中涉及的类中需要有一个“全构造函数”,这个全构造函数不是一般意义上的全构造函数,而是要告诉mybaits返回的每个列是哪个类的。

好了,下面用一个例子说明一下数据库和项目还是上一篇文章中的,所以这里不过多赘述(mybatis 一对一关系取值association)。

1、首先两个Bean:
Duty.java
package com.xueyou.ssm.model;

import java.sql.Timestamp;

/**
 * Created by wuxueyou on 2016/11/12.
 */
public class Duty {
    private String id;
    private String dutyname;
    private String memo;
    private String depid;
    private String ordernumber;

    public Duty(String id, String dutyname, String memo, String depid, String ordernumber) {
        this.id = id;
        this.dutyname = dutyname;
        this.memo = memo;
        this.depid = depid;
        this.ordernumber = ordernumber;
    }

    public Duty(String id, String loginId, String password, String name, String sex, Timestamp createTime, Timestamp birthday, String status, String dutyid, String phone, String email, String photo, String did, String dutyname, String memo, String depid, String ordernumber) {
        this.id = did;
        this.dutyname = dutyname;
        this.memo = memo;
        this.depid = depid;
        this.ordernumber = ordernumber;
//        this.duty = new Duty(did, dutyname, memo, depid, ordernumber);
    }
    @Override
    public String toString() {
        return "Duty{" +
                "id='" + id + '\'' +
                ", dutyname='" + dutyname + '\'' +
                ", memo='" + memo + '\'' +
                ", depid='" + depid + '\'' +
                ", ordernumber='" + ordernumber + '\'' +
                '}';
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getDutyname() {
        return dutyname;
    }

    public void setDutyname(String dutyname) {
        this.dutyname = dutyname;
    }

    public String getMemo() {
        return memo;
    }

    public void setMemo(String memo) {
        this.memo = memo;
    }

    public String getDepid() {
        return depid;
    }

    public void setDepid(String depid) {
        this.depid = depid;
    }

    public String getOrdernumber() {
        return ordernumber;
    }

    public void setOrdernumber(String ordernumber) {
        this.ordernumber = ordernumber;
    }
}

User2.java
package com.xueyou.ssm.model;

import com.fasterxml.jackson.annotation.JsonFormat;

import java.sql.Time;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by wuxueyou on 16/10/31.
 */
public class User2 {
    private String id;
    private String loginId;
    private String password;
    private String name;
    private String sex;
    private Date createTime;
    private Date birthday;
    private String status;
    private String dutyid;
    private String phone;
    private String email;
    private String photo;
    private Duty duty;

    public User2(String id, String loginId, String password, String name, String sex, Date createTime, Date birthday, String status, String dutyid, String phone, String email, String photo, Duty duty) {
        this.id = id;
        this.loginId = loginId;
        this.password = password;
        this.name = name;
        this.sex = sex;
        this.createTime = createTime;
        this.birthday = birthday;
        this.status = status;
        this.dutyid = dutyid;
        this.phone = phone;
        this.email = email;
        this.photo = photo;
        this.duty = duty;
    }

    public User2(String id, String loginId, String password, String name, String sex, Timestamp createTime, Timestamp birthday, String status, String dutyid, String phone, String email, String photo, String did, String dutyname, String memo, String depid, String ordernumber) {
        this.id = id;
        this.loginId = loginId;
        this.password = password;
        this.name = name;
        this.sex = sex;
        this.createTime = createTime;
        this.birthday = birthday;
        this.status = status;
        this.dutyid = dutyid;
        this.phone = phone;
        this.email = email;
        this.photo = photo;
//        this.duty = new Duty(did, dutyname, memo, depid, ordernumber);
    }

    /*public User2(String id, String loginId, String password, String name, Timestamp createTime, Timestamp birthday, String status, String dutyid, String phone, String email, String photo, String duty_id, String duty_dutyname, String duty_memo, String dutydepid, String duty_ordernumber, String) {

    }*/

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
//        if (sex == null || sex.equals("")) {
//            return "";
//        }
//        if (sex.equals("1")) {
//            return "男";
//        } else {
//            return "女";
//        }
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getLoginId() {
        return loginId;
    }

    public void setLoginId(String loginId) {
        this.loginId = loginId;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        try {
            this.createTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(createTime);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        try {
            this.birthday = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(birthday);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    public String getStatus() {
        return status;
        /*if (status == null || status.equals("")) {
            return "";
        }
        if (status.equals("1")) {
            return "启用";
        } else {
            return "禁用";
        }*/
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getDutyid() {
        return dutyid;
    }

    public void setDutyid(String dutyid) {
        this.dutyid = dutyid;
    }

    public String getPhoto() {
        return photo;
    }

    public void setPhoto(String photo) {
        this.photo = photo;
    }

    public Duty getDuty() {
        return duty;
    }

    public void setDuty(Duty duty) {
        this.duty = duty;
    }

    @Override
    public String toString() {
        return "User2{" +
                "id='" + id + '\'' +
                ", loginId='" + loginId + '\'' +
                ", password='" + password + '\'' +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", createTime=" + createTime +
                ", birthday=" + birthday +
                ", status='" + status + '\'' +
                ", dutyid='" + dutyid + '\'' +
                ", phone='" + phone + '\'' +
                ", email='" + email + '\'' +
                ", photo='" + photo + '\'' +
                ", duty=" + duty +
                '}';
    }
}

2、Dao层进行访问:
    public List<User2> user2Listnew(Map<String,Object> params);

3、xml文件中mapper:
<resultMap id="usermappernew" type="com.xueyou.ssm.model.User2">
        <id property="id" column="ID"/>
        <result property="loginId" column="LOGINID"/>
        <result property="password" column="password"/>
        <result property="name" column="name"/>
        <result property="sex" column="sex"/>
        <result property="createTime" column="createTime"/>
        <result property="birthday" column="brithday"/>
        <result property="status" column="status"/>
        <result property="dutyid" column="dutyid"/>
        <result property="phone" column="phone"/>
        <result property="email" column="email"/>
        <result property="photo" column="photo"/>
        <association property="duty" column="dutyid" javaType="com.xueyou.ssm.model.Duty">
            <id property="id" column="did"/>
            <result property="dutyname" column="dutyname"/>
            <result property="memo" column="memo"/>
            <result property="depid" column="depie"/>
            <result property="ordernumber" column="ordernumber"/>
        </association>
    </resultMap>
    <select id="user2Listnew" statementType="STATEMENT" parameterType="Map" resultMap="usermappernew">
        SELECT a.ID AS id, a.LOGINID as loginId,a.PASSWORD as password,a.NAME as name,a.SEX as sex,a.CREATETIME as createTime,a.BIRTHDAY as birthday,
          a.STATUS as status,a.DUTYID as dutyid,a.PHONE as phone,a.EMAIL as email,a.PHOTO as photo,b.ID as did,
           b.DUTYNAME as dutyname,b.MEMO as memo,b.ORDERNUMBER as ordernumber,b.DEPID as depid FROM user a left join duty b
          on a.DUTYID = b.ID
          ORDER BY a.CREATETIME DESC limit ${page},${rows}
    </select>

下面是单元测试:
@Test
    public void getUserNew(){
        Map<String,Object> params = new HashMap<>();
        params.put("page","1");
        params.put("rows","10");
        List<User2> userlist = userDao.user2Listnew(params);
        for (User2 user : userlist) {
            System.out.println(user);
            System.out.println(user.getDuty());
        }
        Assert.assertEquals(7,userlist.size());
    }

运行结果:
User2{id='c6a5f6b4-c668-4a4a-a2f0-e6c3320fcfba', loginId='yyuu', password='cc', name='aba', sex='1', createTime=Sun Nov 06 21:07:01 CST 2016, birthday=2016-11-06 21:07:07.0, status='1', dutyid='12', phone='1', email='1', photo='', duty=null}
null
User2{id='6bf4dc62-c80b-44c9-ae38-a61740c3a363', loginId='cc', password='1', name='1', sex='2', createTime=Sun Nov 06 20:56:20 CST 2016, birthday=2016-11-15 20:56:23.0, status='1', dutyid='1', phone='1', email='1', photo='', duty=null}
null
User2{id='30e95aa7-1984-4a1d-bdf4-fa16c3dfd7f5', loginId='43', password='12', name='1', sex='1', createTime=Sat Nov 05 23:29:00 CST 2016, birthday=2016-11-05 23:29:12.0, status='1', dutyid='1', phone='1', email='1', photo='/ssmUpload/files/file20161106191126337.jpg', duty=null}
null
User2{id='9999', loginId='132啊啊吧啊', password='faree', name='1', sex='2', createTime=Fri Nov 04 00:50:05 CST 2016, birthday=2016-11-06 00:09:57.0, status='1', dutyid='b68560a6-96c5-11e6-b79e-83fe6f33afd5', phone='123', email='123', photo='/ssmUpload/files/file20161106191506568.jpg', duty=Duty{id='b68560a6-96c5-11e6-b79e-83fe6f33afd5', dutyname='项目助理', memo='负责辅助项目执行', depid='1', ordernumber='1'}}
Duty{id='b68560a6-96c5-11e6-b79e-83fe6f33afd5', dutyname='项目助理', memo='负责辅助项目执行', depid='1', ordernumber='1'}
User2{id='714c9921-8b60-4213-bbaa-0cf91574e188', loginId='uuii', password='000', name='小明', sex='1', createTime=Thu Nov 03 19:23:11 CST 2016, birthday=2016-11-02 19:23:17.0, status='1', dutyid='12', phone='12341', email='122@qq.com', photo='', duty=null}
null
User2{id='47a226a2-9b8d-11e6-b79e-83fe6f33afd5', loginId='user1', password='1', name='aaa', sex='2', createTime=Wed Oct 26 23:02:57 CST 2016, birthday=2016-11-06 00:09:43.0, status='1', dutyid='77a7225e-960f-11e6-979c-bd06e7738959', phone='18322223333', email='8866@qq.com', photo='/ssmUpload/files/file20161106191205189.png', duty=Duty{id='77a7225e-960f-11e6-979c-bd06e7738959', dutyname='项目主管', memo='管理项目经理', depid='1', ordernumber='1'}}
Duty{id='77a7225e-960f-11e6-979c-bd06e7738959', dutyname='项目主管', memo='管理项目经理', depid='1', ordernumber='1'}
User2{id='1083caa8-9143-11e6-945d-708e78b00b24', loginId='a', password='1', name='aa', sex='1', createTime=Mon Oct 24 20:39:56 CST 2016, birthday=2016-10-15 17:48:59.0, status='1', dutyid='111', phone='12344445555', email='323@qq.com', photo='/ssmUpload/files/file20161106191234411.jpg', duty=null}
null



这里需要注意的是,这里有个顺序的问题,这里的顺序问题是这样的, sql语句中的顺序才是真正的顺序,而ResultMap中配置的不存在顺序一说。这个顺序如此重要是因为,如果返回的时候是根据这个顺序返回的。
例如,如果把sql语句改成这样(sex的位置换了):
 <select id="user2Listnew" statementType="STATEMENT" parameterType="Map" resultMap="usermappernew">
        SELECT a.ID AS id, a.LOGINID as loginId,a.PASSWORD as password,a.NAME as name,a.CREATETIME as createTime,a.BIRTHDAY as birthday,a.SEX as sex,
          a.STATUS as status,a.DUTYID as dutyid,a.PHONE as phone,a.EMAIL as email,a.PHOTO as photo,b.ID as did,
           b.DUTYNAME as dutyname,b.MEMO as memo,b.ORDERNUMBER as ordernumber,b.DEPID as depid FROM user a left join duty b
          on a.DUTYID = b.ID
          ORDER BY a.CREATETIME DESC limit ${page},${rows}
    </select>

那么,运行单元测试就会出现找不到构造函数的错误,这是因为,mybatis需要构造函数中的参数是按顺序的,一个对应一个的。
下面是错误的内容:
Caused by: org.apache.ibatis.executor.ExecutorException: No constructor found in com.xueyou.ssm.model.User2 matching [java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.sql.Timestamp, java.sql.Timestamp, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String]
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createByConstructorSignature(DefaultResultSetHandler.java:620)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createResultObject(DefaultResultSetHandler.java:569)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createResultObject(DefaultResultSetHandler.java:544)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:818)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForNestedResultMap(DefaultResultSetHandler.java:793)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:291)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:266)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:180)
	at org.apache.ibatis.executor.statement.SimpleStatementHandler.query(SimpleStatementHandler.java:73)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:78)
	at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
	at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:303)
	at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:154)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:102)
	at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:82)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120)
	at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:408)
	... 39 more




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值