表之间的关系有几种:
一对多 :用户和订单就是一对多
多对一 :订单和用户就是多对一
一对一 :人和身份证号就是一对一
多对多 :老师和学生之间就是多对多
特例:
如果拿出每一个订单,他都只能属于一个用户。
所以Mybatis就把多对一看成了一对一。
mybatis中的多表查询:
示例:用户和账户
一个用户可以有多个账户
一个账户只能属于一个用户(多个账户也可以属于同一个用户)
步骤:
1、建立两张表:用户表,账户表
让用户表和账户表之间具备一对多的关系:需要使用外键在账户表中添加
2、建立两个实体类:用户实体类和账户实体类
让用户和账户的实体类能体现出来一对多的关系
3、建立两个配置文件
用户的配置文件
账户的配置文件
4、实现配置:
当我们查询用户时,可以同时得到用户下所包含的账户信息
当我们查询账户时,可以同时得到账户的所属用户信息
一:一对一查询
1、定义用户信息的实体类User和账户信息实体类Account
2、在 Account 类中加入 User 类的对象作为 Account 类的一个属性
3、定义账户的持久层 IAccountDao 接口
4、定义 IAccountDao.xml 文件中的查询配置信息
5、测试
<mapper namespace="com.itheima.dao.IAccountDao">
<resultMap id="accountMap" type="com.it.domain.Account">
<id column="aid" property="id"/>
<result column="uid" property="uid"/>
<result column="money" property="money"/>
<!-- 它是用于指定从表方的引用实体属性的 -->
<association property="user" javaType="com.it.domain.User">
<!--property="user" Account类中的属性user-->
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="birthday" property="birthday"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
</resultMap>
<!-- 查询所有 -->
<select id="findAll" resultMap="accountMap">
select u.* ,a.id as aid,a.uid,a.money from user u,account a where u.id = a.uid
</select>
二:一对多查询
1、定义用户信息的实体类User和账户信息实体类Account
2、在 User 类中加入 List<Account> accounts集合作为 User 类的一个属性
3、定义账户的持久层 IUserDao 接口
4、定义 IUserDao.xml 文件中的查询配置信息
5、测试
<mapper namespace="com.itheima.dao.IUserDao">
<resultMap id="userMap" type="com.it.domain.User">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="birthday" column="birthday"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
<!-- collection 是用于建立一对多中集合属性的对应关系
ofType 用于指定集合元素的数据类型-->
<collection property="accounts" ofType="com.it.domain.Account">
<id property="id" column="aid"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
</collection>
</resultMap>
<!-- 查询所有 -->
<select id="findAll" resultMap="userMap">
select u.*,a.id as aid ,a.uid,a.money from user u left outer join account a on u.id =a.uid
</select>
</mapper>
三:多对多查询
示例:用户和角色
一个用户可以有多个角色
一个角色可以赋予多个用户
步骤:
1、建立两张表:用户表,角色表
让用户表和角色表具有多对多的关系。需要使用中间表,中间表中包含各自的主键,在中间表中是外键。
2、建立两个实体类:用户实体类和角色实体类
让用户和角色的实体类能体现出来多对多的关系
各自包含对方一个集合引用
3、建立两个配置文件
用户的配置文件
角色的配置文件
4、实现配置:
当我们查询用户时,可以同时得到用户所包含的角色信息
当我们查询角色时,可以同时得到角色的所赋予的用户信息