mybatis的一对多和一对一的关系

原创 2015年11月21日 15:25:34

user表


user_role表



PS:user表中的id对应user_role表中的u_id

user类

public class User {
   
    private Integer id;

    private String username;

    private String password;

    private Integer isDelete;

    private Date createDate;
    
    private List<UserRole> list;//一对多的配置
    
    private UserRole userRole;//一对一的配置

    。。。。。。setget方法
}

mapper接口

User selectByPrimaryKey(String username);
    
User selectByKey(String username);
    
User selectPrimaryKey(String username);

usermapper.xml


<resultMap id="BaseResultMap" type="com.cn.model.User" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="username" property="username" jdbcType="VARCHAR" />
    <result column="password" property="password" jdbcType="VARCHAR" />
    <result column="isDelete" property="isDelete" jdbcType="INTEGER" />
    <result column="createDate" property="createDate" jdbcType="DATE" />
    <collection property="list" ofType="UserRole">
    	<id column="ruid" property="ruid" jdbcType="INTEGER" />
    	<result column="u_id" property="uid" jdbcType="INTEGER" />
    	<result column="rr_id" property="rrid" jdbcType="INTEGER" />
    </collection>
  </resultMap>
  <resultMap id="BaseMap" type="com.cn.model.User" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="username" property="username" jdbcType="VARCHAR" />
    <result column="password" property="password" jdbcType="VARCHAR" />
    <result column="isDelete" property="isDelete" jdbcType="INTEGER" />
    <result column="createDate" property="createDate" jdbcType="DATE" />
    <association property="userRole" javaType="UserRole">
    	<id column="ruid" property="ruid" jdbcType="INTEGER" />
    	<result column="u_id" property="uid" jdbcType="INTEGER" />
    	<result column="rr_id" property="rrid" jdbcType="INTEGER" />
    </association>
  </resultMap>
  <resultMap id="BaseResult" type="com.cn.model.User" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="username" property="username" jdbcType="VARCHAR" />
    <result column="password" property="password" jdbcType="VARCHAR" />
    <result column="isDelete" property="isDelete" jdbcType="INTEGER" />
    <result column="createDate" property="createDate" jdbcType="DATE" />
    <association property="userRole" select="selectRole" column="id">//<span style="color:#ff0000;">此处的id为第一个sql语句查询出来的字段,是要传入下面一个sql的参数,注意类型一定要和下一个sql的入参类型一致</span>
    </association>
  </resultMap>

一、一对一

1、嵌套结果

使用嵌套结果映射来处理重复的联合结果的子集,封装联表查询的数据(去除重复的数据)

<select id="selectByKey" resultMap="BaseMap" parameterType="java.lang.String" >
    select 
    	*
    from user u,user_role ur
    where u.id = ur.u_id and username = #{username,jdbcType=VARCHAR}
</select>

2、嵌套查询

通过执行另外一个SQL映射语句来返回预期的复杂类型

<select id="selectPrimaryKey" resultMap="BaseResult" parameterType="java.lang.String" >
    select 
    	*
    from user 
    where username = #{username,jdbcType=VARCHAR}
</select>
<select id="selectRole" resultType="UserRole" parameterType="java.lang.Integer" >
    select 
    	ruid ruid,u_id uid,rr_id rrid
    from user_role 
    where u_id = #{id,jdbcType=INTEGER}
</select>
PS:如果用resultType的话,必须取别名

二、一对多

<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
    select 
    	*
    from user u,user_role ur
    where u.id = ur.u_id and username = #{username,jdbcType=VARCHAR}
</select>


controller类

/**
	 * 一对多
	 * @return
	 */
	@RequestMapping("/index")
	public ModelAndView index(){
		ModelAndView mv = new ModelAndView();
		User user = userService.selectByPrimaryKey("jack");
		System.out.println(user.getPassword());
		List<UserRole> list = user.getList();
		System.out.println(list.size());
		return mv;
	}
	/**
	 * 一对一(嵌套结果)
	 * @return
	 */
	@RequestMapping("/index2")
	public ModelAndView index2(){
		ModelAndView mv = new ModelAndView();
		User user = userService.selectByKey("john");
		System.out.println(user.getPassword());
		UserRole userRole = user.getUserRole();
		System.out.println(userRole.getRrid());
		return mv;
	}
	/**
	 * 一对一(嵌套查询)
	 * @return
	 */
	@RequestMapping("/index3")
	public ModelAndView index3(){
		ModelAndView mv = new ModelAndView();
		User user = userService.selectPrimaryKey("john");
		System.out.println(user.getPassword());
		UserRole userRole = user.getUserRole();
		System.out.println(userRole.getRrid());
		return mv;
	}


mybatis 实现一对一,一对多,多对多关联查询 小结

1      resultType和resultMap小结 1.1  实现一对一查询: resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列...
  • u012373815
  • u012373815
  • 2015年07月24日 13:45
  • 1955

Mybatis一对一和一对多配置

问题描述 现在有三张数据表,表名为orders,orderdetail,items,分别表示订单,订单详情,商品。其中一个订单包含多个订单详情,表示订单中的不同个具体的商品,订单详情唯一对应一件商品。...
  • u011403655
  • u011403655
  • 2015年06月30日 01:48
  • 5402

MyBatis增删改查、分页、一对一、一对多

一、用到的实体类如下: Student.java [html] view plaincopy package com.company.entity;      import ja...
  • fengwei_mm
  • fengwei_mm
  • 2014年02月15日 23:59
  • 1616

Mybatis关联查询一对一和一对多的实现

本文主要讲了使用Mybatis实现关联查询,分为一对一和一对多两种情况,最后并对ResultMap进行一个简要说明。...
  • Evankaka
  • Evankaka
  • 2015年05月13日 09:20
  • 15596

mybatis中的高级映射一对一、一对多、多对多

学习hibernate的时候,小编已经接触多各种映射,mybatis中映射有到底是如何运转的,今天这篇博文,小编主要来简单的介绍一下mybatis中的高级映射,包括一对一、一对多、多对多,希望多有需要...
  • zhaanghao
  • zhaanghao
  • 2016年08月29日 10:57
  • 405

总结一下数据库的 一对多、多对一、一对一、多对多 关系

关联映射:一对多/多对一 存在最普遍的映射关系,简单来讲就如球员与球队的关系; 一对多:从球队角度来说一个球队拥有多个球员 即为一对多 多对一:从球员角度来说多个球员属于一个球队 即为多对一 数据表间...
  • u013583931
  • u013583931
  • 2014年11月04日 14:40
  • 4636

【Mybatis高级映射】一对一映射、一对多映射、多对多映射

当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射。对于SSM的Mybatis来说,肯定也是差不多的。既然开了头了,...
  • u013045878
  • u013045878
  • 2016年12月16日 21:33
  • 728

mybatis笔记-5-注解(一对一,一对多,多对多)

注解版(一对一,一对多,多对多)
  • caoxuekun
  • caoxuekun
  • 2017年08月08日 21:01
  • 943

Hibernate 关系映射 (一对一,一对多,多对多)

一、概念: 关系:名词,事物之间相互作用、相互联系的状态。 关联:名词:表示对象(数据库表)之间的关系;动词:将对象(数据库表)之间通过某种方式联系起来。 映射:将一种形式转化为另一种形式,包括...
  • shangzhiliang_2008
  • shangzhiliang_2008
  • 2014年12月29日 16:59
  • 3752

mybatis教程---MyBatis一对一、MyBatis一对多

表和表之间的关联映射
  • star180
  • star180
  • 2014年08月09日 16:27
  • 1120
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mybatis的一对多和一对一的关系
举报原因:
原因补充:

(最多只允许输入30个字)