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>