Mybatis相似hibernate的级联查询中对象查询

Mybatis及联查寻对象自动封装(相似hibernate的级联)java

注:在级联的时候,可能会出现数据库表中的个别列(column)名称相同,在这里咱们须要将列名取个[AS]惟一的名称,在select 原来数据库表中名称 as 自定义名称。下面举个例子数据库

<resultMap id="BaseResultMap" type="com.zxxk.xybb.model.FdZoneShare">
    <!--
      WARNING - @mbggenerated
    -->
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="fd_user_id" jdbcType="INTEGER" property="fdUserId" />
    <result column="fd_user_name" jdbcType="VARCHAR" property="fdUserName" />
    <result column="content" jdbcType="VARCHAR" property="content" />
    <result column="image_url" jdbcType="VARCHAR" property="imageUrl" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
    <result column="school_id" jdbcType="INTEGER" property="schoolId" />
    <result column="class_id" jdbcType="INTEGER" property="classId" />
    <result column="is_share" jdbcType="BIT" property="isShare" />
    <result column="is_del" jdbcType="BIT" property="isDel" />
    <result column="comment_count" jdbcType="INTEGER" property="commentCount" />
    <result column="praise_count" jdbcType="INTEGER" property="praiseCount" />
    <result column="student_id" jdbcType="INTEGER" property="studentId" />
    <result column="share_time" jdbcType="TIMESTAMP" property="shareTime" />
  </resultMap>
  <resultMap id="ResultMap" type="com.zxxk.xybb.model.FdZoneShare" extends="BaseResultMap">
  	<association property="fdUser" javaType="com.zxxk.xybb.model.FdUser">
  		<id column="uid" property="id"/>
  		<result column="avatar" property="avatar"/>
  	</association>
  	<collection property="fdZoneComments" ofType="com.zxxk.xybb.model.FdZoneComment" javaType="list">
  		<id column="commentId" property="id" />
	    <result column="c_zone_share_id" property="zoneShareId"/>
	    <result column="c_fd_user_id" property="fdUserId"/>
	    <result column="c_fd_user_name" property="fdUserName"/>
	    <result column="c_content" property="content"/>
	    <result column="c_create_time" property="createTime"/>
  	</collection>
  	<collection property="fdZonePraises" ofType="com.zxxk.xybb.model.FdZonePraise" javaType="list">
  		<id column="praiseId" property="id"/>
	    <result column="p_zone_share_id" property="zoneShareId"/>
	    <result column="p_fd_user_id" property="fdUserId"/>
	    <result column="p_fd_user_name" property="fdUserName"/>
	    <result column="p_create_time" property="createTime"/>
  	</collection>
  </resultMap>
  	
  <!-- 查询妈妈圈主题 
  		相同名字在column上进行新型修改
  -->
  <select id="findZoneShares" parameterType="map" resultMap="ResultMap">
  	SELECT
  		zs.*,
  		zc.id as commentId,zc.zone_share_id as c_zone_share_id,zc.fd_user_id as c_fd_user_id,zc.fd_user_name as c_fd_user_name,zc.content as c_content,zc.create_time as c_create_time,
		zp.id as praiseId,zp.zone_share_id as p_zone_share_id,zp.fd_user_id as p_fd_user_id,zp.fd_user_name as p_fd_user_name,zp.create_time as p_create_time,
		u.avatar
	FROM 
		fd_zone_share zs
	LEFT JOIN 
		fd_user u 
	ON 
		u.id=zs.fd_user_id
	LEFT JOIN
		fd_zone_comment zc
	ON
		zs.id=zc.zone_share_id
	LEFT JOIN
		fd_zone_praise zp
	ON
		zs.id=zp.zone_share_id
	WHERE
		zs.is_share = 1
	<if test="classId != null and classId != ''">
		AND zs.class_id=#{classId}
 	</if>
 	<if test="share!=0">
	<choose>
		<when test="moreThan != null and moreThan != ''">
		 	AND zs.id <![CDATA[>]]> #{id}
		</when>
		<otherwise>
			AND zs.id <![CDATA[<]]> #{id}
		</otherwise>
	</choose>
 	</if>
	ORDER BY zs.share_time DESC
  </select>


一、多对一app

1)在某个类中关联某个对象dom

<resultMap id="BaseResultMap" type="com.yujin.domain.User">
        <id property="id" column="id" javaType="long" jdbcType="BIGINT"/>
        <result property="name" column="name" javaType="string" jdbcType="VARCHAR"/>
        <result property="username" column="username" javaType="string" jdbcType="VARCHAR"/>
        <result property="password" column="password" javaType="string" jdbcType="VARCHAR"/>
        <result property="roleId" column="role_id" javaType="long" jdbcType="BIGINT"/>
        <association property="role" javaType="com.yujin.domain.Role">
            <!-- column能够自定义 ,建议使用对应表中的名称-->
            <id column="id" property="id" />
            <result column="name" property="name" />
            <result column="description" property="description" />
        </association>
    </resultMap>
    <!-- 查询全部 -->
    <select id="selectAll" resultMap="BaseResultMap">
        SELECT 
            user.id,user.name,user.username,user.password,user.role_id,role.id as 
roleId,role.name,role.description
        FROM 
            t_users user
        LEFT JOIN
            t_roles role
        ON
            user.role_id = role.id
    </select>

Daofetch

package com.yujin.dao;
import java.util.List;
import com.yujin.domain.User;
public interface UserDao {
    List<User> selectAll();
}

客户端调用ui

public void selectUser() throws Exception{
        List<User> userList = userService.findUsers();
        for(User user : userList){
            System.err.println(user.getName());
            System.err.println(user.getRole().getDescription());
        }
    }

分析Mapper<resultMap>的各类形式url

形式一:spa

<resultMap id="BaseResultMap" type="com.yujin.domain.User">
        <id property="id" column="id" javaType="long" jdbcType="BIGINT"/>
        <result property="name" column="name" javaType="string" jdbcType="VARCHAR"/>
        <result property="username" column="username" javaType="string" jdbcType="VARCHAR"/>
        <result property="password" column="password" javaType="string" jdbcType="VARCHAR"/>
        <result property="roleId" column="role_id" javaType="long" jdbcType="BIGINT"/>
        <association property="role" javaType="com.yujin.domain.Role">
            <!-- column能够自定义 ,建议使用对应表中的名称-->
            <id column="id" property="id" />
            <result column="name" property="name" />
            <result column="description" property="description" />
        </association>
    </resultMap>

形式二:hibernate

<resultMap id="BaseResultMap" type="com.yujin.domain.User">
        <id property="id" column="id" javaType="long" jdbcType="BIGINT"/>
        <result property="name" column="name" javaType="string" jdbcType="VARCHAR"/>
        <result property="username" column="username" javaType="string" jdbcType="VARCHAR"/>
        <result property="password" column="password" javaType="string" jdbcType="VARCHAR"/>
        <result property="roleId" column="role_id" javaType="long" jdbcType="BIGINT"/>
        <association property="role" resultMap="roleMap" fetchType="lazy"/>
    </resultMap>
    <!-- 对应的实体类 -->
    <resultMap id="roleMap" type="com.yujin.domain.Role">
        <!-- column能够自定义 ,建议使用对应表中的名称-->
        <id column="id" property="id" />
        <result column="name" property="name" />
        <result column="description" property="description" />
    </resultMap>

形式三:code

<resultMap id="BaseResultMap" type="com.yujin.domain.User">
        <id property="id" column="id" javaType="long" jdbcType="BIGINT"/>
        <result property="name" column="name" javaType="string" jdbcType="VARCHAR"/>
        <result property="username" column="username" javaType="string" jdbcType="VARCHAR"/>
        <result property="password" column="password" javaType="string" jdbcType="VARCHAR"/>
        <result property="roleId" column="role_id" javaType="long" jdbcType="BIGINT"/>
    </resultMap>
    <!—-专门写关联对象 -->
    <resultMap type="com.yujin.domain.User" id="ResultMap" extends="BaseResultMap">
        <association property="role" javaType="com.yujin.domain.Role">
            <!-- column能够自定义 ,建议使用对应表中的名称-->
            <id column="id" property="id" />
            <result column="name" property="name" />
            <result column="description" property="description" />
        </association>
    </resultMap>
    <!-- 查询全部 -->
    <select id="selectAll" resultMap="ResultMap">
        SELECT 
            user.id,user.name,user.username,user.password,user.role_id,role.id as
roleId,role.name,role.description
        FROM 
            t_users user
        LEFT JOIN
            t_roles role
        ON
            user.role_id = role.id
    </select>

形式四:(推荐使用)

    <!-- 
        association的用法
     -->
    <resultMap id="BaseResultMap" type="com.yujin.domain.User">
        <id property="id" column="id" javaType="long" jdbcType="BIGINT"/>
        <result property="name" column="name" javaType="string" jdbcType="VARCHAR"/>
        <result property="username" column="username" javaType="string" jdbcType="VARCHAR"/>
        <result property="password" column="password" javaType="string" jdbcType="VARCHAR"/>
        <result property="roleId" column="role_id" javaType="long" jdbcType="BIGINT"/>
        <!-- 
            column:user表中的对应的role_id
            select:对应实体类中  namespace+id
         -->
        <association property="role" column="role_id" select="com.yujin.dao.RoleDao.getById"/>
    </resultMap>

二、一对多

形式一:

        <resultMap type="com.yujin.domain.Role" id="BaseResultMap">
		<id column="id" jdbcType="BIGINT" property="id" javaType="long"/>
		<result column="name" jdbcType="VARCHAR" property="name" javaType="string"/>
		<result column="description" jdbcType="VARCHAR" property="description" javaType="string"/>
		<!-- 
			ofType:集合中泛型的类型类型的全路径
		 -->
		<collection property="users" ofType="com.yujin.domain.User">
			<!-- column:和查询语句as后面的名称,最好不要和上面实体类重名  -->
			<id column="userId" property="id"/>
			<result column="uname" property="name"/>
			<result column="username" property="username"/>
			<result column="password" property="password"/>
		</collection>
	</resultMap>
	
	<!-- 查询全部 -->
	<select id="selectAll" resultMap="BaseResultMap">
		SELECT 
			role.id,role.name,role.description,user.id as userId,user.name as uname,user.username,user.password
		FROM 
			t_roles role
		RIGHT JOIN
			t_users user
		ON
			role.id = user.role_id
	</select>

形式二

        <resultMap type="com.yujin.domain.Role" id="BaseResultMap">
		<id column="id" jdbcType="BIGINT" property="id" javaType="long"/>
		<result column="name" jdbcType="VARCHAR" property="name" javaType="string"/>
		<result column="description" jdbcType="VARCHAR" property="description" javaType="string"/>
	</resultMap>
	<resultMap type="com.yujin.domain.Role" id="ResultMap" extends="BaseResultMap">
		<!-- 
			ofType:集合中泛型的类型类型的全路径
		 -->
		<collection property="users" ofType="com.yujin.domain.User">
			<!-- column:和查询语句as后面的名称,最好不要和上面实体类重名  -->
			<id column="userId" property="id"/>
			<result column="uname" property="name"/>
			<result column="username" property="username"/>
			<result column="password" property="password"/>
		</collection>
	</resultMap>

(3)形式三

        <resultMap type="com.yujin.domain.Role" id="BaseResultMap">
		<id column="id" jdbcType="BIGINT" property="id" javaType="long"/>
		<result column="name" jdbcType="VARCHAR" property="name" javaType="string"/>
		<result column="description" jdbcType="VARCHAR" property="description" javaType="string"/>
		<collection property="users" resultMap="ResultMap"/>
	</resultMap>
	<resultMap type="com.yujin.domain.Role" id="ResultMap">
		<!-- 
			ofType:集合中泛型的类型类型的全路径
		 -->
		<collection property="users" ofType="com.yujin.domain.User">
			<!-- column:和查询语句as后面的名称,最好不要和上面实体类重名  -->
			<id column="userId" property="id"/>
			<result column="uname" property="name"/>
			<result column="username" property="username"/>
			<result column="password" property="password"/>
		</collection>
	</resultMap>

(4)形式四

RoleMapper.xml
<resultMap type="com.yujin.domain.Role" id="BaseResultMap">
        <id column="id" jdbcType="BIGINT" property="id" javaType="long"/>
        <result column="name" jdbcType="VARCHAR" property="name" javaType="string"/>
        <result column="description" jdbcType="VARCHAR" property="description" javaType="string"/>
        <collection property="users" column="id" ofType="com.yujin.domain.User" 
select="com.yujin.dao.UserDao.getUserByRoleId"/>
    </resultMap>
    
    <!-- 查询全部 -->
    <select id="selectAll" resultMap="BaseResultMap">
        SELECT 
            role.id,role.name,role.description
        FROM 
            t_roles role
    </select>
UserMapper.xml
<select id="getUserByRoleId" resultMap="BaseResultMap">
        SELECT 
            user.id,user.name,user.username,user.password,user.role_id,role.id as 
roleId,role.name,role.description
        FROM 
            t_users user
        LEFT JOIN
            t_roles role
        ON
            user.role_id = role.id
        WHERE
            user.role_id = #{id}
    </select>
相关文章
相关标签/搜索