`
zhaoshijie
  • 浏览: 2265458 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mybatis级联查询的两种配置方式(很多人问我,这里给出答案)

 
阅读更多
关键字:mybatis级联查询的两种方式


第一种配置方式:

1.定义四个实体。User   Role    Privilege   Resource,他们之间的对于关系为

2.需求:我通过用户名username查找出该用户对应的角色以及角色对应的权限和资源

3.实体

public class User implements Serializable {
private String id;
private String username;
private String password;

private Set<Role> role = new HashSet<Role>();

public class Role implements Serializable {
private String id;
private String name;
private String des;

private Set<Privilege> privilege = new HashSet<Privilege>();

public class Privilege implements Serializable {  private String id;  private String name;  private String des;

private Set<Resource> resource = new HashSet<Resource>();  private Privilege parent;  private Set<Privilege> child = new HashSet<Privilege>();

public class Resource implements Serializable {
private String id;
private String uri;
private String des;


4.UserMapper.xml的查询方法为

        <resultMap type="user" id="userResult">
<id column="id" property="id"/>
<result column="username" property="username"/>
<collection property="role" javaType="java.util.Set" resultMap="roleResult"/>
</resultMap>

<resultMap type="role" id="roleResult">
<id column="rid" property="id"/>
<result column="rname" property="name"/>
<result column="rdes" property="des"/>
<collection property="privilege" javaType="java.util.Set" resultMap="privilegeResult"/>
</resultMap>

<resultMap type="privilege" id="privilegeResult">
<id column="pid" property="id"/>
<result column="pname" property="name"/>
<collection property="resource" javaType="java.util.Set" resultMap="resourceResult"/>
</resultMap>

<resultMap type="resource" id="resourceResult">
<id column="resid" property="id"/>
<result column="resuri" property="uri"/>
</resultMap>

<select id="findUserByUserName" parameterType="string" resultMap="userResult">
  select u.id,u.username,r.id as rid,r.name as rname,r.des as rdes,p.id as pid,p.name as pname,res.id as resid,res.uri as resuri
  from tb_user u
  left join user_role ur on ur.user_id=u.id
  join tb_role r on r.id=ur.role_id
  join role_privilege rp on rp.role_id=r.id
  join tb_privilege p on p.id=rp.privilege_id
  join tb_resource res on res.privilege_id=p.id
  where u.username=#{username}
</select>

5.UserMapper.java定义方法

@Component
public interface UserMapper {

User findUserByUserName(@Param(value="username")String username);

}



第二种配置方式:

级联(关联)查询,mybatis已经有了很好的支持,配置也相当简单,示例:

一种是一对一的,一种是一结多的,  association用于前者,collection用于后者。下面都有相应配置。



当然一对一的,可以直接配置在一起,就不用两次查询了。


    <resultMap id="usersResult" type="com.zlwh.member.model.Users">
        <result property="id" column="id"/>
        <result property="loginName" column="login_name"/>
        <result property="userName" column="user_name"/>
        <result property="password" column="password"/>
        <result property="email" column="email"/>
        <result property="status" column="status"/>
        <result property="userType" column="user_type"/>
        <result property="memberType" column="member_type"/>
        <result property="imgPath" column="img_path"/>
        <result property="imgStatus" column="img_status"/>
        <result property="identification" column="identification"/>
        <result property="certificateCode" column="certificate_code"/>
        <result property="countyCode" column="county_code"/>
        <result property="schoolId" column="school_id"/>
        <result property="classId" column="class_id"/>
        <result property="grade" column="grade"/>
        <result property="sex" column="sex"/>
        <result property="birthday" column="birthday"/>
        <result property="mobile" column="mobile"/>
        <result property="inviteCode" column="invite_code"/>
        <result property="subjectId" column="subject_id"/>
        <result property="certificationStatus" column="Certification_status"/>
        <result property="createTime" column="create_time"/>
        <result property="validTime" column="valid_time"/>
        <result property="institutionId" column="institution_id"/>
        <result property="depName" column="dep_name"/>
        <result property="jobName" column="job_name"/>
        <association column="school_id" property="school"
        javaType="com.zlwh.member.model.School" select="getSchoolById" />
    </resultMap>
  
         <resultMap id="schoolResult" type="com.zlwh.member.model.School">
        <result property="id" column="id"/>
        <result property="schoolName" column="school_name"/>
        <result property="schoolCode" column="school_code"/>
        <result property="county" column="county"/>
        <result property="address" column="address"/>
        <result property="phase" column="phase"/>
    </resultMap>
      
    <select id="getSchoolById" resultMap="schoolResult">
        SELECT * FROM school WHERE id = #{id}
    </select>
  
    <resultMap id="usersResultForT" type="com.zlwh.member.model.Users">
        <result property="id" column="id"/>
        <result property="loginName" column="login_name"/>
        <result property="userName" column="user_name"/>
        <result property="inviteCode" column="invite_code"/>
        <collection property="userSubscriptions" column="id" select="getUserSubscriptionsByUserId" ></collection>
    </resultMap>
  

  
    <resultMap id="userSubscriptionResult" type="com.zlwh.member.model.UserSubscription">
        <result property="id" column="id"/>
        <result property="userId" column="user_id"/>
        <result property="subscriptionId" column="subscription_id"/>
        <result property="beginDate" column="begin_date"/>
        <result property="endDate" column="end_date"/>
        <result property="status" column="status"/>
        <result property="createTime" column="create_time"/>
        <result property="orderId" column="order_id"/>
        <result property="orderPrice" column="order_price"/>
        <result property="payTime" column="pay_time"/>   
    </resultMap>
  
    <select id="getStudentsByInviteCode" resultMap="usersResultForT">
        <![CDATA[SELECT id,login_name,user_name,invite_code FROM users    WHERE invite_code = #{inviteCode} and member_type=1]]>
    </select>



<select id="getById" resultMap="usersResult">
        SELECT <include refid="commonColumns" />
        <![CDATA[
            FROM users
            WHERE
                id = #{id}
        ]]>
    </select>

  
    <!-- 查所有已支付的订阅 -->
     <select id="getUserSubscriptionsByUserId" resultMap="userSubscriptionResult">
        SELECT * FROM user_subscription WHERE (status=1 or status=3) and user_id = #{userId} order by subscription_id asc
    </select>
  




    <!-- 用于select查询公用抽取的列 -->
    <sql id="commonColumns">
        <![CDATA[
            id ,
            login_name ,
            user_name ,
            password ,
            email ,
            status ,
            user_type ,
            member_type ,
            img_path ,
            img_status ,
            identification ,
            certificate_code ,
            county_code ,
            school_id ,
            class_id ,
            grade ,
            sex ,
            birthday ,
            mobile ,
            invite_code ,
            subject_id ,
            Certification_status ,
            create_time ,
            valid_time ,
            institution_id ,
            dep_name ,
            job_name
        ]]>
    </sql>
分享到:
评论

相关推荐

    mybatis关联/级联以及动态sql

    在关联和级联查询以及动态SQL方面,MyBatis提供了强大的功能,使得开发人员能够更加灵活地处理数据库交互。 首先,我们来探讨MyBatis中的关联(Association)和级联(Cascading)。关联通常用于描述一个实体对象与...

    Mybatis级联查询

    创建数据库,创建一个客户表(customer), 包括客户id,姓名(name),年龄(age),职业(occupation)...应用Mybatis级联查询功能,根据客户id查询表记录信息映射到Customer类对象(包括id,姓名, 年龄,职业,卡号,卡级别)

    springboot集成mybatis的两种使用方式

    本文将详细介绍两种在Spring Boot中集成MyBatis的方法:一种是传统的XML配置方式,另一种是现代的注解方式。这两种方法各有优劣,开发者可以根据项目的实际需求选择合适的集成方式。 首先,我们来看看**XML配置方式...

    java级联查询、分页查询

    在Java编程中,级联查询和分页查询是数据库操作中的常见需求,特别是在处理大量数据时。级联查询用于获取一个实体的相关实体信息,而分页查询则用于提高查询效率和用户体验,避免一次性加载过多数据导致性能下降。...

    mybatis自动生成的两种方式

    本篇文章将详细介绍MyBatis的两种自动生成代码的方式,帮助你提升开发效率。 一、MyBatis Generator(MBG) MBG是MyBatis官方提供的一个代码生成工具,它可以自动生成Java模型类、Mapper接口和XML配置文件。通过...

    Spring boot整合Mybatis实现级联一对多CRUD操作的完整步骤

    在本文中,我们将深入探讨如何使用Spring Boot整合Mybatis实现级联一对多的CRUD(创建、读取、更新、删除)操作。首先,我们需要理解什么是级联操作和一对多的关系。在关系型数据库中,级联操作涉及到一个表中的记录...

    Mybtis级联映射(一对一,一对多)例子

    Mybatis 是一个强大的Java持久层框架,它提供了一种灵活的SQL映射机制,使得开发者可以自由地控制SQL语句的编写,同时还能避免JDBC的繁琐操作。在这个"Mybatis级联映射(一对一,一对多)例子"中,我们将深入探讨...

    MyBatis之自查询使用递归实现 N级联动效果(两种实现方式)

    "MyBatis之自查询使用递归实现 N级联动效果" MyBatis是一个功能强大且灵活的持久层框架,它支持自查询和递归查询,下面我们将探讨如何使用MyBatis实现 N级联动效果。 递归查询 递归查询是指在一个查询中调用自身...

    mybatis递归查询菜单树

    MyBatis是一个优秀的持久层框架,它允许开发者将SQL语句与Java代码直接绑定,提供了一种灵活且强大的数据库操作方式。在这个项目中,MyBatis被用来处理递归查询,这通常涉及到层次结构的数据,如菜单树。递归查询是...

    基于springboot+mybatis的BBS(级联)

    在本项目"基于springboot+mybatis的BBS(级联)"中,开发者将能够深入理解如何在实际应用中整合Spring Boot与MyBatis框架,实现一个功能丰富的论坛(BBS)系统。这个系统特别强调了多表联查、动态SQL以及批量删除等...

    MyBatis自定义映射 级联属性操作.zip

    在"自定义映射 级联属性操作"这个主题中,我们将深入探讨如何在MyBatis中进行自定义的映射配置,以及如何处理级联属性的操作。 1. **自定义映射(Mapper XML文件)** MyBatis允许我们在Mapper XML文件中编写SQL...

    09MyBatis配置 sqlMapConfig1

    MyBatis配置文件sqlMapConfig1详解 MyBatis是一个流行的基于Java的持久层框架,用于简化Java应用程序中的数据访问。它提供了一个灵活的SQL映射框架,支持各种数据库管理系统,包括MySQL、Oracle、SQL Server等。...

    Spring整合MyBatis关联查询示例

    关联查询的执行通常有两种方式: 1. **嵌套结果映射**(Nested Result Maps):在同一个ResultMap中定义一对一或一对多的子ResultMap,MyBatis会自动处理关联对象的填充。 2. **关联查询**(Association Queries):...

    springboot整合mybatis集成分页查询事务配置,页面模板

    在本项目中,我们主要探讨的是如何在SpringBoot框架下整合MyBatis,实现数据库的分页查询,事务管理,并配置前端页面模板。下面将详细阐述这些知识点。 首先,SpringBoot是一个快速开发框架,它简化了Spring应用的...

    spring整合mybatis时需要用到的配置文件

    在Spring和MyBatis的整合过程中,配置文件起着至关重要的作用。它们定义了Spring如何管理MyBatis的SqlSessionFactory,以及数据源、事务管理器等核心组件。下面将详细阐述这些配置文件的关键内容。 首先,`User....

    mybatis+spring 框架中配置日志中显示sql语句

    在MyBatis与Spring整合的框架中,为了便于调试和性能优化,我们常常需要在日志中打印出执行的SQL语句。以下是如何在这样的环境中配置日志来显示SQL语句的详细步骤。 首先,我们需要了解MyBatis的日志实现。MyBatis...

    mybatis、mybatis详细设计、mybatis配置

    MyBatis的配置文件是整个框架的起点,主要分为两个部分:全局配置文件(mybatis-config.xml)和映射文件(Mapper XML)。全局配置文件中包含了数据源、事务管理器、环境配置等基本信息,例如: ```xml ...

    scala + mybatis 数据库查询

    - Scala的函数式编程特性可以让我们以一种简洁且易于理解的方式处理查询结果。例如,我们可以使用`map`、`filter`和`foldLeft`等函数对查询结果进行操作。 - 使用高阶函数,可以轻松实现查询结果的转换、过滤和...

    手写mybatis实现查询所有操作

    在本文中,我们将深入探讨如何手写MyBatis实现查询所有操作,以加深对其工作原理的理解。 首先,我们需要理解MyBatis的核心组件。MyBatis包含SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession和Mapper接口...

Global site tag (gtag.js) - Google Analytics