业务装配实现多表查询(多对一)
mapper 层只做单表查询操作, 在 service 层进行手动装配,
实现关联查询的结果.
1.1 实体类
创建班级类(Clazz)和学生类(Student), 并在 Student 中添
加一个 Clazz 类型的属性, 用于表示学生的班级信息.
1.2 mapper 层
提供StudentMapper和ClazzMapper, StudentMapper查询所
有学生信息, ClazzMapper 根据编号查询班级信息.
select * from t_student
select * from t_class where id=#{0}
1.3 service 层
调用 mapper 层, 先查询所有学生, 再根据每个学生的班级
编号查询班级信息, 手动进行组装, 称之为业务装配.
public class StudentServiceImpl implements StudentService {
@Override
public List selAll() {
SqlSession session = MyBatisUtil.getSession();
// 学生mapper StudentMapper stuMapper = session.getMapper(StudentMapper.class);
// 班级mapper ClazzMapper clsMapper = session.getMapper(ClazzMapper.class);
// 查询所有学生信息 List list = stuMapper.selAll();
// 为每一个student组装班级信息for (Student student : list) {
student.setClazz(clsMapper.selById(student.getCid()));
}
session.close();
return list;
}
}
1.4 测试代码
public static void main(String[] args)
{ StudentService ss = new StudentServiceImpl();
List list = ss.selAll();
for (Student student : list) {
System.out.println(student);
}
}
resultMap的N+1方式实现多表查询(多对 一)
1.1 实体类
创建班级类(Clazz)和学生类(Student), 并在 Student 中添
加一个 Clazz 类型的属性, 用于表示学生的班级信息.
1.2 mapper 层
提供StudentMapper和ClazzMapper, StudentMapper查询所
有学生信息, ClazzMapper 根据编号查询班级信息. 再
StudentMapper 中使用设置装配.
a) 用于关联一个对象
property: 指定要关联的属性名
select: 设定要继续引用的查询, namespace+id
column: 查询时需要传递的列
select="com.bjsxt.mapper.ClazzMapper.selById" column="cid">
select * from t_student
select * from t_class where id=#{0}
1.3 service 层
由于装配已经完成, service 层只需要调用 mapper 即可, 不
需要再进行装配了.
public class StudentServiceImpl implements StudentService {
@Override
public List selAll() {
SqlSession session = MyBatisUtil.getSession();
// 学生mapper StudentMapper stuMapper = session.getMapper(StudentMapper.class);
List list = stuMapper.selAll();
session.close(); return list; }
}
resultMap 的关联方式实现多表查询(多 对一)
1.1 mapper 层
a) 在 StudentMapper.xml 中定义多表连接查询 SQL 语句, 一
次性查到需要的所有数据, 包括对应班级的信息.
b) 通过定义映射关系, 并通过指
定对象属性的映射关系. 可以把看成一个
使用. javaType 属性表示当前对象, 可以写
全限定路径或别名.
select World's shortest URL shortener sid, s.name sname, s.age, s.gender, c.id cid, c.name cname, c.room from t_student s left join t_class c on s.cid=c.id
resultMap的N+1方式实现多表查询(一对 多)
1.1 实体类
在班级类中定义一个学生集合, 用于存放该班级的所有学生
信息.
1.2 mapper 层
提供ClazzMapper和StudentMapper, ClazzMapper查询所有
班级信息, StudentMapper 根据班级编号查询学生信息.
在 ClazzMapper 中使用设置装配.
a) 用于关联一个集合
property: 指定要关联的属性名
select: 设定要继续引用的查询, namespace+id
column: 查询时需要传递的列
select * from t_class
select * from t_student where cid=#{0}
1.3 service 层
public class ClazzServiceImpl implements ClazzService {
@Override
public List
selAll() {
SqlSession session = MyBatisUtil.getSession();
ClazzMapper mapper = session.getMapper(ClazzMapper.class);
List list = mapper.selAll();
session.close();
return list;
} }
resultMap的关联方式实现多表查询(一对多)
a) 在 ClazzMapper.xml 中定义多表连接查询 SQL 语句, 一次
性查到需要的所有数据, 包括对应学生的信息.
b) 通过定义映射关系, 并通过指
定集合属性泛型的映射关系. 可以把看成一
个使用. ofType 属性表示集合的泛型, 可以
写全限定路径或别名.
select c.id cid, c.name cname, c.room, World's shortest URL shortener sid, s.name sname, s.age, s.gender from t_student s right join t_class c on s.cid=c.id
通过 Auto-Mapping 实现多表查询
自动关联最爽,最简单的多表关联方式
a) 通过 MyBatis 的 Auto-Mapping 机制及数据库查询时的别
名结合, 可以方便的实现多表查询.
b) SQL 语句中, 别名出现特殊符号时, 必须进行处理. MySQL
可以使用(``)符号, Oracle 可以使用("")符号.
select World's shortest URL shortener, s.name, s.age, s.gender, s.cid, c.id `clazz.id`, c.name `clazz.name`, c.room `clazz.room` from t_student s left join t_class c on s.cid=c.id
注解的多表关联
最最最爽的多表关联只有更简单,没有最简单
@Results: 类似于
@Result: 类似于的子标签
@One: 类似于
@Many: 类似于 public interface StudentMapper {
@Select("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.bjsxt.mapper.ClazzMapper.selById"), column="cid") })
List sel();
}
public interface ClazzMapper {
@Select("select * from t_class where id=#{0}") Clazz selById(int id); }