mybatis 使用resultMap实现关联数据的查询(association 和collection )

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- namespace的名字需要跟接口的类名一致 -->
<mapper namespace="cn.bdqn.dao.UserMapper">
    <!--
    1、resultMap属性:type为java实体类;id为此resultMap的标识
    2、resultMap的子元素:
        id – 一般对应到数据库中该行的ID,设置此项可以提高Mybatis性能.
        result – 映射到JavaBean 的某个“简单类型”属性,String,int等.
        association – 映射到JavaBean 的某个“复杂类型”属性,其他JavaBean类.
        collection –复杂类型集合 (演示示例2)
     -->

    <!--根据roleId获取用户列表: 当数据库中的字段信息与对象的属性不一致时需要通过resultMap来映射 -->
    <!-- <resultMap type="User" id="seachUserResult">
        <result property="id" column="id"/>
        <result property="userCode" column="userCode"/>
        <result property="userName" column="userName"/>
        <result property="roleId" column="roleId"/>
        <result property="roleName" column="roleName"/>
    </resultMap>

    <select id="getUserListByRoleId" parameterType="Role" resultMap="seachUserResult">
        select u.*,r.roleName as roleName from user u,role r where u.roleId = r.id and u.roleId = #{id}
    </select> -->

    <!-- 根据roleId获取用户列表 association start-->
    <resultMap type="User" id="seachUserResult">
        <result property="id" column="id"/>
        <result property="userCode" column="userCode" />
        <result property="userName" column="userName" />
        <result property="roleId" column="roleId" />
        <!-- <association property="role" javaType="Role" >
            <result property="id" column="id"/>
            <result property="roleCode" column="roleCode"/>
            <result property="roleName" column="roleName"/>
        </association> -->
        <association property="role" javaType="Role" resultMap="roleMap"/>
    </resultMap>

    <resultMap type="Role" id="roleMap">
        <result property="id" column="id"/>
        <result property="roleCode" column="roleCode"/>
        <result property="roleName" column="roleName"/>
    </resultMap>

    <select id="getUserListByRoleId" parameterType="Role" resultMap="seachUserResult">
        select u.*,r.roleCode as roleCode,r.roleName as roleName from user u,role r where u.roleId = r.id and u.roleId = #{id}
    </select>

    <!-- association end-->

    <!-- 获取指定用户的地址列表(user表-address表:1对多关系) collection start-->
    <resultMap type="User" id="userMap">
        <id property="id" column="userId"/>
        <collection property="addressList" ofType="Address">
            <id property="id" column="a_id"/>
            <result property="postCode" column="postCode"/>
            <result property="addressContent" column="addressContent"/>
        </collection>
    </resultMap>

    <select id="getAddressListByUserId" parameterType="User" resultMap="userMap">
        select *,a.id as a_id from user u,address a where u.id=a.userId and u.id=#{id}
    </select>
    <!-- collection end -->

    <select id="count" resultType="int">
        select count(1) from user
    </select>

    <insert id="add" parameterType="User">
        insert into user (userCode,userName,userPassword)
            values (#{userCode},#{userName},#{userPassword})
    </insert>

    <update id="update" parameterType="User">
        update user set userCode=#{userCode},userName=#{userName},
            userPassword=#{userPassword} where id=#{id}
    </update>

    <delete id="delete" parameterType="User">
        delete from user where id=#{id}
    </delete>

    <select id="getUserList" resultType="User">
        select * from user
    </select>
</mapper>

接口 UserMapper

public interface UserMapper {

    public int count();

    public void add(User user);

    public void update(User user);

    public void delete(User user);

    public List<User> getUserList();

    //根据roleId获取用户列表
    public List<User> getUserListByRoleId(Role role);

    //获取指定用户的地址列表(user表-address表:1对多关系)
    public User getAddressListByUserId(User user);

}

接口 RoleMapper

public interface RoleMapper {

    public void add(Role role);

    public void update(Role role);

    public void delete(Role role);

    public List<Role> getRoleList();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="cn.bdqn.dao.RoleMapper">
    <select id="getRoleList" resultType="Role">
        select * from role
    </select>

    <insert id="add" parameterType="Role">
        insert into role (roleCode,roleName)
            values (#{roleCode},#{roleName})
    </insert>

    <update id="update" parameterType="Role">
        update role set roleCode=#{roleCode},roleName=#{roleName}
            where id=#{id}
    </update>

    <delete id="delete" parameterType="Role">
        delete from role where id=#{id}
    </delete>

</mapper>

User.java

public class User {
    private Integer id;
    private String userName;
    private String userCode;
    private String userPassword;
    private Integer roleId;
    //private String roleName;

    //collection
    private List<Address> addressList;

    //association
    private Role role;

    public Role getRole() {
        return role;
    }
    public void setRole(Role role) {
        this.role = role;
    }
    public List<Address> getAddressList() {
        return addressList;
    }
    public void setAddressList(List<Address> addressList) {
        this.addressList = addressList;
    }
    public Integer getRoleId() {
        return roleId;
    }
    public void setRoleId(Integer roleId) {
        this.roleId = roleId;
    }
    /**
    public String getRoleName() {
        return roleName;
    }
    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }
    */
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserCode() {
        return userCode;
    }
    public void setUserCode(String userCode) {
        this.userCode = userCode;
    }
    public String getUserPassword() {
        return userPassword;
    }
    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

}

address.java

public class Address {
    private Integer id;
    private Integer postCode;
    private String addressContent;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public Integer getPostCode() {
        return postCode;
    }
    public void setPostCode(Integer postCode) {
        this.postCode = postCode;
    }
    public String getAddressContent() {
        return addressContent;
    }
    public void setAddressContent(String addressContent) {
        this.addressContent = addressContent;
    }

}
时间: 2024-09-30 18:58:43

mybatis 使用resultMap实现关联数据的查询(association 和collection )的相关文章

myBatis系列之四:关联数据的查询

myBatis系列之三:增删改查是基于单表的查询,如果联表查询,返回的是复合对象,需要用association关键字来处理. 如User发表Article,每个用户可以发表多个Article,他们之间是一对多的关系. 1. 创建Article表,并插入测试数据: -- Drop the table if exists DROP TABLE IF EXISTS `Article`; -- Create a table named 'Article' CREATE TABLE `Article` (

mybatis实战教程(mybatis in action)之四:实现关联数据的查询

有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.我们首先创建一个Article 这个表,并初始化数据.  程序代码 Drop TABLE IF EXISTS `article`;Create TABLE `article` (  `id` int(11) NOT NULL auto_increment,  `userid` int(11) NOT NULL,  `title` var

Mybatis学习(4)实现关联数据的查询

有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.我们首先创建一个Article 这个表,并初始化数据.  程序代码 Drop TABLE IF EXISTS `article`; Create TABLE `article` ( `id` int(11) NOT NULL auto_increment, `userid` int(11) NOT NULL, `title` varch

mybatis实战教程(mybatis in action)之四:实现关联数据的查询

有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.我们首先创建一个Article 这个表,并初始化数据. Drop TABLE IF EXISTS `article`; Create TABLE `article` ( `id` int(11) NOT NULL auto_increment, `userid` int(11) NOT NULL, `title` varchar(100

hibernate关联数据作为查询条件

hibernate中,在前台当表关联的数据作为查询条件时,因为hibernate只接受能识别的属性(即在对应的hbm.xml文件中能找到的属性),如果没有,则在后台实现类中的hql中需要用别名进行查询: 前台页面: 后台的查询hql: if(gqm.getGtm() != null &&                 gqm.getGtm().getSm() != null &&                 gqm.getGtm().getSm().getUuid()

14、mybatis学习——分布查询association或collection中多列值传参 以及 局部方法延迟加载问题

举例注释中说明: <collection property="students" select="com.pxxy.bean.StudentMapper.getStusByColId" column="id" fetchType="lazy"> <!-- 多列值传递时:将多列的值封装成map进行传递 column="{key1=column1,key2=column2}" key为sql语

Mybatis:resultMap的使用总结

Mybatis的介绍以及使用:http://www.mybatis.org/mybatis-3/zh/index.html resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中. resultMap包含的元素: <!--column不做限制,可以为任意表的字段,而property须为type 定义的pojo属性--> <resultMap id="唯一的标识" type="映射的pojo对象&

MyBatis:学习笔记(3)——关联查询

MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统,如果我们将用户信息和订单信息都保存在user表中,这样就不存在联结关系,因为我们仅仅操作一张表就好. 但是这是非常不明智的选择,举例来说,一个用户可以拥有多个订单,如果保存在一个表中,势必会导致用户信息的多次出现,因为每个订单绑定的用户信息都是相同的. 所以我们尽量要将不同的信息存储与不同的表中,但

MyBatis关联查询 (association) 时遇到的某些问题/mybatis映射

先说下问题产生的背景: 最近在做一个用到MyBatis的项目,其中有个业务涉及到关联查询,我是将两个查询分开来写的,即嵌套查询,个人感觉这样更方便重用: 关联的查询使用到了动态sql,在执行查询时就出现了如下错误:Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'id' in 'class java.lang.Integer' 因为出现了这个问题,