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

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

1、多对一

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

<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>

Dao

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

客户端调用

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>的各种形式

形式一:

<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>

形式二:

<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>

形式三:

<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>

2、一对多

形式一:

        <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>






你可能感兴趣的:(Mybatis类似hibernate的级联查询中对象查询)