mybatis连接mysql多表查询_mybatis多表链接详解

本文介绍了如何在MyBatis中实现多表查询,包括业务装配实现多表查询,ResultMap的N+1方式、关联方式实现多表查询,以及自动映射和注解方式的多表关联。详细讲解了在mapper和服务层的配置和使用,以实现多对一和一对多的关系查询。
摘要由CSDN通过智能技术生成

业务装配实现多表查询(多对一)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值