一.基本知识
(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>