MyBatis多表操作-----一对一操作
MyBatis的多表操作是建立在单表操作的基础上的,所以学习起来比较容易,但是由于是两个表之间相互关联,需要对具体地方进行修改。
首先对环境进行搭建
这就是搭建好之后的样子
由于在工作当中使用注解式较多,我们接下来使用注解法进行学习
一.对Hus表进行单表查询操作
public class HusService {
private SqlSessionFactory ssf;
public HusService() {
InputStream is=this.getClass().getClassLoader().getResourceAsStream("mybatis.cfg.xml");
ssf=new SqlSessionFactoryBuilder().build(is);
}
@Test
public void queryHus(){
SqlSession session = ssf.openSession();
HusExample example = new HusExample();
List<Hus> list=session.selectList("com.ryh.test.mapper.HusMapper.selectByExample",example);
list.forEach(c->System.out.println(c.getHname()));
session.close();
}
}
这里因为没有进行两表联查,所以不需要进行改动
二.
我们下面进行在Hus表中查询Wife相关数据
首先先对model层下的Hus和Wife进行操作
public class Wife implements Serializable {
private Integer id;
private Hus hus;
private String wname;
public Hus getHus() {
return hus;
}
public void setHus(Hus hus) {
this.hus = hus;
}
}
public class Hus implements Serializable {
private Integer id;
private Wife wife;
private String hname;
public Wife getWife() {
return wife;
}
public void setWife(Wife wife) {
this.wife = wife;
}
}
然后对HusMapper进行操作
在这后面填上:
@Result(column = "id" ,property = "wife",one =@One(select = "com.ryh.test.mapper.WifeMapper.selectByPrimaryKey"))
其中column是指的序列名
property是元素
one=@One是一对一的关系
后面的地址是WifeMapper下面的selectByPrimaryKey方法
由于Hus是主表,从表的id是随着主表发生改变才能改变的,主表中一个数据可以不包含有wife,所以要在查询的时候进行判断
list.forEach(c->{
if(c.getWife()!=null){
System.out.println(c.getHname()+c.getWife().getWname());
} else{
System.out.println(c.getHname());
}
});
类似的,也可以通过查询WIfe来查询Hus表
下面进行增删改的操作
如果我们想让表中的id自增的话,需要在主表的HusMapper中进行修改
在这中间添加下面一句话
@Options(useGeneratedKeys = true,keyProperty = "id")//得到主表的id,送入到record中 再次进入从表wife中 充当主键id
userGenerateKeys是要求是否自增,keyProperty指的是自增的序列是哪个
在进行删除的时候,要优先删除从表中的数据,后删除主表的数据,以免删不干净
public class HusService {
private SqlSessionFactory ssf;
public HusService() {
InputStream is=this.getClass().getClassLoader().getResourceAsStream("mybatis.cfg.xml");
ssf=new SqlSessionFactoryBuilder().build(is);
}
@Test
public void update(){
SqlSession sqlSession=ssf.openSession();
try {
Hus hus=new Hus();
hus.setId(7);
hus.setHname("木村拓哉");
sqlSession.update("com.ryh.test.mapper.HusMapper.updateByPrimaryKey",hus);
Wife wife=new Wife();
wife.setId(7);
wife.setWname("工藤静香");
sqlSession.insert("com.ryh.test.mapper.WifeMapper.updateByPrimaryKey",wife);
sqlSession.commit();
}catch (Exception e){
sqlSession.rollback();
e.printStackTrace();
}
sqlSession.close();
}
@Test
public void add(){
SqlSession sqlSession=ssf.openSession();
try {
Hus hus=new Hus();
hus.setHname("木村拓哉");
sqlSession.insert("com.ryh.test.mapper.HusMapper.insert",hus);
Wife wife=new Wife();
wife.setId(hus.getId());
wife.setWname("工藤静香");
sqlSession.insert("com.ryh.test.mapper.WifeMapper.insert",wife);
sqlSession.commit();
}catch (Exception e){
sqlSession.rollback();
e.printStackTrace();
}
sqlSession.close();
}
@Test
public void del(){
SqlSession sqlSession=ssf.openSession();
try {
sqlSession.delete("com.ryh.test.mapper.WifeMapper.deleteByPrimaryKey",9);
sqlSession.delete("com.ryh.test.mapper.HusMapper.deleteByPrimaryKey",9);
sqlSession.commit();
}catch (Exception e){
sqlSession.rollback();
e.printStackTrace();
}
sqlSession.close();
}
@Test
public void queryHus(){
SqlSession session = ssf.openSession();
HusExample example = new HusExample();
List<Hus> list=session.selectList("com.ryh.test.mapper.HusMapper.selectByExample",example);
list.forEach(c->{
if(c.getWife()!=null){
System.out.println(c.getHname()+c.getWife().getWname());
} else{
System.out.println(c.getHname());
}
});
session.close();
}
@Test
public void queryWife(){
SqlSession session = ssf.openSession();
WifeExample example = new WifeExample();
List<Wife> list=session.selectList("com.ryh.test.mapper.WifeMapper.selectByExample",example);
list.forEach(c->System.out.println(c.getWname()+c.getHus().getHname()));
session.close();
}
}