文章目录
在我们创建的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);
刷新数据库
多对一处理
多个对象对应一个对象
比如:多个学生对应一个老师
<1.项目结构
<2.实体类
Student
package priv.sehun.pojo;
public class Student {
private int id;
private String name;
private Teacher teacher;
public Student() {
}
public Student(int id, String name, Teacher teacher) {
this.id = id;
this.name = name;
this.teacher = teacher;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", teacher=" + teacher +
'}';
}
}
Teacher
package priv.sehun.pojo;
public class Teacher {
private int id;
private String name;
public Teacher() {
}
public Teacher(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Teacher{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
❤️.dao接口
public interface StudentDao {
//获得所有学生信息以及他们对应的老师名字
//方式一
List<Student> getStudentsModeOne();
//方式二
List<Student> getStudentsModeTwo();
}
<4.dao接口对应的Mapper映射文件
studentDaoMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--mapper标签的namespace对应Mapper接口的类-->
<mapper namespace="priv.sehun.dao.StudentDao">
<!--方式一-->
<select id="getStudentsModeOne" resultMap="StudentTeacher">
select * from mybatis.student
</select>
<resultMap id="StudentTeacher" type="priv.sehun.pojo.Student">
<id column="id" property="id"/>
<result column="name" property="name"/>
<association column="tid" property="teacher" javaType="priv.sehun.pojo.Teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="priv.sehun.pojo.Teacher">
select * from mybatis.teacher where id = #{id}
</select>
<!--=========================================================================================-->
<!--方式二-->
<select id="getStudentsModeTwo" resultMap="StudentTeacher2">
select s.id,s.name,t.name as tname from mybatis.student as s, mybatis.teacher as t
where s.tid = t.id
</select>
<!--设置结果集映射ResultMap -->
<resultMap id="StudentTeacher2" type="priv.sehun.pojo.Student">
<id property="id" column="id"/>
<result property="name" column="name"/>
<!--直接关联一个老师-->
<association property="teacher" javaType="priv.sehun.pojo.Teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
</mapper>
<5.工具类
MyBatisUtils
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
}
<6.在mybatis配置文件中绑定Mapper映射文件
mybatis-config.xml
<!--关联映射文件-->
<mappers>
<mapper resource="priv/sehun/dao/studentDaoMapper.xml"/>
</mappers>
<7.测试类
public class StudentDaoTest {
@Test
public void getStudentsModeOne(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentDao mapper = sqlSession.getMapper(StudentDao.class);
List<Student> students = mapper.getStudentsModeOne();
for (Student student : students) {
System.out.println("学生姓名:"+student.getName()+" 老师姓名:"+student.getTeacher().getName());
}
}
@Test
public void getStudentsModeTwo(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentDao mapper = sqlSession.getMapper(StudentDao.class);
List<Student> students = mapper.getStudentsModeTwo();
for (Student student : students) {
System.out.println("学生姓名:"+student.getName()+"\t老师姓名:"+student.getTeacher().getName());
}
}
}
<8.运行结果
方式一:
一对多处理
一个对象对应多个对象
比如一个老师对应多个学生
<1.项目结构
<2.实体类
Student
package priv.sehun.pojo;
public class Student {
private int id;
private String name;
private Teacher teacher;
public Student() {
}
public Student(int id, String name, Teacher teacher) {
this.id = id;
this.name = name;
this.teacher = teacher;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", teacher=" + teacher +
'}';
}
}
Teacher
package priv.sehun.pojo;
import java.util.List;
public class Teacher {
private int id;
private String name;
private List<Student> students;
public Teacher() {
}
public Teacher(int id, String name, List<Student> students) {
this.id = id;
this.name = name;
this.students = students;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "Teacher{" +
"id=" + id +
", name='" + name + '\'' +
", students=" + students +
'}';
}
}
❤️.dao接口
TeacherDao
package priv.sehun.dao;
import priv.sehun.pojo.Teacher;
public interface TeacherDao {
//获得一个老师对应的所有学生信息
//方式一
Teacher getTeacherModeOne(int id);
//方式二
Teacher getTeacherModeTwo(int id);
}
<4.dao接口对应的Mapper映射文件
teacherDaoMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="priv.sehun.dao.TeacherDao">
<!--方式一-->
<select id="getTeacherModeOne" resultMap="TeacherStudent">
select s.name sname,s.id sid,t.id tid, t.name tname
from mybatis.student as s,mybatis.teacher as t
where s.tid = t.id and t.id = #{id}
</select>
<resultMap id="TeacherStudent" type="priv.sehun.pojo.Teacher">
<result property="name" column="tname"/>
<collection property="students" ofType="priv.sehun.pojo.Student">
<id property="id" column="sid"/>
<result property="name" column="sname"/>
</collection>
</resultMap>
<!--======================================================================================-->
<!--方式二-->
<select id="getTeacherModeTwo" resultMap="TeacherStudent2">
select * from mybatis.teacher where id = #{id}
</select>
<resultMap id="TeacherStudent2" type="priv.sehun.pojo.Teacher">
<collection property="students" javaType="ArrayList" ofType="priv.sehun.pojo.Student" column="id" select="T2"/>
</resultMap>
<select id="T2" resultType="priv.sehun.pojo.Student">
select * from mybatis.student where tid = #{id}
</select>
</mapper>
<5.工具类
MyBatisUtils
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
//在maven中,所有的资源文件一般都放在resources目录下,我们可以直接拿到。
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//设置SqlSessionFactory公共的方法
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
//获得一个带事务自动提交功能的SqlSession公共的方法
public static SqlSession getSqlSession(){
//自动提交事务
return sqlSessionFactory.openSession(true);
}
}
<6.在mybatis配置文件中绑定Mapper映射文件
<!--关联映射文件-->
<mappers>
<mapper resource="priv/sehun/dao/teacherDaoMapper.xml"/>
</mappers>
<7.测试类
public class TeacherDaoTest {
@Test
public void getTeacherModeOne(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
TeacherDao mapper = sqlSession.getMapper(TeacherDao.class);
Teacher teacher = mapper.getTeacherModeOne(1);
System.out.println(teacher.getName());
System.out.println(teacher.getStudents());
}
@Test
public void getTeacherModeTwo(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
TeacherDao mapper = sqlSession.getMapper(TeacherDao.class);
Teacher teacher = mapper.getTeacherModeTwo(1);
System.out.println(teacher.getName());
System.out.println(teacher.getStudents());
}
}
<8.运行结果
方式二: