mybatis_resultMap(2)

为了实现一个多表联合查询

我新建一个数据库表nation
1175089-20171007001540911-1028330373.png
在nation表里插入几行数据
1175089-20171007001728521-1942643786.png


    select g.*,n.* from goods g,nation n where g.ID=n.goods_id

1175089-20171007002158802-1567740743.png

查到了,这就是多表连查

问题来了,你说这个多表连查应该怎么去封装数据呢?

首先再创建一个实体类,命名为Nation

1175089-20171007002855318-1594361074.png

思考下问题

1.多表连查是一个什么关系?
2.两表之间怎么去体现这样的关系
3.Java中类与类中的关系有2种,要么继承,要么关联
4.什么是关联? 就是在一个类中有另一个类的声明对象


/Mybatis02/src/com/chen/GoodsInfo.java

package com.chen;

public class GoodsInfo {
    private int  e_id ;
    private  String e_name;
    
    //Java中类与类之间的关系。注意下面这引进了另一个类
    private Nation nation ; //只声明,不赋值
     
    public Nation getNation() {
        return nation;
    }
    
    public void setNation(Nation nation) {
        this.nation = nation;
    }
    
    public int getE_id() {
        return e_id;
    }
    public void setE_id(int e_id) {
        this.e_id = e_id;
    }
    public String getE_name() {
        return e_name;
    }
    public void setE_name(String e_name) {
        this.e_name = e_name;
    }
    
    
}

老套路第1步

/Mybatis02/src/com/chen/dao/GoodsDao2.java

public List<GoodsInfo> selectAll3();

老套路第2步

/Mybatis02/config/mappers/GoodsInfoMapper.xml

<!-- type一定要对应实体类
       id就是给当前配置的封装格式起一个唯一标识  -->
  <select id="selectAll3" resultMap="lalala">
    select g.id id,g.name name ,n.goods_id goods_id,n.from   from goods g,nation n WHERE g.id = n.goods_id
  </select>
  
  <resultMap type="com.chen.GoodsInfo" id="lalala">
    <!-- 下面这个id标签表示配置主键的封装格式 -->
    <id column="id" property="e_id" />
    <result column="name" property="e_name" />
    <result column="goods_id" property="nati.goods_id" />
    <result column="goods_id" property="nati.from" />
  
  </resultMap>
  

老套路第3步

/Mybatis02/src/test/Start2.java


public class Start2 {

    public static void main(String[] args) throws IOException {
        
        String resource = "mybatis-conf.xml";
        InputStream  inputStream = Resources.getResourceAsStream(resource);
        //创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //true表示自动提交。否则需要使用commit方法才会提交。默认是false
        SqlSession session = sqlSessionFactory.openSession();
        
        //拿到接口的代理对象
        GoodsDao2 dao=session.getMapper(GoodsDao2.class);
        List<GoodsInfo> list = dao.selectAll3();
        System.out.println(list);
        
        //如果上面不设置自动提交表单,那么就需要commit方法
        session.commit();
    }

}

点击运行
1175089-20171007102735677-945649870.png

得到了3个对象,说明有3条数据,不信看看用这个SQL语句查下数据库

1175089-20171007102904380-1086000165.png

对没错,但是正常来说控制台应该是直接打印出相应的数据的,但不知道为什么 这里只显示出3个对象的引用地址
正常显示应该是下面这样

1175089-20171007103706224-635973496.png

我只能改成这样,可以拿到第几个对象的对应属性。但这样好像很不直观
1175089-20171007103451911-47335995.png

经过我的琢磨,愿来原因是这个

回到实体类GoodsInfo 里重写一个toSring()方法,让其返回相应信息
/Mybatis02/src/com/chen/GoodsInfo.java
package com.chen;

public class GoodsInfo {
private int e_id ;
private String e_name;

public Nation getNation() {
    return nati;
}

public void setNation(Nation nati) {
    this.nati = nati;
}

public int getE_id() {
    return e_id;
}
public void setE_id(int e_id) {
    this.e_id = e_id;
}
public String getE_name() {
    return e_name;
}
public void setE_name(String e_name) {
    this.e_name = e_name;
}

// 注意:新重写的方法 就是下面这个 .既 让其返回当前对象的对应字段
public String toString()
{
return "Goods [e_id=" +e_id + ",e_name=" +e_name + "]";

}

}


System.out.println(list);

1175089-20171007104751021-1218758642.png

![](http://images2017.cnblogs.com/blog/1175089/201710/1175089-20171007104627568-1200699599.png)


##发现结果就能正常显示出来了。且,这两个不语句的输出效果是一样的。

###小细节
这里也另外也无意中发现。原来直接System.out.println(list); 就是默认list.toSring()   。本来我如果不重写toString() ,它系统默认的是输出当前对象的引用地址 (既是一个16进制的值)。而我现在重写了toString()。既

public String toString()
{
return "Goods [e_id=" +e_id + ",e_name=" +e_name + "]";

}
那么,这就使输出结果产生了变化.。
对了,上面return是自己手打的,感觉很麻烦,且很容易错。这里有个小技巧可以快速toString
**右键实体类空白处---source -----generate toString()  ---OK**

![](http://images2017.cnblogs.com/blog/1175089/201710/1175089-20171007105624005-1545193649.png)
**那么就立刻快速生成了,不仅字段显示完整,而且不会错**

@Override
public String toString() {
return "GoodsInfo [e_id=" + e_id + ", e_name=" + e_name + ", nati="
+ nati + "]";
}
```
回到主入口类 点击运行,看下新结果

[GoodsInfo [e_id=1, e_name=大米面膜, nati=com.chen.Nation@475530b9], GoodsInfo [e_id=2, e_name=泰国纳兰足贴, nati=com.chen.Nation@1d057a39], GoodsInfo [e_id=3, e_name=Mellin菊花晶, nati=com.chen.Nation@26be92ad]]
`

因为nati 是在GoodsInfo类中声明的一个对象。而刚nati所属的Nation实体类中 ,还没重写它的方法toString。 所以上面的结果就是输出nati对象的16进制的引用地址,因为这就是原本系统的toString()的默认方法。
那么现在我去Nation实体类里 像刚才一样 快速重写toString()
1175089-20171007110532740-754113197.png

点击运行

[GoodsInfo [e_id=1, e_name=大米面膜, nati=Nation [goods_id=1, from=1]], GoodsInfo [e_id=2, e_name=泰国纳兰足贴, nati=Nation [goods_id=2, from=2]], GoodsInfo [e_id=3, e_name=Mellin菊花晶, nati=Nation [goods_id=3, from=3]]]

这里出现疑惑,为什么from 的值会是一个数字呢?我数据表里存的不是一个国家的名字吗?

1175089-20171007111032036-491604257.png

放着先 。暂时到这结束

转载于:https://www.cnblogs.com/czy16/p/7633740.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值