所谓复杂环境就是多表查询的实现准备工作环境搭建步骤:
- 数据库
- maven工程,导包
- 核心配置文件(mybatis-config.xml)
- db.properties配置
- pojo实体类(Teacher,Student)
- 接口(TeacherMapper,StudentMapper)
- 编写与接口对应(TeacherMapper.xml,StudentMapper.xml)
- 工具类(Utils)
1.数据库创建
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');
之后步骤可以参考Mybatis入门
注意外键在实体类中的设置
按条件嵌套处理
1.给StudentMapper接口增加方法:
public interface StudentMapper {
//获取所有学生对应的老师信息
public List<Student>getstudent();
}
2.编写接口对应的StudentMapper.xml
<?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.fanlan.Dao.StudentMapper">
<!-- 子查询
1. 获取所有学生的信息
2. 根据获取的学生信息的老师ID->获取该老师的信息
3. 使用sql语句我们可以这样实现
4. select * from student s,teacher t where t.id = s.tid;
5. 那使用mybatis该如何实现了?
6. 使用结果集映射 Studentteacher ,其结果集的类型为 Student ,学生中老师的属性为teacher,对应数据库中为tid。多个 [1,...)学生关联一个老师=> 一对一,一对多
7. 查看官网找到:association – 一个复杂类型的关联;使用它来处理关联查询
-->
<select id="getstudent" resultMap="Studentteacher">
select * from student
</select>
<resultMap id="Studentteacher" type="Student">
<result property="id" column="id"/>
<result property="name" column="name"/>
<!--association关联属性 property属性名 javaType属性类型 column在多的一方的表中的列名-->
<association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>
<!--这里传递过来的id,只有一个属性的时候,下面可以写任何值
association中column多参数配置:column="{key=value,key=value}"
其实就是键值对的形式,key是传给下个sql的取值名称,value是片段一中sql查询的字段名。
-->
<select id="getTeacher" resultType="Teacher">
select * from teacher where id =#{tid}
</select>
</mapper>
流程图:
3、编写完毕去Mybatis配置文件中,注册Mapper!
4.测试
public void Test1(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> getstudent = mapper.getstudent();
for (Student student : getstudent) {
System.out.println(student);
}
sqlSession.close();
}
测试结果:
按结果嵌套处理
1、接口方法编写
public interface StudentMapper {
//获取所有学生对应的老师信息
public List<Student>getstudent();
}
2、编写对应的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.fanlan.Dao.StudentMapper">
<!--结果嵌套查询:直接查询出结果,进行结果集的映射-->
<select id="getStudent1" resultMap="studentteacher">
<!--在数据库中sql语句,能够得到险要的结果-->
select
s.id sid,
s.name sname,
t.name tname
from student s ,teacher t
where s.tid=t.id
</select>
<resultMap id="studentteacher" type="student" >
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<!--关联对象property 关联对象,在Student实体类中的属性-->
<association property="teacher" javaType="Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
</mapper>
流程图:
3、编写完毕去Mybatis配置文件中,注册Mapper!
4、测试
@Test
public void Test2(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
List<Student> getstudent = mapper.getStudent1();
for (Student student : getstudent) {
System.out.println(student);
}
sqlSession.close();
}
测试结果:
小结
按照查询进行嵌套处理就像SQL中的子查询
按照结果进行嵌套处理就像SQL中的联表查询