一对一建表完全相同,只是没有设置外键索引的唯一性
A如果查询老师信息,那么左连接时老师的表要放在左边,反之查询课程信息,课程表左连接时放在左边
B老师对应得课程是多个,所以在定义返回值resultMap的时候,课程要使用Collection标签,并且返回类型为ofType
C课程对应的老师只有一个,所以在定义返回值resultMap的时候,老师使用的是association标签,并且返回类型为 javaType
teacher代码
package javastudy;
import java.util.List;
public class Teacher {
private int id;
private String name;
private String sex;
private String phone;
//因为一个老师可能对应多个课程,所以课程要定义为一个List
private List<Course> courses;
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 String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public List<Course> getCourses() {
return courses;
}
public void setCourses(List<Course> courses) {
this.courses = courses;
}
@Override
public String toString() {
return "Teacher [id=" + id + ", name=" + name + ", sex=" + sex + ", phone=" + phone + ", courses=" + courses
+ "]";
}
}
course代码
package javastudy;
public class Course {
private int id;
private String name;
private String type;
private String hours;
private 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 String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getHours() {
return hours;
}
public void setHours(String hours) {
this.hours = hours;
}
public Teacher getTeacher() {
return teacher;
}
public void setTeacher(Teacher teacher) {
this.teacher = teacher;
}
@Override
public String toString() {
return "Course [id=" + id + ", name=" + name + ", type=" + type + ", hours=" + hours + ", techer=" + teacher
+ "]";
}
}
teacherMapper 接口
package javastudy;
public interface TeacherMapper {
public void add(Teacher teacher);
public Teacher get(int id);
public void delete(int id);
public void update(Teacher teacher);
}
courseMapper接口
package javastudy;
public interface CourseMapper {
public void add(Course course);
public Course get(int id);
public void delete(int id);
public void update1(Course course);
public void update2(Course course);
}
teacherMapper.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="javastudy.TeacherMapper">
<insert id="add" parameterType="javastudy.Teacher" useGeneratedKeys="true" keyProperty="id">
insert into teacher
(
name,
sex,
phone
)
values
(
#{name},
#{sex},
#{phone}
)
</insert>
<!--提取老师要是连课程一起提取,课程是List类型 -->
<select id="get" parameterType="javastudy.Teacher" resultMap="teacher">
select
t.id tid,
t.name tname,
t.sex tsex,
t.phone tphone,
c.id cid,
c.name cname,
c.type ctype,
c.hours chours
from
teacher t
left join
course c
on
c.tid=t.id
where
t.id=#{id}
</select>
<!-- 对上面的resultMap做一个说明,注意id要和上面的result名对应 -->
<resultMap type="javastudy.Teacher" id="teacher">
<id property="id" column="tid"/>
<result property="name" column="tname"/>
<result property="sex" column="tsex"/>
<result property="phone" column="tphone"/>
<!-- 由于teacher和course是一对多的关系,所以使用collection,courses为Course类的属性 -->
<collection property="courses" ofType="javastudy.Course">
<id property="id" column="cid"/>
<result property="name" column="cname"/>
<result property="type" column="ctype"/>
<result property="hours" column="chours"/>
</collection>
</resultMap>
<delete id="delete" parameterType="int">
delete from teacher where id=#{id}
</delete>
<update id="update">
update teacher set name=#{name},sex=#{sex} where id=#{id}
</update>
</mapper>
courseMapper.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="javastudy.CourseMapper">
<insert id="add" parameterType="javastudy.Course">
insert into course
(
tid,
name,
type,
hours
)
values
(
#{teacher.id},
#{name},
#{type},
#{hours}
)
</insert>
<select id="get" parameterType="javastudy.Course" resultMap="course">
select
c.id cid,
c.name cname,
c.type ctype,
c.hours chours,
t.id tid,
t.name tname,
t.sex tsex,
t.phone tphone
from
course c
left join
teacher t
on
c.tid=t.id
where
c.id=#{id}
</select>
<resultMap type="javastudy.Course" id="course">
<id property="id" column="cid"/>
<result property="name" column="cname"/>
<result property="type" column="ctype"/>
<result property="hours" column="chours"/>
<association property="teacher" javaType="javastudy.Teacher">
<id property="id" column="tid"/>
<result property="name" column="tname"/>
<result property="sex" column="tsex"/>
<result property="phone" column="tphone"/>
</association>
</resultMap>
<delete id="delete" parameterType="int">
delete from course where id=#{id}
</delete>
<update id="update1" parameterType="javastudy.Course">
update course set name=#{name},type=#{type},hours=#{hours} where id=#{id}
</update>
<update id="update2" parameterType="javastudy.Course">
update course set tid=#{teacher.id} where id=#{id}
</update>
</mapper>
测试类代码
package test;
import java.io.IOException;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import javastudy.Course;
import javastudy.CourseMapper;
import javastudy.Teacher;
import javastudy.TeacherMapper;
import utility.MyBatisUtils;
class Mytest {
@Test
public void testInsert() throws IOException {
SqlSession session=MyBatisUtils.openSession();
TeacherMapper tMapper=session.getMapper(TeacherMapper.class);
Teacher teacher=new Teacher();
teacher.setName("谭浩强");
teacher.setSex("男");
teacher.setPhone("13876548861");
tMapper.add(teacher);
CourseMapper cMapper=session.getMapper(CourseMapper.class);
Course course=new Course();
course.setName("C语言入门与提高");
course.setType("必修");
course.setHours("60");
course.setTeacher(teacher);
cMapper.add(course);
Course course2=new Course();
course2.setName("精通Java基础");
course2.setType("选修");
course2.setHours("30");
course2.setTeacher(teacher);
cMapper.add(course2);
session.commit();
session.close();
}
@Test
public void testSelect() throws IOException
{
SqlSession session=MyBatisUtils.openSession();
// TeacherMapper tMapper=session.getMapper(TeacherMapper.class);
// Teacher teacher=tMapper.get(1);
// System.out.println(teacher.getCourses());
CourseMapper cMapper=session.getMapper(CourseMapper.class);
Course course=cMapper.get(1);
System.out.println(course.getTeacher());
session.close();
}
@Test
public void testDelete() throws IOException
{
SqlSession session=MyBatisUtils.openSession();
// TeacherMapper tMapper=session.getMapper(TeacherMapper.class);
// tMapper.delete(1);
// session.commit();
// session.close();
CourseMapper cMapper=session.getMapper(CourseMapper.class);
cMapper.delete(3);
session.commit();
session.close();
}
@Test
public void testUpdate() throws IOException
{
SqlSession session=MyBatisUtils.openSession();
// TeacherMapper tMapper=session.getMapper(TeacherMapper.class);
// Teacher teacher=new Teacher();
// teacher.setId(2);
// teacher.setName("雷军");
// teacher.setSex("男");
// tMapper.update(teacher);
// session.commit();
// session.close();
//通过id修改非关联表字段
// CourseMapper cMapper=session.getMapper(CourseMapper.class);
// Course course=new Course();
// course.setId(2);
// course.setName("安卓入门与提高");
// course.setType("必修");
// course.setHours("30");
// cMapper.update1(course);
// session.commit();
// session.close();
//通过id修改关联表字段
CourseMapper cMapper=session.getMapper(CourseMapper.class);
TeacherMapper tMapper=session.getMapper(TeacherMapper.class);
Course course=new Course();
course.setId(4);
course.setTeacher(tMapper.get(3));
cMapper.update2(course);
session.commit();
session.close();
}
}
MyBatisUtils 代码
package utility;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtils {
public static SqlSession openSession() throws IOException
{
String resource = "mybatis-config.xml";
InputStream in = Resources.getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in,"users");
return sessionFactory.openSession();
}
}
mybatis-config.xml
<?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>
<!-- 对事务的管理和连接池的配置 -->
<environments default="development">
<environment id="users">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}" />
</dataSource>
</environment>
</environments>
<!-- mapping 文件路径配置 -->
<mappers>
<mapper class="javastudy.TeacherMapper"/>
<mapper class="javastudy.CourseMapper"/>
</mappers>
</configuration>