其实我刚开始学的时候记得就踩过这个坑,总是搞不清楚 那个resultMap中的关联层次,以及参数传递的关系,今天研究看了一下其实是很简单只是以前没有太多的实践,所以不明白其中的机制是什么样的。
Association联合select使用值得注意的细节地方:
这是我使用mybatis的Association联合select使用存着问题的地方,
mybatis实际是对XML进行操作,我们所有的方法都直接定义在XML中,写个接口只是为了更好的符合我们3层的思想,如果不写接口,直接通过session也可以直接操作xml中的方法 ,
下面来个实验:
HusbandBean
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
+ "]";
}
}
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;
}
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();
}
}
}
还是通过例子来解释说明。(一把锁对应多把钥匙)。
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 + "]";
}
}
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 keys;
public LockBean() {
super();
}
public LockBean(Integer id, String lock, List 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 getKeys() {
return keys;
}
public void setKeys(List 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 keys);
}
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
insert into t_key values
(null,#{key.key},#{key.lock.id})
insert into t_lock values (null,#{lock.lock})
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 keys = new ArrayList();
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();
}
}