MyBatis学习笔记(二) 关联关系

  1. 云栖社区>
  2. 全栈开发者社区>
  3. 博客>
  4. 正文

MyBatis学习笔记(二) 关联关系

技术小能手 2018-08-30 15:35:09 浏览2092
展开阅读全文

一、一对一关系

还是通过例子来解释说明。(一个妻子对应一个丈夫)。

1)数据库信息


create table t_wife(
id int primary key auto_increment,
wife_name varchar(20),
fk_husband_id int
);

create table t_husband(
id int primary key auto_increment,
husband_name varchar(20)
);

insert into t_husband values (null,'hello');
insert into t_wife values(null,'kitty',1)

2)对应的JavaBean代码

虽然在数据库里只有一方配置的外键,但是这个一对一是双向的关系。

HusbandBean.java


package com.cy.mybatis.beans;

import java.io.Serializable;
/**
* one to one
* @author acer
*
*/
public class HusbandBean implements Serializable{


private static final long serialVersionUID = 1L;
 
private Integer id;
private String name;
private WifeBean wife;
public HusbandBean() {
super();
}
public HusbandBean(Integer id, String name, WifeBean wife) {
super();
this.id = id;
this.name = name;
this.wife = wife;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public WifeBean getWife() {
return wife;
}
public void setWife(WifeBean wife) {
this.wife = wife;
}
@Override
public String toString() {
return "Husband [id=" + id + ", name=" + name + ", wife=" + wife + "]";
}
}

WifeBean.java


package com.cy.mybatis.beans;

import java.io.Serializable;
/**
* one to one
* @author acer
*
*/
public class WifeBean implements Serializable{
 
private static final long serialVersionUID = 1L;
private Integer id;
private String name;
private HusbandBean husband;
public WifeBean() {
super();
}
public WifeBean(Integer id, String name, HusbandBean husband) {
super();
this.id = id;
this.name = name;
this.husband = husband;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public HusbandBean getHusband() {
return husband;
}
public void setHusband(HusbandBean husband) {
this.husband = husband;
}
@Override
public String toString() {
return "Wife [id=" + id + ", name=" + name + ", husband=" + husband
+ "]";
}
}

3)接下来建立两个接口,HusbandMapper,WifeMapper.

HusbandMapper


package com.cy.mybatis.mapper;

import com.cy.mybatis.beans.HusbandBean;

public interface HusbandMapper {
/**
* 根据id查询丈夫信息
* @param id
* @return
* @throws Exception
*/
public HusbandBean selectHusbandById (int id) throws Exception;
 
/**
* 根据id查询丈夫与妻子信息
* @param id
* @return
* @throws Exception
*/
public HusbandBean selectHusbandAndWife(int id) throws Exception;

}

4)定义HusbandMapper.xml文件


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cy.mybatis.mapper.HusbandMapper">

<resultMap type="HusbandBean" id="husbandAndWife">
<id property="id" column="id" javaType="java.lang.Integer"/>
<result property="name" column="name" javaType="java.lang.String"/>
 
<!-- association – 一个复杂的类型关联;许多结果将包成这种类型
嵌入结果映射 – 结果映射自身的关联,或者参考一个
column="id" 这里的id指的是在t_wife表来的主键id 
这个查询妻子,所以在妻子mapper里有个方法 -->
<association property="wife" column="id" javaType="WifeBean" select="com.cy.mybatis.mapper.WifeMapper.selectWifeByHusbandId" ></association>
</resultMap>

<!-- resultType 返回类型 从这条语句中返回的期望类型的类的完全限定名或别名
。-->
<select id="selectHusbandById" resultType="HusbandBean">
select * from t_husband where id=#{id}
</select

<!-- resultMap 命名引用外部的 resultMap。返回的是一个集合。-->
<select id="selectHusbandAndWife" resultMap="husbandAndWife">
select * from t_husband where id=#{id}
</select>




</mapper>

在WifeMapper.xml里有个方法


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.cy.mybatis.mapper.WifeMapper">
<select id="selectWifeByHusbandId" resultType="WifeBean">
select * from t_wife where fk_husband_id = #{id}

</select
</mapper>

5)写个实现


package com.cy.mybatis.service;

import org.apache.ibatis.session.SqlSession;

import com.cy.mybatis.beans.HusbandBean;
import com.cy.mybatis.mapper.HusbandMapper;
import com.cy.mybatis.tools.DBTools;




public class OneToOneService {
 
public static void main(String[] args) {
selectHusbandAndWife();

}


private static void selectHusbandAndWife() {
SqlSession session = DBTools.getSession();
HusbandMapper hm = session.getMapper(HusbandMapper.class);
try {
HusbandBean husband = hm.selectHusbandAndWife(1);
System.out.println(husband);
session.commit();
} catch (Exception e) {
e.printStackTrace();
}
}

}

注意:那个工具类还是前一章那样写的,就相当与在昨天的基础上建立的。

924c058a6889636baffee4eaa91f89817b36e5c7

注意:

mybatis实际是对XML进行操作,我们所有的方法都直接定义在XML中,写个接口只是为了更好的符合我们3层的思想,如果不写接口,直接通过session也可以直接操作xml中的方法 ,

XML中只要有方法,就可以使用,而调用的方式就是:namespace+方法名;

例外使用resultType时,一定要保证,你属性名与字段名相同;

如果不相同,就使用resultMap 。

二、一对多关系

还是通过例子来解释说明。(一把锁对应多把钥匙)。

2.1)数据库信息 这里没有添加数据了,我们用批量添加数据


create table t_key(
id int primary key auto_increment,
key_name varchar(20),
fk_lock_id int 
);


create table t_lock(
id int primary key auto_increment,
lock_name varchar(20)
);

2.2) 实体类

KeyBean.java


package com.cy.mybatis.beans;

import java.io.Serializable;
/**
* manyTOone
*
*/
public class KeyBean implements Serializable {


private static final long serialVersionUID = 3712545874604618746L;

private Integer id;
private String key;
 
private LockBean lock;

public KeyBean() {
super();
}

public KeyBean(Integer id, String key, LockBean lock) {
super();
this.id = id;
this.key = key;
this.lock = lock;
}

public Integer getId() {
return id;
}

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

public String getKey() {
return key;
}

public void setKey(String key) {
this.key = key;
}

public LockBean getLock() {
return lock;
}

public void setLock(LockBean lock) {
this.lock = lock;
}

@Override
public String toString() {
return "KeyBean [id=" + id + ", key=" + key + ", lock=" + lock + "]";
}

LockBean.java


package com.cy.mybatis.beans;

import java.io.Serializable;
import java.util.List;
/**
* oneTOmany
*
*/
public class LockBean implements Serializable{

private static final long serialVersionUID = 7092410462131162665L;

private Integer id;
private String lock;
 
private List<KeyBean> keys;

public LockBean() {
super();
}

public LockBean(Integer id, String lock, List<KeyBean> keys) {
super();
this.id = id;
this.lock = lock;
this.keys = keys;
}

public Integer getId() {
return id;
}

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

public String getLock() {
return lock;
}

public void setLock(String lock) {
this.lock = lock;
}

public List<KeyBean> getKeys() {
return keys;
}

public void setKeys(List<KeyBean> keys) {
this.keys = keys;
}

@Override
public String toString() {
return "LockBean [id=" + id + ", keys=" + keys + ", lock=" + lock + "]";
}

2.3) 建立接口

KeyMapper.java


package com.cy.mybatis.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.cy.mybatis.beans.KeyBean;

public interface KeyMapper {
/**
* 批量添加钥匙
* @return
* 提倡 这样使用 @Param("keys")
*/
public int batchSaveKeys(@Param("keys")List<KeyBean> keys);
}

LockMapper.java


package com.cy.mybatis.mapper;

import org.apache.ibatis.annotations.Param;

import com.cy.mybatis.beans.LockBean;

public interface LockMapper {
/**
* 添加锁
* @param lock
* @return
*/
public int saveLock(@Param("lock")LockBean lock);
 
/**
* 根据ID查询锁的资料
* @param id
* @return
*/
public LockBean findLockById(int id);
 
/**
* 根据ID查询锁与钥匙的资料
* one2many
* @param id
* @return
*/
public LockBean findLockAndKeys(int id);

}

2.4) 建立xml文件

KeyMapper.xml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cy.mybatis.mapper.KeyMapper">

<resultMap id="keyMap" type="KeyBean">
<id property="id" column="id" javaType="java.lang.Integer"/>
<result property="key" column="key_name" javaType="java.lang.String"/>
</resultMap>
 

<!--collection 为用于遍历的元素(必选),支持数组、List、Set -->
<!-- item 表示集合中每一个元素进行迭代时的别名. -->
<!--separator表示在每次进行迭代之间以什么符号作为分隔 符. -->
<insert id="batchSaveKeys">
insert into t_key values 
<foreach collection="keys" item="key" separator=",">
(null,#{key.key},#{key.lock.id})
</foreach>
</insert>

<select id="findKeysByLockId" resultMap="keyMap">
select * from t_key where fk_lock_id = #{id}
</select>

</mapper>

LockMapper.xml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cy.mybatis.mapper.LockMapper">
<!--自定义返回类型 -->
<resultMap id="lockMap" type="LockBean">
<id property="id" column="id" javaType="java.lang.Integer"/>
<result property="lock" column="lock_name" javaType="java.lang.String"/>
</resultMap>

 <!--自定义返回类型 -->
<resultMap id="lockAndKeysMap" type="LockBean">
<id property="id" column="id" javaType="java.lang.Integer"/>
<result property="lock" column="lock_name" javaType="java.lang.String"/>

<collection property="keys" column="id" select="com.cy.mybatis.mapper.KeyMapper.findKeysByLockId"></collection>
</resultMap>

<insert id="saveLock">
insert into t_lock values (null,#{lock.lock}) 
</insert>

<select id="findLockById" resultMap="lockMap">
select * from t_lock where id= #{id}
</select>

<select id="findLockAndKeys" resultMap="lockAndKeysMap">
select * from t_lock where id= #{id}
</select>

</mapper>

2.5 ) 实现


package com.cy.mybatis.service;

import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.cy.mybatis.beans.KeyBean;
import com.cy.mybatis.beans.LockBean;
import com.cy.mybatis.mapper.KeyMapper;
import com.cy.mybatis.mapper.LockMapper;
import com.cy.mybatis.tools.DBTools;

public class OneToManyService {
public static void main(String[] args) {
// saveLock();
// batchSaveKeys();
findLockAndKeys();
}

private static void findLockAndKeys() {

SqlSession session = DBTools.getSession();
LockMapper lm = session.getMapper(LockMapper.class);
LockBean lock = lm.findLockAndKeys(1);
System.out.println(lock);
}

private static void batchSaveKeys() {

SqlSession session = DBTools.getSession();
LockMapper lm = session.getMapper(LockMapper.class);
KeyMapper km = session.getMapper(KeyMapper.class);

LockBean lock = lm.findLockById(1);
List<KeyBean> keys = new ArrayList<KeyBean>();
for(int i = 0; i < 5; i++){
KeyBean key = new KeyBean(null, "钥匙"+i, lock);
keys.add(key);
}
km.batchSaveKeys(keys);
session.commit();
}

private static void saveLock() {
SqlSession session = DBTools.getSession();
LockMapper lm = session.getMapper(LockMapper.class);
LockBean lock = new LockBean(null, "锁1", null);
lm.saveLock(lock);
session.commit();
}
}

结果显示:

dd4db7c2e0545d386de27b7ed124b8ebf338eea7

原文发布时间为:2018-08-30本文来自云栖社区合作伙伴“全栈开发者社区”,了解相关信息可以关注“全栈开发者社区”。

网友评论

登录后评论
0/500
评论
技术小能手
+ 关注
所属团队号: 全栈开发者社区