我是靠谱客的博主 阳光鞋垫,最近开发中收集的这篇文章主要介绍Mybatis 札记(四、复杂查询环境搭建、多对一、一对多查询)麻雀虽小,五脏俱全一:复杂查询环境搭建二:开始多对一查询二:开始一对多查询总结:,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
一:复杂查询环境搭建
1、新建module
2、编写数据库表
CREATE TABLE `teacher` (
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO teacher(`id`, `name`) VALUES (1, '三上老师');
CREATE TABLE `student` (
`id` INT(10) NOT NULL,
`name` VARCHAR(30) DEFAULT NULL,
`tid` INT(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fktid` (`tid`),
CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (1, '小明', 1);
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (2, '小红', 1);
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (3, '小张', 1);
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (4, '小李', 1);
INSERT INTO `student` (`id`, `name`, `tid`) VALUES (5, '小王', 1);
3、新建实体类
teacher类
package com.csnz.pojo;/*
*
*@create 2021-07-20-21:56
*/
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
private int id;
private String name;
}
student类
package com.csnz.pojo;/*
*
*@create 2021-07-20-21:55
*/
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private int id;
private String name;
private Teacher teacher;
}
4、建立实体类对应的Mapper接口
StudentMapper接口
package com.csnz.dao;/*
*
*@create 2021-07-20-22:06
*/
public interface StudentMapper {
}
TeacherMapper接口
package com.csnz.dao;/*
*
*@create 2021-07-20-22:06
*/
import com.csnz.pojo.Teacher;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
public interface TeacherMapper {
//根据id查询老师信息
@Select("select * from teacher where id = #{tid}")
Teacher findById(@Param("tid") int id);
}
5、建立对应的Mapper.XML文件
记得绑定namespace
6、在核心配置文件中绑定注册的Mapper
7、测试
二:开始多对一查询
问题:查询所有学生信息,其中包含老师信息
思路:查询所有学生信息,再根据学生的tid,去查询对应的老师 ( 子查询 )
方式一:按照查询嵌套处理
类似MySQL中的子查询 查询语句中嵌套查询语句
1、StudentMapper接口中编写方法
2、在对应的StudentMapper.xml中 编写SQL
<!-- 方式一:按照查询嵌套处理 类似MySQL中的子查询 查询语句中嵌套查询语句-->
<resultMap id="StudentWithTeacher" type="student">
<!-- 下面allStudent方法的sql是select * from student 所以这可以省略
<result property="id" column="id" />-->
<!-- <result property="name" column="name"/>-->
<!-- 复杂的属性,对象:association 集合:collection
此时学生属性property 对应的是 教师这个对象 他在数据库中的字段为tid
另加两个属性 javaType : 对象类型; select : 方法id
-->
<association property="teacher" column="tid" javaType="teacher" select="allTeacher"/>
</resultMap>
<select id="allStudent" resultMap="StudentWithTeacher">
select * from student;
</select>
<select id="allTeacher" resultType="teacher">
select * from teacher;
</select>
结果:
方式二:按照结果嵌套处理
类似MySQL中的联表查询
1、StudentMapper接口中编写方法
2、在对应的StudentMapper.xml中 编写SQL
<!-- 方式二:按照结果嵌套处理 类似MySQL中的联表查询-->
<select id="allStudent2" resultMap="StudentWithTeacher2">
select s.id as sid,s.name as sname,t.id as tid ,t.name as tname from
student as s ,teacher as t
where s.tid = t.id;
</select>
<resultMap id="StudentWithTeacher2" type="student">
<!-- 这里不能省略id 和 name 不然会找不到值
上面的sql需使用别名 因为下面的column需 使用别名进行辨别是哪张表
-->
<result property="id" column="sid" />
<result property="name" column="sname"/>
<association property="teacher" javaType="teacher" >
<result property="id" column="tid"/>
<result property="name" column="tname"/>
</association>
</resultMap>
结果:
二:开始一对多查询
问题:查询指定老师信息,其中包含学生列表信息
思路:查询指定老师信息,再根据老师的id 和 学生的tid,去查询对应的学生 ( 子查询 )
方式一:按照查询嵌套处理
类似MySQL中的子查询 查询语句中嵌套查询语句
1、TeacherMapper接口中编写方法
//获取指定老师
Teacher OneTeacher2(@Param("tid") int id);
2、TeacherMapper.xml中编写sql
<resultMap id="OneTeacherToStudents2" type="teacher">
<result property="id" column="id"/>
<!-- 此时 column="id" 这个id 就是传递给 getStudent 方法的值 -->
<collection property="students" column="id" ofType="Student" javaType="ArrayList" select="getStudent"/>
</resultMap>
<select id="OneTeacher2" resultMap="OneTeacherToStudents2">
select * from teacher where id = #{tid}
</select>
<select id="getStudent" resultType="student">
select * from student where tid = #{tid};
</select>
方式二:按照结果嵌套处理
类似MySQL中的联表查询
1、TeacherMapper接口中编写方法
//获取指定老师
Teacher OneTeacher(@Param("tid") int id);
2、TeacherMapper.xml中编写sql
<select id="OneTeacher" resultMap="OneTeacherToStudents" >
select s.id as sid , s.name as sname , s.tid as stid , t.name as tname , t.id as tid
from student as s,teacher as t
where s.tid = t.id and t.id = #{tid}
</select>
<resultMap id="OneTeacherToStudents" type="teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<!-- 复杂的属性 对象:association 集合: collection
javaType : 指定属性的类型
集合中的泛型信息,我们使用ofType获取
-->
<collection property="students" ofType="student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="stid"/>
</collection>
</resultMap>
查询结果
Opening JDBC Connection
Created connection 789653861.
==> Preparing: select * from teacher where id = ?
==> Parameters: 1(Integer)
<== Columns: id, name
<== Row: 1, 三上老师
====> Preparing: select * from student where tid = ?;
====> Parameters: 1(Integer)
<==== Columns: id, name, tid
<==== Row: 1, 小明, 1
<==== Row: 2, 小红, 1
<==== Row: 3, 小张, 1
<==== Row: 4, 小李, 1
<==== Row: 5, 小王, 1
<==== Total: 5
<== Total: 1
Teacher(id=1, name=三上老师, students=[Student(id=1, name=小明, tid=1), Student(id=2, name=小红, tid=1), Student(id=3, name=小张, tid=1), Student(id=4, name=小李, tid=1), Student(id=5, name=小王, tid=1)])
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@2f112965]
Returned connection 789653861 to pool.
总结:
1、关联 : association [ 多对一 ]
2、集合 :collection [ 一对多 ]
3、javaType 和 ofType 的区别
-
1、javaType 用来指定实体类中属性的类型
-
2、ofType 用来指定映射到集合中的 Pojo类型,通俗来讲就是泛型
最后
以上就是阳光鞋垫为你收集整理的Mybatis 札记(四、复杂查询环境搭建、多对一、一对多查询)麻雀虽小,五脏俱全一:复杂查询环境搭建二:开始多对一查询二:开始一对多查询总结:的全部内容,希望文章能够帮你解决Mybatis 札记(四、复杂查询环境搭建、多对一、一对多查询)麻雀虽小,五脏俱全一:复杂查询环境搭建二:开始多对一查询二:开始一对多查询总结:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复