mybatis学习五

2020/04/19
mybatis的级联查询
级联查询相当于在多个互相依赖的(外键)数据表之间进行查询。
分为三种:一对一,一对多,多对多。
1)一对一
这种方式有三种实现方式,先贴出三种实现方式的xml语句

    <association property="card" column="idcard_id" javaType="com.po.Idcard"
    select="com.dao.IdCardDao.selectCodeByld"/>
select * from person where id=#{id} ② select p.*,ic.code from person p, idcard ic where p.idcard_id=ic.id and p.id=#{id}

<select id="selectPersonById3" parameterType="Integer" resultType= "com.po.SelectPersonById">
    select p.*,ic.code
    from person p, idcard ic
    where p.idcard_id = ic.id and p.id=#{id}
</select>

在说明三种方法之前,有必要先介绍一下中的子标签:
该标签和中的先前使用过的其他子标签(如等)有一定相似的地方,都使用property属性指定映射的java类所对应的私有属性名,column属性指定了对应的数据库的数据项名。
差别在于标签是一个双标签(成对出现,不像自行关闭单个出现),因此其内部还可以包含其他标签,指定另一个映射(此时又相当于一个“”),其内部标签的含义和的含义一样。
接下来进行说明:
可以看出,上述三种方法又可以归结为两大类:一种使用resultMap存储查询结果,即①②种方法;另一种使用POJO(普通Java对象)存储查询结果,即③方法。
先介绍第一大类:
由于在第一大类中都是通过resultMap存储查询结果,因此在执行语句之前都需要定义一个标签,①②都使用了标签①②之间的差别在于:
方法①是通过设置标签中的select属性来指定另一个查询(值为该查询的代理接口方法)。②是在后面的标签中使用自然连接查询来实现级联查询,此时的属性配置也有所不同,但是都是与查询的结果所对应的,
如方法①中使用内外两个查询,外面是标签中的查询单个表person的sql语句,查询完后返回一个id为cardAndPerson1的resultMap类型,由于该resultMap中设置了标签中又指定了一个select属性,此时再执行一个内查询,最后将内外两个查询的结果组合起来,外部查询得到一个person对象,内部查询得到一个idcard对象并将该对象赋予给person对象的idcard属性;
而方法②中使用的是一个连接查询,只执行一条sql语句即可,此时中的标签中则设置person表的外映射表的属性。
可以看出,方法①实际上是一个嵌套查询,而方法②是一个自然连接查询。
接下来介绍第二大类:
方法③和方法二有异曲同工的地方,都是只执行一次sql语句即可,只是方法③使用另一个自定义的POJO来存储查询结果,此POJO的属性与sql语句中所选择的属性列要相一致匹配,即SelectPersonById(本例)这个POJO中的属性有person类的除idcard外的所有属性,以及idcard类的一个card属性,也就是person表与idcard表自然连接后的所有属性。

-------最后给出本次学习的运行结果截图
运行结果

本例的项目结构以及各类、xml映射如下:
项目结构:
使用spring+mybatis
使用的person.xml:
在这里插入图片描述
idcard.xml:
在这里插入图片描述
person.xml的接口代理类personDao.java:
在这里插入图片描述
idcard.xml对应的接口代理类idcardDao.java:
在这里插入图片描述
person.java实体类具体属性:
在这里插入图片描述
idcard.java具体属性:
在这里插入图片描述

注意:

这里的person与idcard类都需要实现所有属性的get以及set方法以便实现自动注入。
同时本例使用spring-mybatis自动创建sqlSession工厂,并使用自动映射,节省了很多语句。关于spring还有待继续学习。。。

参考:

MyBatis一对一关联查询(级联查询) http://c.biancheng.net/view/4368.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值