多对一处理
- 多个学生,对应一个老师
- 对于学生而言 多个学生关联一个老师
(多对一) - 对于老师而言 集合一个老师有很多个学生
(一对多)
案例实操
数据库
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');
测试环境搭建
1.导入lombok
<dependencies>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
</dependencies>
2.新建实体类Student,Teacher
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private int id;
private String name;
/**
* 学生需要关联一位老师
*/
private Teacher teacher;
}
// Teacher
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {
private int id;
private String name;
}
3.建立mapper接口
public interface TeacherMapper {
/**
* 查询接口测试
* @param id
* @return
*/
@Select("select * from teacher where id=#{tid}")
Teacher getTeacher(@Param("tid") int id);
}
4.建立mapper.XML文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatisstudy.dao.TeacherMapper">
</mapper>
在核心配置文件中绑定注册Mapper接口或者文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件-->
<configuration>
<!--映入外部配置文件-->
<properties resource="db.properties">
<!--可以全写在db.properties里 也可以两边搭配混合都能实现效果,如果存在 优先使用外部配置文件-->
<!-- <property name="username" value="root"/>-->
<!-- <property name="password" value="123456"/>-->
</properties>
<!--设置 日志配置logImpl规范填写,严格区分大小写,空格-->
<settings>
<!--标准的日志工厂实现-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!--LOG4J-->
<!-- <setting name="logImpl" value="LOG4J"/>-->
</settings>
<!--设置类型别名-->
<typeAliases>
<!--给实体类起别名-->
<!-- <typeAlias type="mybatisstudy.pojo.User" alias="User"></typeAlias>-->
<!--配置包名-->
<package name="com.mybatisstudy.pojo" />
</typeAliases>
<!--default 切换环境-->
<environments default="development">
<!--开发环境-->
<environment id="development">
<!--事务管理器 默认事务处理器JDBC-->
<transactionManager type="JDBC"/>
<!--数据源 默认POOLED / UNPOOLED-->
<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>
<!--绑定接口-->
<mappers>
<mapper class="com.mybatisstudy.dao.TeacherMapper"></mapper>
<mapper class="com.mybatisstudy.dao.StudentMapper"></mapper>
</mappers>
</configuration>
6.测试
@Test
public void testQueryTeacher(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
Teacher teacher = mapper.getTeacher(1);
System.out.println(teacher);
sqlSession.close();
}
重点错误解析
invalid bound statement (not found)是由于xml映射文件错误引起的,需要核对mapper文件包名,配置文件有无指定包名,配置文件注册mapper组件路径,resources下建立包应该注意,挨个建立,一次建立可能无法识别.