mybatis的高级映射(重点)
表与表之间的关系:
一对一关系:
栗子:一个人对应一个身份证号
一对多关系:
栗子:一个用户可以有多个订单
1. 分析需求:查询用户"郭襄"的个人信息并且包含所属订单的名字
2. 在数据库中编写查询语句
3. 在主表对应的实体类中(User)添加映射关系:
一对多关系:
主表(user)应该包含从表(orders)的实体对象的集合
private List<Orders> orders;生成get\set方法
4. 在接口类中定义接口方法 User findUsrName(String name);
5. 在映射配置文件中配置<ResultMap>
建立两表之间的映射关系:
<resultMap type="user" id="userMap"><id property="id" column="id" jdbcType="INTEGER"/><result property="name" column="name" jdbcType="VARCHAR"/><result property="sex" column="sex" jdbcType="VARCHAR"/><result property="username" column="username" jdbcType="VARCHAR"/><result property="pwd" column="pwd" jdbcType="VARCHAR"/><result property="tel" column="tel" jdbcType="VARCHAR"/>--多:集合collection<collection property="orders" ofType="orders"><id property="id" column="id" jdbcType="INTEGER"/><result property="ordername" column="ordername" jdbcType="VARCHAR"/></collection></resultMap>
配置操作语句:
<!-- 查询用户"郭襄"的个人信息并且包含所属订单的名字 -->注:resultMap="userMap"<select id="findUserAndOrdersName" resultMap="userMap">SELECT `user`.*,orders.ordername FROM `user` LEFT JOIN orders ON orders.orderuser=`user`.id WHERE `user`.`name`=#{name}</select>
多对一关系:
栗子:多个订单属于一个用户
特殊:单独拿出一个订单来对应一个用户,一对一的关系
1. 分析需求:查询订单信息并且包含所属用户名
2. 在数据库中编写查询语句
3. 在从表对应的实体类中(Orders)添加映射关系:
多对一关系:
从表(orders)实体类应该包含主表(user)实体对象的引用
private User user;
4. 在接口类中定义接口方法
List<Orders> findOrdersAndName();
5. 在映射配置文件中配置<ResultMap>
<resultMap type="orders" id="ordersMap"><!-- property:值为实体的属性名 column:值为数据库表的字段名jdbcType:值为字段的数据类型--><id property="id" column="id" jdbcType="INTEGER"/><result property="ordernum" column="ordernum" jdbcType="VARCHAR"/><result property="ordername" column="ordername" jdbcType="VARCHAR"/><result property="ordermoney" column="ordermoney" jdbcType="DECIMAL"/><result property="orderdate" column="orderdate" jdbcType="TIMESTAMP"/>--多对一:association<association property="user" column="id"><id property="id" column="id" jdbcType="INTEGER"/><result property="name" column="name" jdbcType="VARCHAR"/></association></resultMap>配置操作语句:<!-- 查询订单信息并且包含所属用户名 --><select id="findOrdersAndName" resultMap="ordersMap">SELECT orders.*,`user`.`name` FROM orders,`user` WHERE orders.orderuser=`user`.id</select>
多对多关系:m:n
栗子:学生与课程的关系
一个学生可以上多门课程;
一门课程可以被多个学生学习;
实现步骤:
1. 分析需求:查询杜兰特同学的信息并且显示上哪一门课程
2. 在数据库中编写查询语句
3. 在第一个查询的表的实体类中(Student)添加映射关系:
多对多关系:
应该包含另外一个表的实体对象的集合引用
private List<Student> students;
4. 在接口类中定义接口方法
Student findStuAndCourse(String name);
5. 在映射配置文件中配置<ResultMap>
<resultMap type="student" id="studentMap"><id property="stuid" column="stuid" jdbcType="INTEGER"/><result property="name" column="name" jdbcType="VARCHAR"/><result property="sex" column="sex" jdbcType="VARCHAR"/><result property="stunum" column="stunum" jdbcType="VARCHAR"/><result property="major" column="major" jdbcType="VARCHAR"/><result property="address" column="address" jdbcType="VARCHAR"/><result property="username" column="username" jdbcType="VARCHAR"/><result property="password" column="password" jdbcType="VARCHAR"/><collection property="courses" ofType="course"><id property="id" column="id" jdbcType="INTEGER"/><result property="courseName" column="course_name" jdbcType="VARCHAR"/></collection></resultMap><!-- 查询用户"郭襄"的个人信息并且包含所属订单的名字 --><select id="findStuAndCourse" resultMap="studentMap">SELECT student.*,course.course_name AS courseName FROM student LEFT JOIN stucourse ON student.stuid=stucourse.stuid LEFT JOIN course ON stucourse.courseid=course.id WHERE student.`name`=#{name}</select>