`

mybatis 自身关联 映射

 
阅读更多

使用mybatis的时候遇到关联问题。

 

可以参考如下:

 

一个自关联的model

public class TreeDic  implements java.io.Serializable{
	private static final long serialVersionUID = 5454155825314635342L;
	
	//alias
	public static final String TABLE_ALIAS = "树形树形字典";
	public static final String ALIAS_ID = "编号";
	public static final String ALIAS_PARENT_ID = "父节点编号";
	public static final String ALIAS_PARENT_IDS = "所有父节点编号";
	public static final String ALIAS_TYPE = "分类";
	public static final String ALIAS_CODE = "键值";
	public static final String ALIAS_NAME = "标签";
	public static final String ALIAS_REMARKS = "描述";
	public static final String ALIAS_SORT = "排序";
	public static final String ALIAS_DEL_FLAG = "del_flag";
	public static final String ALIAS_VERSION = "version";
	
	//date formats
	
	
	private TreeDic parent;
	
	private List<TreeDic> childList = Lists.newArrayList();
	
	//可以直接使用: @Length(max=50,message="用户名长度不能大于50")显示错误消息
	//columns START
    /**
     * id       db_column: id 
     */	
	@Max(9223372036854775807L)
	private java.lang.Long id;
    /**
     * parent_id       db_column: parent_id 
     */	
	@NotNull @Max(9223372036854775807L)
	private java.lang.Long parentId;
    /**
     * parent_ids       db_column: parent_ids 
     */	
	@NotBlank @Length(max=255)
	private java.lang.String parentIds;
    /**
     * type       db_column: type 
     */	
	@Length(max=100)
	private java.lang.String type;
    /**
     * code       db_column: code 
     */	
	@Length(max=100)
	private java.lang.String code;
    /**
     * name       db_column: name 
     */	
	@Length(max=100)
	private java.lang.String name;
    /**
     * remarks       db_column: remarks 
     */	
	@Length(max=255)
	private java.lang.String remarks;
    /**
     * sort       db_column: sort 
     */	
	@Max(9999999999L)
	private java.lang.Integer sort;
    /**
     * del_flag       db_column: del_flag 
     */	
	@Length(max=1)
	private java.lang.String delFlag;
    /**
     * version       db_column: version 
     */	
	@Max(9999999999L)
	private java.lang.Integer version;
	//columns END

	public TreeDic(){
	    this.delFlag = "0";
	    this.version = 1;
	}

	public TreeDic(
		java.lang.Long id
	){
		this.id = id;
	}

	public void setId(java.lang.Long value) {
		this.id = value;
	}
	
	public java.lang.Long getId() {
		return this.id;
	}
	public void setParentId(java.lang.Long value) {
		this.parentId = value;
	}
	
	public java.lang.Long getParentId() {
		return this.parentId;
	}
	public void setParentIds(java.lang.String value) {
		this.parentIds = value;
	}
	
	public java.lang.String getParentIds() {
		return this.parentIds;
	}
	public void setType(java.lang.String value) {
		this.type = value;
	}
	
	public java.lang.String getType() {
		return this.type;
	}
	public void setCode(java.lang.String value) {
		this.code = value;
	}
	
	public java.lang.String getCode() {
		return this.code;
	}
	public void setName(java.lang.String value) {
		this.name = value;
	}
	
	public java.lang.String getName() {
		return this.name;
	}
	public void setRemarks(java.lang.String value) {
		this.remarks = value;
	}
	
	public java.lang.String getRemarks() {
		return this.remarks;
	}
	public void setSort(java.lang.Integer value) {
		this.sort = value;
	}
	
	public java.lang.Integer getSort() {
		return this.sort;
	}
	public void setDelFlag(java.lang.String value) {
		this.delFlag = value;
	}
	
	public java.lang.String getDelFlag() {
		return this.delFlag;
	}
	public void setVersion(java.lang.Integer value) {
		this.version = value;
	}
	
	public java.lang.Integer getVersion() {
		return this.version;
	}
	
	

	/**
     * @return Returns the parent.
     */
    public TreeDic getParent() {
        return parent;
    }

    /**
     * @param parent The parent to set.
     */
    public void setParent(TreeDic parent) {
        this.parent = parent;
    }

    /**
     * @return Returns the childList.
     */
    public List<TreeDic> getChildList() {
        return childList;
    }

    /**
     * @param childList The childList to set.
     */
    public void setChildList(List<TreeDic> childList) {
        this.childList = childList;
    }
    
    public static void sortList(List<TreeDic> list, List<TreeDic> sourcelist, Long parentId){
        for (int i=0; i<sourcelist.size(); i++){
            TreeDic e = sourcelist.get(i);
            if (e.getParent()!=null && e.getParent().getId()!=null
                    && e.getParent().getId().equals(parentId)){
                list.add(e);
                // 判断是否还有子节点, 有则继续获取子节点
                for (int j=0; j<sourcelist.size(); j++){
                    TreeDic childe = sourcelist.get(j);
                    if (childe.getParent()!=null && childe.getParent().getId()!=null
                            && childe.getParent().getId().equals(e.getId())){
                        sortList(list, sourcelist, e.getId());
                        break;
                    }
                }
            }
        }
    }

    public boolean isRoot(){
        return isRoot(this.id);
    }
    
    public static boolean isRoot(Long id){
        return id != null && id.equals(1L);
    }

    public String toString() {
		return ToStringBuilder.reflectionToString(this);
	}
	
	public int hashCode() {
		return new HashCodeBuilder()
			.append(getId())
			.toHashCode();
	}
	
	public boolean equals(Object obj) {
		if(obj instanceof TreeDic == false) return false;
		if(this == obj) return true;
		TreeDic other = (TreeDic)obj;
		return new EqualsBuilder()
			.append(getId(),other.getId())
			.isEquals();
	}
}

   

 

    Mapper文件的配置很重要:

    

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


<!-- 不使用namespace的话sql搜索定位会比较方便 -->
<mapper namespace="TreeDic">

	<resultMap id="RM.TreeDic" type="net.cciot.snail.sys.model.TreeDic">
        <result property="id" column="id"/>
        <result property="parentId" column="parent_id"/>
        <result property="parentIds" column="parent_ids"/>
        <result property="type" column="type"/>
        <result property="code" column="code"/>
        <result property="name" column="name"/>
        <result property="remarks" column="remarks"/>
        <result property="sort" column="sort"/>
        <result property="delFlag" column="del_flag"/>
        <result property="version" column="version"/>
        <!-- 查询父模块 -->  
        <association property="parent" column="parent_id" select="TreeDic.getById" />
        <!-- 查询子模块 -->  
        <collection property="childList" column="id" select="TreeDic.getChildList" />  
	</resultMap>
	
	<!-- 用于select查询公用抽取的列 -->
	<sql id="TreeDic.columns">
	    <![CDATA[
		id,parent_id,parent_ids,type,code,name,remarks,sort,del_flag,version
	    ]]>
	</sql>

	<!-- useGeneratedKeys="true" keyProperty="xxx" for sqlserver and mysql -->
	<insert id="TreeDic.insert" useGeneratedKeys="true" keyProperty="id">
    <![CDATA[
        INSERT INTO sys_tree_dic (
         id, parent_id, parent_ids, type, code, name, remarks, sort, del_flag, version
        ) VALUES (
         #{id}, #{parentId}, #{parentIds}, #{type}, #{code}, #{name}, #{remarks}, #{sort}, #{delFlag}, #{version}        
        )
    ]]>
		<!--	
			oracle: order="BEFORE" SELECT sequenceName.nextval AS ID FROM DUAL 
			DB2: order="BEFORE"" values nextval for sequenceName
		<selectKey resultType="java.lang.Long" order="BEFORE" keyProperty="userId">
			SELECT sequenceName.nextval AS ID FROM DUAL 
        </selectKey>
		-->
	</insert>
    
	<update id="TreeDic.update" >
    <![CDATA[
        UPDATE sys_tree_dic SET
	        parent_id = #{parentId} , parent_ids = #{parentIds} , type = #{type} , code = #{code} , name = #{name} , remarks = #{remarks} , sort = #{sort} , del_flag = #{delFlag} , version = version + 1 
        WHERE 
        	id = #{id}  	        
    ]]>
	</update>

    <delete id="TreeDic.delete">
    <![CDATA[
        UPDATE sys_tree_dic SET
            del_flag = '1'
        WHERE
        id = #{id} 
    ]]>
    </delete>
    
    <select id="TreeDic.getById" resultMap="RM.TreeDic">
		SELECT <include refid="TreeDic.columns" />
	    <![CDATA[
		    FROM sys_tree_dic 
	        WHERE 
		        id = #{id} 
	    ]]>
	</select>
	
	<select id="TreeDic.getChildList" resultMap="RM.TreeDic">
        SELECT <include refid="TreeDic.columns" />
        <![CDATA[
            FROM sys_tree_dic 
            WHERE 
                parent_id = #{id} 
        ]]>
    </select>
	
	
	<sql id="TreeDic.findPage.where">
		<!-- ognl访问静态方法的表达式 为@class@method(args),以下为调用rapid中的Ognl.isNotEmpty()方法,还有其它方法如isNotBlank()可以使用,具体请查看Ognl类 -->
		<where>	      				
	       <if test="@Ognl@isNotEmpty(id)">
				AND id = #{id}
			</if>
	       <if test="@Ognl@isNotEmpty(parentId)">
				AND parent_id = #{parentId}
			</if>
	       <if test="@Ognl@isNotEmpty(parentIds)">
				AND parent_ids = #{parentIds}
			</if>
	       <if test="@Ognl@isNotEmpty(type)">
				AND type = #{type}
			</if>
	       <if test="@Ognl@isNotEmpty(code)">
				AND code = #{code}
			</if>
	       <if test="@Ognl@isNotEmpty(name)">
				AND name = #{name}
			</if>
	       <if test="@Ognl@isNotEmpty(remarks)">
				AND remarks = #{remarks}
			</if>
	       <if test="@Ognl@isNotEmpty(sort)">
				AND sort = #{sort}
			</if>
	       <if test="@Ognl@isNotEmpty(delFlag)">
				AND del_flag = #{delFlag}
			</if>
	       <if test="@Ognl@isNotEmpty(version)">
				AND version = #{version}
			</if>
		</where>
	</sql>
		
    <select id="TreeDic.findPage.count" resultType="long">
        SELECT count(*) FROM sys_tree_dic 
		<include refid="TreeDic.findPage.where"/>    
    </select>
    
    <!--
    	分页查询已经使用Dialect进行分页,也可以不使用Dialect直接编写分页
    	因为分页查询将传 offset,pageSize,lastRows 三个参数,不同的数据库可以根于此三个参数属性应用不同的分页实现
    -->
    <select id="TreeDic.findPage" resultMap="RM.TreeDic">
    	SELECT <include refid="TreeDic.columns" />
	    FROM sys_tree_dic 
		<include refid="TreeDic.findPage.where"/>
		
		<if test="@Ognl@isNotEmpty(sortColumns)">
			ORDER BY ${sortColumns}
		</if>
		
		<if test="offset != null and pageSize != null" >
          <![CDATA[ limit #{offset} , #{pageSize} ]]>
        </if>
    </select>

	
</mapper>

 

    总结与此,方便下次使用

 

分享到:
评论

相关推荐

    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