关联查询的实现方法-使用mybatis框架
发布日期: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 List
selAll() {
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 {
List
selAll();
}
public interface ClazzMapper {
Clazz selClazzById(int id);
}
  • 持久层XML文件
id,name,age,gender,cid

2. n+1方式

思路:使用MyBatis提供的resultMap标签,本质是Mybatis根据resultMapselAll接口生成装配的Java代码。

实现

  • 业务层实现类
public class StudentServiceImpl implements StudentService {
@Override
public List
selAll2() {
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 {
List
selAll2();
}
  • 持久层XML文件

3. 使用join语句

思路:使用MyBatis的join语句结合resultMap标签,通过一次查询获取所有需要的信息。

实现

  • 业务层实现类
public class StudentServiceImpl implements StudentService {
@Override
public List
selAll3() {
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 {
List
selAll3();
}
  • 持久层XML文件

4. 使用join语句,和resultType

思路:利用MyBatis的自动映射和``机制,代替resultMap

实现

  • 业务层实现类
public class StudentServiceImpl implements StudentService {
@Override
public List
selAll4() {
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 {
List
selAll4();
}
  • 持久层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")
})
List
selAll();
}
public interface ClazzMapper {
@Select(value = {
"select * from t_class where id = #{0}"
})
Clazz selById(int id);
}

总结

以上是查询学生信息时包含完整班级信息的几种方法。可以根据实际需求选择合适的方式。在实际项目中,join语句结合resultMap标签是一种高效且常用的方法。

上一篇:mybatis的运行原理
下一篇:shell编程学习

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月12日 20时26分05秒