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>