Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MyBatis注解(多表)

MyBatis注解(多表)

作者头像
星哥玩云
发布于 2022-09-14 13:44:13
发布于 2022-09-14 13:44:13
56800
代码可运行
举报
文章被收录于专栏:开源部署开源部署
运行总次数:0
代码可运行

1、多表关系映射说明

1.1、一对一

@One 注解(一对一)

代替了标签,是多表查询的关键,在注解中用来指定子查询返回单一对象。

@One 注解属性介绍:

select指定用来多表查询的sqlmapper

fetchType会覆盖全局的配置参数 lazyLoadingEnabled

使用格式:

@Result(column=" “,property=”",one=@One(select=""))

1.2、一对多

@Many 注解(多对一)

代替了标签,是是多表查询的关键,在注解中用来指定子查询返回对象集合。

使用格式:

@Result(property="",column="",many=@Many(select=""))

注意:

聚集元素用来处理“一对多”的关系。需要指定映射的 Java 实体类的属性,属性的 javaType(一般为 ArrayList)但是注解中可以不定义;

2、一对一

2.1、需求分析

查询学生信息,加载该学生的班级信息

2.2、编写Classes.java文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.io.Serializable;

public class Classes implements Serializable {
    private int cid;
    private String cname;

    public int getCid() {
        return cid;
    }

    public void setCid(int cid) {
        this.cid = cid;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    @Override
    public String toString() {
        return "Classes{" +
                "cid=" + cid +
                ", cname='" + cname + '\'' +
                '}';
    }
}

2.3、修改Students.java文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private Classes classes;

public Classes getClasses() {
        return classes;
}

public void setClasses(Classes classes) {
        this.classes = classes;
}

2.4、修改IStudentsDao.java文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Select("select sid,sname,ssex,sage,cid as c_id from students")
@Results(id="studentsMap1",value={
@Result(id=true,column = "sid",property = "sid"),
@Result(column = "sname",property = "sname"),
@Result(column = "ssex",property = "ssex"),
@Result(column = "sage",property = "sage"),
@Result(column = "c_id",property = "cid"),
@Result(column = "c_id",property = "classes",
                    one=@One(select = "com.tianyi.dao.IClassesDao.findById",fetchType = FetchType.EAGER))
    })
List<Students> findAll1();

2.5、编写IClassesDao.java文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.tianyi.javabean.Classes;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

public interface IClassesDao {
@Select("select * from classes where cid=#{cid}")
@Results(id="classesMap",value={
@Result(id=true,column = "cid",property = "cid"),
@Result(column = "cname",property = "cname")
    })
Classes findById(int cid);
}

2.6、修改MbStudentsTest.java测试类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
public void findAll1(){
List<Students> list=studentsDao.findAll1();
for (Students s:list) {
   System.out.println(s);
  //System.out.println(s+":"+s.getClasses());
}
}

3、一对多

3.1、需求分析

完成班级表与学生表的一对多的关系,查询出班级的信息和学生信息,学生信息只有在需要的时候才会显示。

3.2、编写Classes.java文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private List<Students> studentsList;

public List<Students> getStudentsList() {
        return studentsList;
}

public void setStudentsList(List<Students> studentsList) {
        this.studentsList = studentsList;
}

3.3、编写IClassesDao.java文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Select("select * from classes")
@Results(id="classesMap1",value={
@Result(id=true,column = "cid",property = "cid"),
@Result(column = "cname",property = "cname"),
@Result(column = "cid",property = "studentsList",many = @Many(
                    select = "com.tianyi.dao.IStudentsDao.findById1",fetchType = FetchType.LAZY
            ))
    })
List<Classes> findAll();

3.4、修改IStudentsDao.java文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Select("select * from students where cid=#{cid}")
Students findById1(int cid);

3.5、编写MbClassesTest.java文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.tianyi.dao.IClassesDao;
import com.tianyi.dao.IStudentsDao;
import com.tianyi.javabean.Classes;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MbClassesTest {
    private InputStream in;
    private SqlSession session;
    private IClassesDao classesDao;
    @Test
    public void findAll(){
        List<Classes> list=classesDao.findAll();
        for(Classes c:list){
            System.out.println(c);
        }
    }
    @Before
    public void init()throws IOException {
        in= Resources.getResourceAsStream("SqlMapConfig.xml");
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        SqlSessionFactory factory=builder.build(in);
        session=factory.openSession();
        classesDao=session.getMapper(IClassesDao.class);
    }
    @After
    public void destroy() throws IOException {
        session.commit();
        session.close();
        in.close();
    }
}

4、二级缓存的开启

4.1、修改SqlMapConfig.xml文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- 配置二级缓存 --> 
<settings>
<!-- 开启二级缓存的支持 --> 
<setting name="cacheEnabled" value="true"/>
</settings>

4.2、持久层使用二级缓存

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@CacheNamespace(blocking = true)
public interface IClassesDao {
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MyBatis注解(单表)
1、MyBatis注解开发前的准备 1.1、MyBatis常用注解 @Insert:实现新增 @Update:实现更新 @Delete:实现删除 @Select:实现查询 @Result:实现结果集封装 @Results:可以与@Result 一起使用,封装多个结果集 @ResultMap:实现引用@Results 定义的封装 @One:实现一对一结果集封装 @Many:实现一对多结果集封装 @SelectProvider: 实现动态SQL映射 @CacheNamespace:实现注解二级缓存的使
星哥玩云
2022/09/14
2850
MyBatis-多表查询(一对一)
因为一个学生信息只能在一个班级里,所以从查询学生信息出发关联查询班级信息为一对一查询。
星哥玩云
2022/09/14
3680
MyBatis-多表查询(一对一)
MyBatis-多表查询(一对多)
班级信息和他的学生信息为一对多关系,并且在查询班级的信息过程中查询出学生信息。我们想到了左外连接查询比较合适。
星哥玩云
2022/09/14
9550
MyBatis-延迟加载
就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。延迟加载也称懒加载。
星哥玩云
2022/09/14
1.1K0
Mybatis 注解
  我们可以看到,明明结果已经查询出来了,为什么打印出来却是空的。这个是因为属性名和列名不一致造成的,类似于我们这种 sId ☞ s_id 可以打开驼峰之自动转换。如果二者之间没有任何联系就需要使用 @Results 一一映射。
Demo_Null
2020/09/28
3500
Mybatis 注解
_MyBatis注解开发---实现自定义映射关系和关联查询
会洗碗的CV工程师
2023/11/21
3560
_MyBatis注解开发---实现自定义映射关系和关联查询
MyBatis-多表查询(多对多)
老师信息与学生信息为多对多的关系,一个学生有多个老师,一个老师同样可以有多个学生。要想知道老师下的学生信息,不能直接查到我们的学生信息,只能通过中间表(tors)才能关联到学生信息。
星哥玩云
2022/09/14
1.5K0
MyBatis-多表查询(多对多)
MyBatis注解开发
指的是MyBatis中SqlSession对象的缓存,当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供一块区域中。
用户3112896
2019/09/26
4940
Mybatis注解开发
实现复杂关系映射之前我们可以在映射文件中通过配置<resultMap>来实现,在使用注解开发时我们需要借助@Results 注解,@Result 注解,@One 注解,@Many 注解。
SerMs
2022/03/30
3270
Mybatis注解开发
MyBatis 多表操作
  关系数据库中第一个表中的单个行只可以与第二个表中的一个行相关,且第二个表中的一个行也只可以与第一个表中的一个行相关。
Demo_Null
2020/09/28
3580
MyBatis 多表操作
Mybatis使用注解实现一对多复杂关系映射
查询用户信息时,将用户的所有账户也查询出来,使用注解方式实现 (一个账户具有多个用户信息,所以形成了用户和账户之间的一对多关系) account表
别团等shy哥发育
2023/02/27
1.4K0
Mybatis使用注解实现一对多复杂关系映射
MyBatis 详解(一对一,一对多,多对多)
1、什么是MyBatis?   MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,
IT可乐
2018/01/04
5.5K0
MyBatis 详解(一对一,一对多,多对多)
SSM第六讲 MyBatis的高级特性
通过前面的学习,我们已经掌握了 Mybatis 中一对一,一对多,多对多关系的配置及实现,可以实现对象的关联查询。实际开发过程中有时候我们并不需要在加载用户信息时,就加载他的账户信息。 而是在使用用户账号的时候,再向数据库查询,此时就是我们所说的延迟加载。
易兮科技
2020/09/27
9300
SSM第六讲  MyBatis的高级特性
Mybatis使用注解实现一对一复杂关系映射及延迟加载
在加载账户信息时同时加载该账户的用户信息,根据情况可实现延时加载(注解方式实现) 数据库字段如下: user表:
别团等shy哥发育
2023/02/27
4290
Mybatis使用注解实现一对一复杂关系映射及延迟加载
MyBatis基于DAO实现CRUD
resultType 属性: 用于指定结果集的类型。 **parameterType 属性:**用于指定传入参数的类型。
星哥玩云
2022/09/14
8210
_Mybatis分解式查询
也可以使用分解式查询,即将一个连接Sql语句分解为多条Sql语句,如: # 查询班级时关联查询出学生
会洗碗的CV工程师
2023/11/20
1630
_Mybatis分解式查询
Mybatis分解式查询
一、Mybatis一对多分解式查询 分解式查询就是将一条Sql语句拆分成多条 在MyBatis多表查询中,使用连接查询时一个Sql语句就可以查询出所有的数据。如: # 查询班级时关联查询出学生 select *    from classes    left join student    on student.classId = classes.cid 也可以使用分解式查询,即将一个连接Sql语句分解为多条Sql语句,如: # 查询班级时关联查询出学生 select * from
会洗碗的CV工程师
2023/04/12
4050
Mybatis分解式查询
SSM学习笔记之MyBatis
ORM(Object Relation Mapping)对象关系映射,将Java中的一个对象与数据表中的一行记录一一对应。
Jetpropelledsnake21
2022/05/11
5480
SSM学习笔记之MyBatis
Mybatis【关联映射】
Mybatis【多表连接】 我们在学习Hibernate的时候,如果表涉及到两张的话,那么我们是在映射文件中使用<set>..<many-to-one>等标签将其的映射属性关联起来的…那么在我们Mybatis中又怎么做呢??? 先来回顾一下我们SQL99的语法: 一)内连接(等值连接):查询客户姓名,订单编号,订单价格 --------------------------------------------------- select c.name,o.isbn,o.price fr
Java3y
2018/03/15
9820
Mybatis【关联映射】
MyBatis:缓存,延迟加载,注解应用
实际开发过程中很多时候并不需要总是在加载用户信息时就一定要加载他的订单信息。此时就是我们所说的延迟加载。
RendaZhang
2020/09/08
9430
MyBatis:缓存,延迟加载,注解应用
相关推荐
MyBatis注解(单表)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验