Java--Mybatis,mapper.xml文件使用association;collection实现一对一,一对多关联

我们用JDBC访问数据库,除了需要自己写SQL之外,还必须操作Connection, Statement, ResultSet 这些其实只是辅助类。 不仅如此,访问不同的表,还会写很多雷同的代码,显得繁琐和枯燥。
使用了Mybatis之后,只需要自己提供SQL语句,其他的工作,诸如建立连接,Statement, JDBC相关异常处理等等都交给Mybatis去做了,那些重复性的工作Mybatis也给做掉了,我们只需要关注在增删改查等操作层面上,而把技术细节都封装在了我们看不见的地方。

今天主要说的是表关联查询,Mybatis中使用association和collection标签实现关联查询

Mybatis 一对一,使用 association 标签
Mybatis 一对多,使用 collection 标签

我们以User,Role表为例

<!-- namespace为命名空间,需与映射器全名一致 -->
<mapper namespace="XX.SysUserMapper">
 
    <!--user用户表映射-->
	<resultMap type="SysUser" id="SysUserResult">
		<id     property="userId"       column="user_id"      />
		<result property="deptId"       column="dept_id"      />
		<result property="userName"     column="user_name"    />
		<result property="roleId"       column="role_id"    />
		<result property="status"       column="status"       />
		<association property="dept"    column="dept_id" javaType="SysDept" resultMap="deptResult" />
		<collection  property="roles"   javaType="java.util.List"        resultMap="RoleResult" />
	</resultMap>
	
    <!--dept部门表映射-->
	<resultMap id="deptResult" type="SysDept">
		<id     property="deptId"   column="dept_id"     />
		<result property="parentId" column="parent_id"   />
		<result property="deptName" column="dept_name"   />
		<result property="status"   column="dept_status" />
	</resultMap>
	
    <!--role权限表映射-->
	<resultMap id="RoleResult" type="SysRole">
		<id     property="roleId"       column="role_id"        />
		<result property="roleName"     column="role_name"      />
		<result property="status"       column="role_status"    />
	</resultMap>
	
	<sql id="selectUserVo">
        select u.user_id, u.dept_id, u.user_name, u.nick_name, 
        d.dept_id, d.parent_id, d.dept_name, d.status as dept_status,
        r.role_id, r.role_name, r.status as role_status
        from sys_user u
		    left join sys_dept d on u.dept_id = d.dept_id
		    left join sys_role r on r.role_id = u.role_id
    </sql>
    
    <select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
		<if test="userName != null and userName != ''">
			AND u.user_name like concat(concat('%',#{userName}),'%')
		</if>
		<if test="status != null and status != ''">
			AND u.status = #{status}
		</if>
		<if test="deptId != null and deptId != 0">
		    AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE FIND_IN_SET(#{deptId}, ancestors) <![CDATA[ <> ]]> 0 ))
		</if>
	</select>
	
</mapper> 

在这里先说明一下

一、resultMap,id,type标签

type:对应的是我们的实体类,全路径名
id:可以理解为别名 

 id:唯一标识(一般为映射主键),此id值用于select元素属性的引用
column:对应我们数据库表中的字段名称
property:对应我们的实体类的属性,比如:User中的属性userName,要和数据库表user中的name对应。
result:标识一些简单属性,其中column属性代表数据库的字段名,property代表查询出来的字段名映射到实体类的某个属性

<select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
		<if test="userName != null and userName != ''">
			AND u.user_name like concat(concat('%',#{userName}),'%')
		</if>
</select>

二、parameterType:MyBatis的传入参数

1、两种

  (1)基本数据类型:int,string,long,Date

  (2)复杂数据类型:类和Map

2、获取参数中的值

  (1)基本数据类型:#{参数} 获取参数中的值

  (2)复杂数据类型:#{属性名}  ,map中则是#{key}

3、实例

3.1 基本数据类型案例 

<sql id="Base_Column_List" >

 id, car_dept_name, car_maker_name, icon,car_maker_py,hot_type

 </sql>

 <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >

 select

 <include refid="Base_Column_List" />

 from common_car_make

 where id = #{id,jdbcType=BIGINT}

 </select>

3.2 复杂类型--map类型    

<select id="queryCarMakerList" resultMap="BaseResultMap" parameterType="java.util.Map">

  select

  <include refid="Base_Column_List" />

  from common_car_make cm

  where 1=1

  <if test="id != null">

   and cm.id = #{id,jdbcType=DECIMAL}

  </if>

  <if test="carDeptName != null">

   and cm.car_dept_name = #{carDeptName,jdbcType=VARCHAR}

  </if>

  <if test="carMakerName != null">

   and cm.car_maker_name = #{carMakerName,jdbcType=VARCHAR}

  </if>

  <if test="hotType != null" >

   and cm.hot_type = #{hotType,jdbcType=BIGINT}

  </if>

  ORDER BY cm.id

 </select>

  3.3 复杂类型--类类型

<update id="updateByPrimaryKeySelective" parameterType="com.epeit.api.model.CommonCarMake" >

 update common_car_make

 <set >

  <if test="carDeptName != null" >

  car_dept_name = #{carDeptName,jdbcType=VARCHAR},

  </if>

  <if test="carMakerName != null" >

  car_maker_name = #{carMakerName,jdbcType=VARCHAR},

  </if>

  <if test="icon != null" >

  icon = #{icon,jdbcType=VARCHAR},

  </if>

  <if test="carMakerPy != null" >

   car_maker_py = #{carMakerPy,jdbcType=VARCHAR},

  </if>

  <if test="hotType != null" >

   hot_type = #{hotType,jdbcType=BIGINT},

  </if>

 </set>

 where id = #{id,jdbcType=BIGINT}

 </update>

 3.4 复杂类型--map中包含数组的情况

<select id="selectProOrderByOrderId" resultType="com.epeit.api.model.ProOrder" parameterType="java.util.HashMap" >

  select sum(pro_order_num) proOrderNum,product_id productId,promotion_id promotionId

  from pro_order

  where 1=1

  <if test="orderIds != null">

   and

   <foreach collection="orderIds" item="item" open="order_id IN(" separator="," close=")">

    #{item,jdbcType=BIGINT}

   </foreach>

  </if>

  GROUP BY product_id,promotion_id

 </select>

三、resultTyperesultMap

resultType:直接表示返回类型, 包括基本数据类型和复杂数据类型。
resultMap:外部定义的引用,通过对应的外部的id,表示结果映射到哪个上,一般用于字段名和属性名不一致的情况,或者需要做复杂的联合查询以便自由控制映射结果

四、association

映射到JavaBean的某个复杂的”数据类型”属性,仅处理一对一的关联关系。

技术分享图片

    <!--user用户表映射-->
	<resultMap type="SysUser" id="SysUserResult">
		<id     property="userId"       column="user_id"      />
		<result property="deptId"       column="dept_id"      />
		<result property="userName"     column="user_name"    />
		<result property="roleId"       column="role_id"    />
		<result property="status"       column="status"       />
		<association property="dept"    column="dept_id" javaType="SysDept" resultMap="deptResult" />
		<collection  property="roles"   javaType="java.util.List"        resultMap="RoleResult" />
	</resultMap>

association的属性节点:

property:映射数据库列的实体对象属性名
javaType:完整的java类名和限定名;propert所映射的属性的类型
子元素

id:一般为映射主键,可以提高性能。
result:
column:映射的数据库的字段名。
property:映射的数据列对应的实体对象属性。

五、collection

映射到JavaBean的某个复杂的”数据类型”属性,这个属性是一个集合列表,处理一对多的关联关系。

其余和association基本一致。

association和collection都具备延迟加载功能。

延迟加载:先从单表查询,需要时再查关联表,大大的提高了数据库性能,因为相对来说单表查询比多表查询要快

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`association` 和 `collection` 都是 MyBatis 提供的用于处理关联查询的标签,其中 `association` 用于处理一对一或多对一的关联关系,`collection` 用于处理一对多或多对多的关联关系。 在 Mapper XML 文件中,可以通过 `association` 和 `collection` 标签来实现关联对象的查询。 下面是一个使用 `association` 标签实现一对一关联查询的例子: ```xml <!-- 查询用户及其对应的订单信息 --> <select id="getUserOrder" resultMap="userOrderMap"> SELECT * FROM user WHERE user_id = #{userId} </select> <!-- 定义 User 和 Order 的 resultMap --> <resultMap id="userOrderMap" type="User"> <id property="id" column="user_id" /> <result property="name" column="user_name" /> <!-- 使用 association 标签关联 Order 对象 --> <association property="order" resultMap="orderMap" /> </resultMap> <resultMap id="orderMap" type="Order"> <id property="id" column="order_id" /> <result property="number" column="order_number" /> <result property="price" column="order_price" /> </resultMap> ``` 上面的例子中,使用 `getUserOrder` 查询用户及其对应的订单信息,并使用 `userOrderMap` 定义了 User 和 Order 的 resultMap。在 `userOrderMap` 中,使用 `association` 标签关联 Order 对象,并通过 `resultMap` 属性指定了 Order 对象的 resultMap。 下面是一个使用 `collection` 标签实现一对多关联查询的例子: ```xml <!-- 查询用户及其对应的订单列表 --> <select id="getUserOrders" resultMap="userOrdersMap"> SELECT * FROM user WHERE user_id = #{userId} </select> <!-- 定义 User 和 Order 的 resultMap --> <resultMap id="userOrdersMap" type="User"> <id property="id" column="user_id" /> <result property="name" column="user_name" /> <!-- 使用 collection 标签关联 Order 列表 --> <collection property="orders" resultMap="orderMap" /> </resultMap> <resultMap id="orderMap" type="Order"> <id property="id" column="order_id" /> <result property="number" column="order_number" /> <result property="price" column="order_price" /> </resultMap> ``` 上面的例子中,使用 `getUserOrders` 查询用户及其对应的订单列表,并使用 `userOrdersMap` 定义了 User 和 Order 的 resultMap。在 `userOrdersMap` 中,使用 `collection` 标签关联 Order 列表,并通过 `resultMap` 属性指定了 Order 对象的 resultMap。 需要注意的是,在使用 `association` 和 `collection` 标签时,需要在 resultMap 中定义对应的对象和属性,并且需要在 SQL 语句中正确地查询出关联对象的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值