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

mybatis 自身关联 映射

 
阅读更多
实体类

public class Module {

	private int id;
	private String key;
	private String name;
	private Module parentModule;
	private List<Module> childrenModules;
	private String url;
	private int sort;
	private String show;
	private String del;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getKey() {
		return key;
	}

	public void setKey(String key) {
		this.key = key;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Module getParentModule() {
		return parentModule;
	}

	public void setParentModule(Module parentModule) {
		this.parentModule = parentModule;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public int getSort() {
		return sort;
	}

	public void setSort(int sort) {
		this.sort = sort;
	}

	public String getShow() {
		return show;
	}

	public void setShow(String show) {
		this.show = show;
	}

	public String getDel() {
		return del;
	}

	public void setDel(String del) {
		this.del = del;
	}

	public List<Module> getChildrenModules() {
		return childrenModules;
	}

	public void setChildrenModules(List<Module> childrenModules) {
		this.childrenModules = childrenModules;
	}
}



<mapper namespace="com.sagaware.caraccess.mapper.ModuleMapper">

	<resultMap type="Module" id="moduleResultMap">
		<id property="id" column="module_id"/>
		<result property="key" column="module_key"/>
		<result property="name" column="module_name"/>
		<result property="url" column="module_url"/>
		<result property="sort" column="module_sort"/>
		<result property="show" column="module_show"/>
		<result property="del" column="module_del"/>
		
		<!-- 查询父模块 -->
		<association property="parentModule" column="module_parent_id" select="getModulesById" />
		
		<!-- 查询子模块 -->
		<collection property="childrenModules" column="module_id" select="getChildrenModues" />
		
	</resultMap>
	
	<select id="getModules" parameterType="String" resultMap="moduleResultMap">
		select * from tb_module where module_id=2
	</select>
	
	<select id="getModulesById" parameterType="int" resultMap="moduleResultMap">
		select * from tb_module where module_id = #{module_id}
	</select>
	
	<select id="getChildrenModues" parameterType="int" resultMap="moduleResultMap">
		select * from tb_module where module_parent_id = #{module_id}
	</select>
</mapper>

分享到:
评论
6 楼 李成林_89 2016-03-25  
李成林_89 写道
楼主有没有时间帮我看一下:当我将resultMap的type设置成hashMap时,返回多条数据就不会报错,
 <resultMap id="hashMap" type="HashMap" >
    <result column="menu" property="key" />
    <association property="value" resultMap="BaseResultMap"></association>
  </resultMap>
  <select id="selectAll" resultType="hashMap" >
    select 
    <include refid="Base_Column_List" />
    from menu
  </select>

但是按照楼主设定的方式,启动服务就会报错,能帮我看一下为什么吗?是那里配置出了问题吗? 谢谢
<resultMap id="menuList" type="com.znb.Entity.Menu" >
	   	<id column="id" property="id" jdbcType="INTEGER" />
	    <result column="men_id" property="menId" jdbcType="INTEGER" />
	    <result column="code" property="code" jdbcType="VARCHAR" />
	    <result column="name" property="name" jdbcType="VARCHAR" />
	    <result column="url" property="url" jdbcType="VARCHAR" />
	    <result column="isleaf" property="isleaf" jdbcType="BIT" />
	    <result column="style" property="style" jdbcType="VARCHAR" />
    
    	<!-- 查询父模块 -->  
    	<association property="parentMenu" column="men_id" select="getModulesById" />  
    	<!-- 查询子模块 -->  
    	<collection property="childrenMenu" column="id" select="getChildrenModues" />  
	</resultMap>
  	
  	<select id="selectMenuList" resultType="menuList" >
   	 	select * from menu where id = 1
  	</select>
  	
  	<select id="getModulesById" parameterType="int" resultMap="menuList">  
        select * from menu where id = #{id}  
    </select>  
      
    <select id="getChildrenModues" parameterType="int" resultMap="menuList">  
        select * from menu where men_id = #{id}  
    </select> 

使用这个type,这是一个menu实体,返回单一数据也不会出问题
  <resultMap id="BaseResultMap" type="com.znb.Entity.Menu" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="men_id" property="menId" jdbcType="INTEGER" />
    <result column="code" property="code" jdbcType="VARCHAR" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="url" property="url" jdbcType="VARCHAR" />
    <result column="isleaf" property="isleaf" jdbcType="BIT" />
    <result column="style" property="style" jdbcType="VARCHAR" />
  </resultMap>
  <sql id="Base_Column_List" >
    id, men_id, code, name, url, isleaf, style
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    from menu
    where id = #{id,jdbcType=INTEGER}
  </select>

部分错误代码如下:
Caused by: org.apache.ibatis.builder.BuilderException: Error resolving class. Cause: org.apache.ibatis.type.TypeException: Could not resolve type alias 'menuList'.  Cause: java.lang.ClassNotFoundException: Cannot find class: menuList
	at org.apache.ibatis.builder.BaseBuilder.resolveClass(BaseBuilder.java:118)
	at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:74)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(XMLMapperBuilder.java:135)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(XMLMapperBuilder.java:128)
	at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:118)
	... 82 more
Caused by: org.apache.ibatis.type.TypeException: Could not resolve type alias 'menuList'.  Cause: java.lang.ClassNotFoundException: Cannot find class: menuList
	at org.apache.ibatis.type.TypeAliasRegistry.resolveAlias(TypeAliasRegistry.java:120)
	at org.apache.ibatis.builder.BaseBuilder.resolveAlias(BaseBuilder.java:149)
	at org.apache.ibatis.builder.BaseBuilder.resolveClass(BaseBuilder.java:116)
	... 86 more
Caused by: java.lang.ClassNotFoundException: Cannot find class: menuList
	at org.apache.ibatis.io.ClassLoaderWrapper.classForName(ClassLoaderWrapper.java:200)
	at org.apache.ibatis.io.ClassLoaderWrapper.classForName(ClassLoaderWrapper.java:89)
	at org.apache.ibatis.io.Resources.classForName(Resources.java:261)
	at org.apache.ibatis.type.TypeAliasRegistry.resolveAlias(TypeAliasRegistry.java:116)
	... 88 more
Related cause:
5 楼 李成林_89 2016-03-25  
楼主有没有时间帮我看一下:当我将resultMap的type设置成hashMap时,返回多条数据就不会报错,
 <resultMap id="hashMap" type="HashMap" >
    <result column="menu" property="key" />
    <association property="value" resultMap="BaseResultMap"></association>
  </resultMap>
  <select id="selectAll" resultType="hashMap" >
    select 
    <include refid="Base_Column_List" />
    from menu
  </select>

但是按照楼主设定的方式,启动服务就会报错,能帮我看一下为什么吗?是那里配置出了问题吗? 谢谢
<resultMap id="menuList" type="com.znb.Entity.Menu" >
	   	<id column="id" property="id" jdbcType="INTEGER" />
	    <result column="men_id" property="menId" jdbcType="INTEGER" />
	    <result column="code" property="code" jdbcType="VARCHAR" />
	    <result column="name" property="name" jdbcType="VARCHAR" />
	    <result column="url" property="url" jdbcType="VARCHAR" />
	    <result column="isleaf" property="isleaf" jdbcType="BIT" />
	    <result column="style" property="style" jdbcType="VARCHAR" />
    
    	<!-- 查询父模块 -->  
    	<association property="parentMenu" column="men_id" select="getModulesById" />  
    	<!-- 查询子模块 -->  
    	<collection property="childrenMenu" column="id" select="getChildrenModues" />  
	</resultMap>
  	
  	<select id="selectMenuList" resultType="menuList" >
   	 	select * from menu where id = 1
  	</select>
  	
  	<select id="getModulesById" parameterType="int" resultMap="menuList">  
        select * from menu where id = #{id}  
    </select>  
      
    <select id="getChildrenModues" parameterType="int" resultMap="menuList">  
        select * from menu where men_id = #{id}  
    </select> 

使用这个type,这是一个menu实体,返回单一数据也不会出问题
  <resultMap id="BaseResultMap" type="com.znb.Entity.Menu" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="men_id" property="menId" jdbcType="INTEGER" />
    <result column="code" property="code" jdbcType="VARCHAR" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="url" property="url" jdbcType="VARCHAR" />
    <result column="isleaf" property="isleaf" jdbcType="BIT" />
    <result column="style" property="style" jdbcType="VARCHAR" />
  </resultMap>
  <sql id="Base_Column_List" >
    id, men_id, code, name, url, isleaf, style
  </sql>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select 
    <include refid="Base_Column_List" />
    from menu
    where id = #{id,jdbcType=INTEGER}
  </select>
4 楼 Agwawaw 2015-08-22  
     这个自关联是不是相当于两次查询,先查父再查子
3 楼 271387591 2014-09-05  
这个示例在只查询一条记录时是没有问题的,但返回LIST集合时且如果某条数据有2个以上的child时,返回的LIST结果中是拿不到child和parent的。解决的方案是在查询parent和child的select语句中加入flushCache="true"。mybatis的缓存机制有严重问题。在多级联映射查询时,最好加入该属性限制。不然会报classcastexception异常
2 楼 prototypes 2014-01-08  
<select id="getModulesById" parameterType="int" resultMap="moduleResultMap"> 
        select * from tb_module where module_id = #{module_id} 
    </select>

你这个参数名称是怎么确定的
1 楼 shidan66 2012-04-21  
学习了,正好用到这个~感谢楼主

相关推荐

    MyBatis的关联映射-资料.rar

    7. **自关联映射**:当一个实体类中的字段类型是自身类型时,可以进行自关联映射,例如员工的上级员工关系。 8. **外键策略**:MyBatis提供多种外键处理策略,如`useGeneratedKeys`和`keyProperty`,帮助处理自增...

    mybatis自关联查询

    自关联查询就是当一个实体类(如 Category)需要引用自身来表示这种关系时所采用的方法。 1. 实体类设计: 首先,我们需要创建 Category 类,其中包含 ID、名称等属性,并添加一个 List&lt;News&gt; 的属性来表示所属的...

    mybatis 的高级关联查询源码

    MyBatis 是一款著名的持久层框架,它允许开发者将 SQL 查询与 Java 代码直接结合,提供了强大而灵活的映射机制。在实际的业务场景中,我们常常需要处理多表关联查询,例如“一对多”关系。这次我们将深入探讨 ...

    MyBatis结果映射.docx

    当执行`selectOrders`查询时,MyBatis会使用`myOrder`结果映射自动将查询结果转换为`Order`对象列表,每个`Order`对象包含其自身的`id`和`name`,以及一个`Customer`对象,表示该订单所属的客户。 总结来说,这个...

    手撕Mybatis源码,自己动手实现Mybatis

    着手“手撕Mybatis源码,自己动手实现Mybatis”是一项深入理解其内部机制的挑战,也是提升自身编程技能的绝佳途径。下面我们将探讨Mybatis的核心组件和工作原理,以及如何基于这些知识构建一个类似的框架。 1. **...

    mybatis-3-mybatis-3.5.8.zip源码

    6. **MappedStatement**: 表示一个映射语句,封装了SQL的ID、SQL语句、参数类型、返回值类型等信息,是MyBatis将Java方法与SQL语句关联起来的桥梁。 7. **ParameterHandler**: 参数处理器,用于处理SQL语句中的参数...

    mybatis.docx教程

    对于MyBatis自身的配置,创建一个名为`configuration.xml`的文件,通常放在`src/main/resources`目录下。此文件遵循MyBatis的配置DTD,如: ```xml &lt;!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config ...

    mybatis-3-mybatis-3.5.11.zip

    5. **结果映射**:MyBatis 自动将 SQL 查询结果转换为 Java 对象,通过 resultType 或 resultMap 配置,可以指定简单的类型映射或复杂的对象关联映射。 6. **参数映射**:MyBatis 支持多种方式传递参数,包括 Map、...

    Mybatis必备资源包

    Mybatis是中国著名的开源Java持久层框架之一,由Jim Wang创建,旨在简化数据库操作,使得开发者可以专注于SQL本身,而无需过于关注数据访问...同时,对于面试和职业发展来说,精通Mybatis也是提升自身技能的重要一步。

    mybatis-3-mybatis-3.5.13.tar.gz

    8. **ResultMap**:ResultMap 是 MyBatis 中用于映射结果集的配置,它可以处理复杂的映射关系,如一对一、一对多、多对一等关联映射。 9. **TypeHandler**:TypeHandler 负责 Java 类型与 JDBC 类型之间的转换,...

    mybatis-配套资源

    你可以选择由MyBatis自身管理事务,也可以在应用层面进行控制。在学习过程中,了解如何配置和使用事务管理,对于开发高可用性的系统至关重要。 此外,MyBatis支持结果映射,允许自定义字段与对象属性的映射规则,...

    mybatis文档

    MyBatis通过@Mapper注解将Mapper接口与XML映射文件关联起来,使得可以通过调用接口方法执行SQL。同时,还可以使用@Select、@Insert、@Update、@Delete等注解在接口方法上直接写SQL。 七、事务管理 MyBatis的事务...

    mybatis-src-3.2.2.zip

    接口的方法签名与XML文件中的SQL映射元素关联,使得可以在Java代码中调用SQL。 5. **Executor**:执行器是MyBatis的执行核心,负责执行SQL,有两种类型:SimpleExecutor和ReusedExecutor。SimpleExecutor每次都会...

    mybatis的讲课笔记, 包含mybatis的缓存,配置等

    - **一级缓存**: 由 MyBatis 自身维护,也称为本地缓存,它的作用范围是同一个 `SqlSession` 内。在一个 `SqlSession` 中,执行查询操作时,会将查询结果缓存到一级缓存中;如果再次查询相同的数据,会直接从缓存中...

    mybatis写的学生系统

    这表明该项目不仅运用了MyBatis,还可能结合了Java的注解功能,如Spring框架的@Autowired注解用于自动装配依赖,或者MyBatis自身的@Select、@Insert、@Update和@Delete等注解,这些注解简化了SQL语句的编写和映射,...

    Mybatis入门实例(五)——MyBatis与Spring 3.X的整合

    MyBatis是一个优秀的持久层框架,它简化了SQL映射,而Spring框架则提供了强大的依赖注入和管理功能。两者的结合使得开发更加便利,降低了代码的耦合度。 首先,我们需要理解MyBatis的核心概念。MyBatis通过XML或...

    mybatis详解源码

    3. 映射器接口和映射文件的绑定:MyBatis如何将Mapper接口与XML映射文件关联起来,实现接口调用和SQL执行的关联。 4. 数据库连接与事务管理:MyBatis如何管理数据库连接,以及如何实现事务控制。 5. 参数和结果集...

    idea mybatis-plugin 插件

    "mybaits-plug"这个标签可能是对"Mybatis-plugin"的简化写法,它突出了插件与MyBatis框架的关联性。这表明该插件专注于MyBatis框架的开发辅助。 【文件名称列表】 "mybatis_plugin"可能代表的是该插件的安装文件或...

    MYBatis总结.docx

    在分页方面,MyBatis允许通过PageHelper等插件实现高效分页,但这通常不是MyBatis自身的内置功能,需要额外配置和引入第三方库。 总之,MyBatis提供了一个灵活的持久层解决方案,允许开发者保留对SQL的控制,同时...

    mybatis源码

    1. SQL映射:MyBatis 的核心是XML或注解形式的SQL映射文件,这些文件定义了SQL语句和Java方法之间的关联。通过动态SQL,我们可以构建高度可定制的查询,避免了硬编码SQL,提高了代码的可维护性。 2. 映射器(Mapper...

Global site tag (gtag.js) - Google Analytics