1、级联属性的方式封装查出1-1
查钥匙的时候顺别把对应的级联的那把锁也查出来
1)、两个JavaBean,Key里有对应的Lock(private Lock lock;//当前钥匙能开哪个锁;)
2)、建两张表key表和lock表,key表里加外键
外键好处,安全性:单纯删key表里的一行记录删不掉,只有删除key表记录才行
3)、sql语句要对两个表两个相同名字id起别名,
id keyname lockid “lid” lockname
- - - - -
方便resultMap自定义封装规则指定返回数据的对应数据库列名
4)resultMap引用
2. association标签,mybatis推荐方便(续1)
表示联合了一个对象
<association property="lock" javaType="com.atguigu.bean.Lock">
<!-- 定义lock属性对应的这个Lock对象如何封装 -->
<id property="id" column="lid"/>
<result property="lockName" column="lockName"/>
</association>
【打印】
Key keyById = mapper.getKeyById(2);
System.out.println(keyById);
Key [id=2, keyName=2号钥匙, lock=Lock [id=2, lockName=2号锁]]
3. collection标签(一个门人手一把钥匙)1-n
一个Lock对应一个Key集合(collection自动整成list)
1)、JavaBean Lock (private List<Key> keys;)
<!--
private Integer id;
private String lockName;
//查询锁子的时候把所有的钥匙也查出来
private List<Key> keys;
id lockName kid keyname lockid
3 303办公室的锁子 3 303钥匙1 3
3 303办公室的锁子 4 303钥匙2 3
3 303办公室的锁子 5 303钥匙3 3
-->
<resultMap type="com.atguigu.bean.Lock" id="mylock">
<id property="id" column="id"/>
<result property="lockName" column="lockName"/>
<!--
collection:定义集合元素的封装
property="":指定哪个属性是集合属性
javaType:指定对象类型;association
ofType="":指定集合里面元素的类型
-->
<collection property="keys" ofType="com.atguigu.bean.Key">
<!-- 标签体中指定集合中这个元素的封装规则 -->
<id property="id" column="kid"/>
<result property="keyName" column="keyname"/>
</collection>
</resultMap>
【打印】
与1-1不同的是取出对象后,对其内部list遍历才能得到collection
Lock lock = mapper.getLockById(3);
System.out.println(lock);
System.out.println("所有锁子如下:");
List<Key> keys = lock.getKeys();
for (Key key : keys) {
System.out.println(key);
}
Lock [id=3, lockName=303办公室的锁子]
所有锁子如下:
Key [id=3, keyName=303钥匙1]
Key [id=4, keyName=303钥匙2]
Key [id=5, keyName=303钥匙3]