
关联查询的实现方法-使用mybatis框架
4. 使用join语句,和
发布日期:2021-05-07 21:06:06
浏览次数:23
分类:精选文章
本文共 6240 字,大约阅读时间需要 20 分钟。
如何在查询学生信息时包含完整的班级信息?
在数据库设计中,学生表和班级表之间存在关联关系。为了查询学生信息时包含完整的班级信息,可以采用以下几种方法:
1. 业务装配方式
思路:对学生表、班级表分别单表查询,在业务包中调用单表查询SQL,拼出结果。
实现:
- 学生实体类:
public class Student { int id; String name; int age; String gender; int cid; Clazz clazz; public Student() { // TODO Auto-generated constructor stub } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getCid() { return cid; } public void setCid(int cid) { this.cid = cid; } public Clazz getClazz() { return clazz; } public void setClazz(Clazz clazz) { this.clazz = clazz; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + ", cid=" + cid + ", clazz=" + clazz + "]"; }}
- 班级实体类:
public class Clazz { private int id; private String name; private String room; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getRoom() { return room; } public void setRoom(String room) { this.room = room; } @Override public String toString() { return "Clazz [id=" + id + ", name=" + name + ", room=" + room + "]"; } public Clazz() { super(); }}
- 业务层实现类:
public class StudentServiceImpl implements StudentService { @Override public ListselAll() { Session session = MyBatisUtil.getSession(); StudentMapper stuMapper = session.getMapper(StudentMapper.class); ClazzMapper clsMapper = session.getMapper(ClazzMapper.class); List list = new ArrayList (); list = stuMapper.selAll(); for (Student s : list) { System.out.println(s); } for (Student s : list) { s.setClazz(clsMapper.selClazzById(s.getCid())); } for (Student s : list) { System.out.println(s); } return list; }}
- 持久层接口:
public interface StudentMapper { ListselAll();}public interface ClazzMapper { Clazz selClazzById(int id);}
- 持久层XML文件:
id,name,age,gender,cid
2. n+1方式
思路:使用MyBatis提供的resultMap
标签,本质是Mybatis根据resultMap
和selAll
接口生成装配的Java代码。
实现:
- 业务层实现类:
public class StudentServiceImpl implements StudentService { @Override public ListselAll2() { Session session = MyBatisUtil.getSession(); StudentMapper stuMapper = session.getMapper(StudentMapper.class); List list = new ArrayList (); list = stuMapper.selAll2(); for (Student s : list) { System.out.println(s); } for (Student s : list) { s.setClazz(clsMapper.selClazzById(s.getCid())); } for (Student s : list) { System.out.println(s); } return list; }}
- 持久层接口:
public interface StudentMapper { ListselAll2();}
- 持久层XML文件:
3. 使用join语句
思路:使用MyBatis的join语句结合resultMap
标签,通过一次查询获取所有需要的信息。
实现:
- 业务层实现类:
public class StudentServiceImpl implements StudentService { @Override public ListselAll3() { Session session = MyBatisUtil.getSession(); StudentMapper stuMapper = session.getMapper(StudentMapper.class); List list = new ArrayList (); list = stuMapper.selAll3(); for (Student s : list) { System.out.println(s); } return list; }}
- 持久层接口:
public interface StudentMapper { ListselAll3();}
- 持久层XML文件:
4. 使用join语句,和resultType
思路:利用MyBatis的自动映射和``机制,代替resultMap
。
实现:
- 业务层实现类:
public class StudentServiceImpl implements StudentService { @Override public ListselAll4() { Session session = MyBatisUtil.getSession(); StudentMapper stuMapper = session.getMapper(StudentMapper.class); List list = new ArrayList (); list = stuMapper.selAll4(); for (Student s : list) { System.out.println(s); } return list; }}
- 持久层接口:
public interface StudentMapper { ListselAll4();}
- 持久层XML文件:
5. 使用注解
思路:使用Mybatis提供的注解代替XML文件(这种方法,不需要StudentMapper.xml)。
实现:
- 持久层接口:
public interface StudentMapper { @Select(value = { "select * from t_student" }) @Results(value = { @Result(column = "id", property = "id", id = true), @Result(column = "name", property = "name"), @Result(column = "age", property = "age"), @Result(column = "gender", property = "gender"), @Result(column = "cid", property = "cid"), @Result(property = "clazz", one = @One(select = "com.whl.mapper.ClazzMapper.selById"), column = "cid") }) ListselAll();}public interface ClazzMapper { @Select(value = { "select * from t_class where id = #{0}" }) Clazz selById(int id);}
总结
以上是查询学生信息时包含完整班级信息的几种方法。可以根据实际需求选择合适的方式。在实际项目中,join语句结合resultMap
标签是一种高效且常用的方法。
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月12日 20时26分05秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
23种设计模式一:单例模式
2019-03-05
Qt中的析构函数
2019-03-05
CSharp中委托(一)委托、匿名函数、lambda表达式、多播委托、窗体传值、泛型委托
2019-03-05
二叉堆的c++模板类实现
2019-03-05
C语言实现dijkstra(adjacence matrix)
2019-03-05
C语言学习从初级到精通的疯狂实战教程-徐新帅-专题视频课程
2019-03-05
三层框架+sql server数据库 实战教学-徐新帅-专题视频课程
2019-03-05
NAT工作原理
2019-03-05
Processes, threads and goroutines
2019-03-05
c++中的10种常见继承
2019-03-05
Vue学习—深入剖析渲染函数
2019-03-05
Vue学习—深入剖析函数式组件
2019-03-05
简单Makefile的编写
2019-03-05
使用BAT批处理 匹配查找指定文件夹,并在当文件夹下创建空文件
2019-03-05
wxpython的Hello,World代码探索
2019-03-05
【数字图像处理】OpenCV3 学习笔记
2019-03-05
【单片机开发】智能小车工程(经验总结)
2019-03-05
【单片机开发】基于stm32的掌上游戏机设计 (项目规划)
2019-03-05
KeepAlived介绍、配置示例、KeepAlived配置IPVS、调用脚本进行监控
2019-03-05
【Numpy学习】np.count_nonzero()用法解析
2019-03-05