Lombok、多对一处理、一对多处理
9、Lombok
使用步骤:
-
在IDEA中安装Lombok插件!(File->setting->Piugings)(我的IDEA没找到这个插件)
-
在项目中导入lombok的jar包
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency> -
在实体类中加注解即可
10、多对一处理
-
多个学生,对应一个老师
-
对于学生这边而言,关联...多个学生,关联一个老师【多对一】
-
对于老师而言,集合, 一个老师,有很多学生【一对多】

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'); `student`
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');•
测试环境搭建
-
导入lombok
-
新建实体类Teacher,Student
-
建立Mapper接口
-
建立Mapper.xml文件
-
在核心配置文件中绑定注册我们的Mapper接口或者文件!【方式很多,随心选】
-
测试查询是否能够成功!
按照查询嵌套处理
<select id="getStudent" resultMap="StudentTeacher">
-- select s.id,s.name,t.name from student s,teacher t where s.tid=t.id
select * from student
</select>
<resultMap id="StudentTeacher" type="com.kuang.pojo.Student">
<result property="id" column="id"></result>
<result property="name" column="name"></result>
<!-- 复杂的属性,我们需要单独处理
对象:association
集合:collection
-->
<association property="teacher" column="tid" javaType="com.kuang.pojo.Teacher" select="getTeacher"></association>
</resultMap>
<select id="getTeacher" parameterType="int" resultType="com.kuang.pojo.Teacher">
select * from teacher where id=#{id}
</select>
按照结果嵌套处理
<!-- 按照结果嵌套处理-->
<select id="getStudent2" resultMap="StudentTeacher2">
select s.id sid,s.name sname,t.name tname
from student s,teacher t
where s.tid=t.id
</select>
<resultMap id="StudentTeacher2" type="com.kuang.pojo.Student">
<result property="id" column="sid"></result>
<result property="name" column="sname"></result>
<association property="teacher" javaType="com.kuang.pojo.Teacher" >
<result property="name" column="tname"></result>
<result property="id" column="tid"></result>
</association>
</resultMap>
回顾Mysql多对一查询方式:
-
子查询
-
联表查询
11、1对多处理
比如:一个老师拥有多个学生!
对于老师而言,就是一对多的关系
环境搭建,和刚才一样
实体类
public class Student {
private int id;
private String name;
//学生需要关联一个老师!
private int tid;
public class Teacher {
private int id;
private String name;
//一个老师拥有多个学生
private List<Student> students;
按照结果嵌套处理
<select id="getTeacher" resultMap="TeacherStudent">
select s.id sid, s.name sname, t.name tname, t.id tid
from student s, teacher t
where s.tid = t.id and t.id = #{tid}
</select>
<resultMap id="TeacherStudent" type="com.kuang.pojo.Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<!-- 复杂的属性,我们需要单独处理 对象:association 集合:collection
javaType="" 指定属性的类型!
集合中的泛型信息,我们使用ofType获取
-->
<collection property="students" ofType="com.kuang.pojo.Student" >
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>
按照查询嵌套处理
<select id="getTeacher2" resultMap="TeacherStudent2">
select * from mybatis.teacher where id = #{tid}
</select>
<resultMap id="TeacherStudent2" type="com.kuang.pojo.Teacher">
<result property="id" column="id"></result>
<!-- column="id" 指的是上面老师传进来的id -->
<collection property="students" javaType="ArrayList" select="getStudentByTeacherId" ofType="com.kuang.pojo.Student" column="id"></collection>
</resultMap>
<select id="getStudentByTeacherId" resultType="com.kuang.pojo.Student">
select * from mybatis.student where tid=#{tid}
</select>
小结
-
关联 - association 【多对一】
-
集合 - collection 【一对多】
-
javaType & ofType
-
JavaType 用来指定实体类中属性的类型
-
ofType 用来指定映射到List或者集合中的pojo类型,泛型中的约束类型!
-
association和collection中的peopertiy是写实体类中所定义的那个对象例如:
private List<Student> students; //老师中就是students
//学生需要关联一个老师!
private Teacher teacher; // 学生中就是写teacher
注意点:
-
保证SQL的可读性,尽量保证通俗易懂
-
注意一对多和多对一中,属性名和字段的问题!
-
如果问题不好排查错误,可以使用日志,建议使用Log4j
面试高频
-
Mysql引擎
-
InnoDB底层原理
-
索引
-
索引优化!
浙公网安备 33010602011771号