天天看点

Mybatis的多表查询

Mybatis的多表查询

示例:用户和账户.

一个用户可以有多个账户,一个账户只能属于一个用于(多个账户也可属于一个用户)
           
  • 步骤
    1. 建立两张表:用户表,账户表.
    2. 建立两个实体类:用户实体类和账户实体类.
    3. 建立两个配置文件.
    4. 实现配置:当我们查询用户时,可以同时得到用户下所包含的账户信息.

      当我们查询账户时,可以同时得到账户所属用户信息.

P.S 下面在每种查询里面新添了注解开发.

Mybatis一对一查询

  1. 从表实体应该包含一个主表实体的对象引用. Account里面包含 private User user;
  2. 定义封装account 和user的resultMap.
<resultMap id="accountUserMap" type="account">
		<id property="ID" column="aid"></id>
		<result property="UID" column="uid"></result>
		<result property="MONEY" column="money"></result>
		<!--上面只封装了account,下面要一对一的关联用association,一对多是集合,用collection. 封装user的内容.-->
		<!--属性user通过uid获取的 select 属性:查询用户的唯一标识.方法可以通过id查询到user.-->
		<association property="user" column="uid" javaType="user.class" select="com.hk.dao.InUserDao.selectById"> 
			<id property  column></id>
			<result property column></result>
		</association>
	</resultMap>
           

注释开发

package com.hk.Dao
public interface IAccountDao{
	@Select("select * from account")
	//这里的id用于标识这个results.xml里用的是resultMap,注释用的results.注释里的@resultMap是用于加在方法前,value={..}识别前面的@results.
	@Results(id="accountMap" value={
		@Result(id=true,property="id",column="id")
		@Result(property="uid",column="uid")
		@Result(property="money",column="money")
		//一对一映射.result里面有one属性,是@one类型[email protected]里面有select同上,fetchType对应的是enum的加载值(LAZY,EAGER,DEFAULT).
		@Result(property="user",column="uid",one=@one(select="com.hk.dao.InUserDao.selectById",fetchType=FetchType.EAGER))
	})
}	
           

一对多的查询同一对一,只是用的是many [email protected](select="…",fetchType=FetchType.LAZY)

Mybatis的一对多查询

如上述的用户和账户就是一对多.一个用户可以有多个账户.所以在User类里面加上 private List< Account> accounts;

然后在UserDao的Mapper里面写< resultMap>标签.因为涉及到的是多个对象.所以用的是collection标签.

<resultMap id="userAccount" type="com.hk.domain.UserAccount">
        <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>
        <!--配置UserAccount对象中的accounts集合的映射-->
        <collection property="accounts" ofType="com.hk.domain.Account">
            <!-- 配置主键,aID是关联account的唯一标识 column="集合中pojo对象对应的表的主键字段" property="集合中pojo对象的主键属性"-->
            <!--当id这一行 均为ID时,结果是错误的.原因:不区分大小写,id与ID连接后是重复的,需要重新命名.所以一般用的是select u.*,a.ID as a.aid,a.uid,a.money from user u left outer join account a on u.id=a.uid-->
            <id property="ID" column="aID"></id>
            <result property="UID" column="UID"></result>
            <result property="MONEY" column="MONEY"></result>
        </collection>
    </resultMap>
           

Mybatis的多对多查询

多对多查询即两个表分别进行一对多.新建一个中间表,两个属性均为主键,分别对应两个表的外键.

A表与B表 多对多关系 需要一个中间表 C表来进行关联.

C表的两个属性分别作为外键关联A表,B表的主键.

然后在Java里面分别针对A,B的Domain和Dao,做同上一对多的操作.