表之间的关系:一对多,多对一 ,一对一 ,多对多
举例:用户与订单(一对多),订单与用户(多对一)人和身份证(一对一)老师和学生(多对多)
一对一操作:账户(account)→ 用户(user)
user的一切配置已完成,主要看account类
1)创建account类,其中除包含其基本属性外,也应该包含一个user对象作为属性
public class Account implements Serializable {
private Integer id;
private Integer uid;
private Double money;
//从表实体应该包含一个主表实体的对象引用
private User user;
//get,set,toString方法
}
2)创建account的操作接口类与映射文件
黑马上的一段映射文件源码:
<mapper namespace="com.itheima.dao.IAccountDao">
<!-- 定义封装account和user的resultMap -->
<resultMap id="accountUserMap" type="account">
<!--主键,aid是因为下面的sql语句中为account表中的id设置的别名,因为user表中也有id-->
<id property="id" column="aid"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<!-- 一对一的关系映射:配置封装user的内容-->
<!--javaType :user是简写,因为已经用package设置好了别名-->
<association property="user" column="uid" javaType="user">
<!--user表主键-->
<id property="id" column="id"></id>
<result column="username" property="username"></result>
<result column="address" property="address"></result>
<result column="sex" property="sex"></result>
<result column="birthday" property="birthday"></result>
</association>
</resultMap>
<!-- 查询所有 -->
<select id="findAll" resultMap="accountUserMap">
select u.*,a.id as aid,a.uid,a.money from account a , user u where u.id = a.uid;
</select>
<!--查询所有账户同时包含用户名和地址信息-->
<select id="findAllAccount" resultType="accountuser">
select a.*,u.username,u.address from account a , user u where u.id = a.uid;
</select>
</mapper>
用resultmap标签配置结果封装:因为account类中有user对象,不能用resultType标签设置封装。如果想要使用该标签,则必须创建继承自account类的accountuser类,该类中添加一些user类中的属性,如username等
user的一对多查询:一个user对应多个account
1)user类中加入List<Account>属性
private List<Account> accounts;
2)配置user的接口类与映射文件
<!-- 定义User的resultMap-->
<resultMap id="userAccountMap" type="user">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="address" column="address"></result>
<result property="sex" column="sex"></result>
<result property="birthday" column="birthday"></result>
<!-- 配置user对象中accounts集合的映射 -->
<collection property="accounts" ofType="account">
<id column="aid" property="id"></id>
<result column="uid" property="uid"></result>
<result column="money" property="money"></result>
</collection>
</resultMap>
<!-- 查询所有 -->
<select id="findAll" resultMap="userAccountMap">
select * from user u left outer join account a on u.id = a.uid
</select>
与一对一不同的主要是用<collection>针对List集合的配置
多对多:用户(user)与角色(role)
1)建立三张表:用户表(user)、角色表(role)。除此之外,让用户表与角色表具有多对多关系,需要使用中间表(user_role),中间表包含各自的主键,在中间表中是外键。
2)建立两个实体类,用户实体类与角色实体类,各自包含对方一个集合引用
3)配置两个配置文件:用户配置文件与角色配置文件