MyBatis多表操作-----一对一操作

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();

    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值