Mybatis总结(3)-关系映射

  1. 关系映射的理解:就像我们每个人之间的人际关系一样,儿子是父亲的儿子也是爷爷的孙子,父亲是母亲的丈夫是爷爷的儿子这样的人际关系组成一张关系网构成一张映射网,就像我们数据库中的表一样互相都有可能是这样的关系。所以我们需要在做开发的时候将这种关系映射(获得爷爷的后代)的时候就需要用到我们的关系映射
  2. 关系映射的分类:
  • 一对一:身份证号和个人
  • 一对多:一个教室对应多张桌椅
  • 多对多:水果店的水果种类和水果供货商
  1. 一对一关系映射的实现
  • 嵌套查询:通过关联另一张表的sql语句来进行查询,下面实例是身份证号和用户的对应关系
<select id="findPersonById" parameterType="Integer" resultMap="IdCardWithPersonResult">
				select * from tb_person where id=#{id}
		</select>
		<resultMap type="Person" id="IdCardWithPersonResult">
				<id property="id" column="id" />
				<result property="name" column="name"/>
				<result property="age" column="age" />
				<result property="sex" column="sex"/>
				<!-- 一对一:association使用select属性引入另外一条SQL语句 -->
				<association property="card" column="card_id" javaType="IdCard"
						select="com.mybatis.mapper.IdCardMapper.findCodeById" />			
		</resultMap>
  • 使用嵌套结果映射来处理重复的联合结果:就是一次性查出结果然后分类装载
<select id="findPersonById2" parameterType="Integer" resultMap="IdCardWithPersonResult2">
						select p.*,idcard.code 
						from tb_person p,tb_idcard idcard
						where p.card_id=idcard.id
						and p.id=#{id}
		</select>
		<resultMap type="Person" id="IdCardWithPersonResult2">
					<id property="id" column="id"/>
					<result property="name" column="name"/>
					<result property="age" column="age"/>
					<result property="sex" column="sex"/>
					<association property="card" javaType="IdCard">
							<id property="id" column="card_id" />
							<result property="code" column="code" />
					</association>
		</resultMap>
  1. 一对多映射关系实现
  • 将需要查询的“多”的映射关系作为一个集合来定义到“一”的类中
  • 一对多的查询实例(mapper.xml):一个用户多个订单
<mapper namespace="com.mybatis.mapper.UserMapper">
		<select id="findUserWithOrders" parameterType="Integer" resultMap="UserWithOrders">
						select u.*,o.id as orders_id,o.number 
						from tb_user u,tb_orders o
						where u.id=o.user_id
						and u.id=#{id}
		</select>
		<resultMap type="User" id="UserWithOrders">
					<id property="id" column="id"/>
					<result property="username" column="username"/>
					<result property="address" column="address"/>
					<collection property="ordersList" ofType="Orders" >
						<id property="id" column="orders_id" />
						<result property="number" column="number"/> 
					</collection>
  1. 多对多的关系映射
  • 将多的类注入到对应的多的类中:商品持久化类中定义一个订单集合对象,订单类中定义一个商品集合对象
  1. 小结 :
  • 一对多与多对多的映射关系mapper文件的嵌套查询都需要查询出所有的结果,即需要复杂的SQL语句。
  • <resultMap >元素是查询各种返回结果类型不固定的元素其子元素有***< association >< collecaion >***. - -
  • association 元素与collecaion 元素大部分相同,但是collecation中含有一个ofType类型是负责指定实体对象的集合类的属性。

猜你喜欢

转载自blog.csdn.net/qq_38929920/article/details/83474199