-
mybatis中复杂查询(多对一和一对多)1-环境搭建
一.基本知识
(1).多对一的理解(以学生和老师为例子)
老师角度:一个老师会教多个学生【一对多】
学生角度:多个学生对应一个老师【多对一】
(2).如何处理:比较常见的两种方式,一个是联表查询,一个是子查询
二.举例说明
(1).数据库设计,执行SQL的时候不要直接全选一块执行,一个代码块一个代码块的执行,一起执行的话可能会报错,因为sql的执行速度很快,有可能在你创表之前就会执行insert语句。
//使用名为mybatis的数据库
USE mybatis
//建表
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');
(2).项目目录图:entity存放实体类,mapper存放接口和局部配置文件(相当于dao层),util存放公共的工具类,test来测试效果用的,resources就不说了。
(3).新建一个maven项目,先把基本的环境搭建起来,在pom.xml文件里引入Lombok依赖;在resources文件夹下新建一个db.properties和mybatis-config.xml文件,db.properties用来存放连接数据库的基本配置信息,mybatis-config.xml是这个项目的全局配置文件(核心配置文件)。
//引入依赖
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
#db.properties配置文件
url=jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
driver=com.mysql.jdbc.Driver
username=root
password=123456
<!--核心配置文件-->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--引入外部配置文件-->
<properties resource="db.properties"></properties>
<!--日志设置-->
<settings>
<!--标准的日志工厂实现-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--typeAliases的使用,给实体类起别名-->
<typeAliases>
<typeAlias type="com.xiaoma.entity.Teacher" alias="Teacher"></typeAlias>
<typeAlias type="com.xiaoma.entity.Student" alias="Student"></typeAlias>
</typeAliases>
<!--连接数据库的基本参数-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--通过${}绑定外部配置文件的属性-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
</configuration>
(4).在com.xiaoma.entity文件夹下新建和数据库表对应的两个实体类,一个是Teacher一个是Student
package com.xiaoma.entity;
import lombok.Data;
@Data
public class Teacher {
private int id;
private String name;
public Teacher() {
}
public Teacher(int id, String name) {
this.id = id;
this.name = name;
}
}
package com.xiaoma.entity;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
//虽然我们数据库中student表是id,name,tid字段,但是这里不能写tid,因为这里有个关联,在学生实体类中要把老师关联进来,如果写成tid那么这两个实体类就毫无关系啊,就没有什么一对多和多对一这种了
private Teacher teacher;
public Student() {
}
public Student(int id, String name, Teacher teacher) {
this.id = id;
this.name = name;
this.teacher = teacher;
}
}
(5).有了实体类就要写mapper接口和对应的配置文件了;在mapper文件夹下新建两个接口一个是TeacherMapper一个是StudentMapper;里面代码是空的,这里就不弄代码了。
(6).在一个mapper就要对应一个xml对吧,所以还要再创建两个和mapper对应的xml,一般情况下mapper文件夹下如果只有一个mapper接口的话其对应的xml文件直接在mapper文件夹写就行,如果是多个mapper接口,就吧mapper接口对应的xml文件放在resources文件夹下,在这个文件夹下新建一个和mapper接口对应的目录,然后在里面建立两个和mapper接口对应的xml文件;一个绑定TeacherMapper接口一个绑定StduentMapper接口。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiaoma.mapper.TeacherMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiaoma.mapper.StudentMapper">
</mapper>
(7).在全局配置文件注册上面的两个xml文件。在mybatis-config.xml文件中添加如下代码,至此环境搭建完成。
<mappers>
<mapper class="com.xiaoma.mapper.TeacherMapper"></mapper>
<mapper class="com.xiaoma.mapper.StudentMapper"></mapper>
</mappers>