查询所有用户及其所有订单 查询所有学生及其所学课程 等操作,可以省去很多冗繁代码,直接拿到结果。
关联关系种类:1对1 1对多 多对多Person(公民) Passport(护照) 1对1
User(用户) Order(订单) 1对多
Student(学生) Course(课程) 多对多
1. 一对一 1.1 建表 drop table IF EXISTS t_passport; drop table IF EXISTS t_person; create table t_person( id int primary key AUTO_INCREMENT, name VARCHAR(50), age SMALLINT )DEFAULT CHARSET = utf8 ENGINE =innodb; create table t_passport( id int primary key AUTO_INCREMENT, note VARCHAR(50), create_time DATE, person_id int UNIQUE, FOREIGN KEY(person_id) REFERENCES t_person(id) )DEFAULT CHARSET = utf8 ENGINE =innodb; insert into t_person(name,age) values("zhangsan",18); insert into t_person(name,age) values("lisi",19); insert into t_passport(note,create_time,person_id) values("pass1",'2019-05-07',1); insert into t_passport(note,create_time,person_id) values("pass2",'2019-05-07',2); 1.2 建类 public class Person { private Integer id; private String name; private Integer age; //关系属性 private Passport passport; //set/get } public class Passport { private Integer id; private String note; private Date createTime; //关系属性 private Person person; //set/get } 1.3 查询查询某个Person,及其Passport
//PersonDAO :查询某个Person的信息及其Passport的信息 public Person queryPersonAndPassport(Integer id); //映射文件 <select resultType="Person" parameterType="int"> select t_person.id as pid, name, age, t_passport.id as passid, note, create_time, person_id from t_person join t_passport ON t_person.id = t_passport.person_id where t_person.id=#{id}; </select> 如上映射文件,存在问题 ==> 关系属性:passport,需要多个列映射到这一个属性上,但并没有映射清楚若要完成上图中的映射,不能再使用默认的同名映射规则,需要定制映射规则。
resultMap-- 映射规则定制利器 <!-- 定义查询中的各个列 与 属性的映射规则 --> <!-- id=标识 type=返回类型(将列映射到User的属性上) --> <resultMap type="Person"> <!-- 主键列pid,用 id标签配置; property=属性名 column=列名 --> <id property="id" column="pid"/> <!-- 常规列用 result标签配置; property=属性名 column=列名 --> <result property="name" column="name"/> <result property="age" column="age"/> <!-- 重点:关系属性【Passport passport】是一个对象 用 association标签配置,如下配置就是在完成上图中 未完成之映射 property=属性名 javaType=该属性的类型 --> <association property="passport" javaType="Passport"> <!-- 将passid列 映射到 passport的id属性中 --> <id property="id" column="passid"/> <!-- 将note列 映射到 passport的note属性中 --> <result property="note" column="note"/> <!-- 将create_time列 映射到 passport属性的createTime属性中 --> <result property="createTime" column="create_time"/> </association> </resultMap> <!-- 删除之前的resultType, 改为使用resultMap="person_passport" 即,采用resultMap中定义的映射规则去封装对象--> <select resultMap="person_passport" parameterType="int"> select t_person.id as pid, name, age, t_passport.id as passid, note, create_time, person_id from t_person join t_passport ON t_person.id = t_passport.person_id where t_person.id=#{id}; </select> 1.4 测试 // 查询id=1的person及其passport Person person = personDAO.queryPersonAndPassport(1); // 从person中获取passport Passport passport = person.getPassport();**思考题 ==> 请自主设计,完成以下: **
查询所有Person及其Passport:public List<Person> queryAll();
查询某个Passport及其Person数据:public Passport queryPassportAndPerson(Integer id)
细节: