mybatis一对一,一对多关联映射的配置

情景分析

一个用户(User)有多个订单(Orders),一个订单只属于一个用户。对于订单来说订单对用户为一对一的关系,对于用户来说用户对订单是一对多的关系

一对一关系

1、在pojo中添加相关属性,并设置getter和setter方法

Orders.java
public class Orders {
    private Integer id;

    private Integer userid;

    private String orderid;

    private Date createtime;

    private String note;
    
    //每个订单对应一个用户
    private User user;
    
    //一个订单对应多个订单详细
    private List<Orderdetail> detaiList;

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}
	

	public List<Orderdetail> getDetaiList() {
		return detaiList;
	}

	public void setDetaiList(List<Orderdetail> detaiList) {
		this.detaiList = detaiList;
	} 
}

2、在mapper.xml的resultMap中配置关联关系

在OrdersMapper.xml中配置订单对用户的一对一关系

OrdersMapper.xml
<resultMap id="BaseResultMap" type="com.gec.pojo.Orders" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="userId" property="userid" jdbcType="INTEGER" />
    <result column="orderId" property="orderid" jdbcType="VARCHAR" />
    <result column="createtime" property="createtime" jdbcType="DATE" />
    <result column="note" property="note" jdbcType="VARCHAR" />
    <!-- association设置一对一关系,这里设置一个订单对应一个User -->
    <association property="user" javaType="com.gec.pojo.User">
    	<!-- column为查询结果表中字段名(结果表中可能有别名),property为pojo中的属性名 -->
		<id column="userId" property="id" jdbcType="INTEGER" />
	    <result column="username" property="username" jdbcType="VARCHAR" />
	    <result column="birthday" property="birthday" jdbcType="DATE" />
	    <result column="address" property="address" jdbcType="VARCHAR" />    
    </association>
  </resultMap>

3、在mapper.xml中添加select语句,该语句的resultMap为第2步中配置的resultMap(即id)

OrdersMapper.xml
<select id="findOrdersWithUser" resultMap="BaseResultMap">
  	select o.id,o.userId,o.orderId,o.createtime,o.note,u.username,u.birthday,u.address
  	from orders o 
  	join t_user u
  	on o.userId=u.id
  </select>

4、在mapper.java接口中添加对应的方法

OrdersMapper.java
public interface OrdersMapper {

	List<Orders> findOrdersWithUser();
	
}

一对多关系

一个用户有多个订单
配置映射过程相同,代码如下

user.java
public class User {
    private Integer id;

    private String username;

    private Date birthday;

    private String address;
    //-------- 以上为对应数据库中user表的各属性,不考虑其getter和setter方法------

    //一个用户有多个订单,用list类型存储
    private List<Orders> ordersList;
    
    public List<Orders> getOrdersList() {
		return ordersList;
	}

	public void setOrdersList(List<Orders> ordersList) {
		this.ordersList = ordersList;
	}	
}
userMapper.xml
<resultMap id="BaseResultMap" type="com.gec.pojo.User" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="username" property="username" jdbcType="VARCHAR" />
    <result column="birthday" property="birthday" jdbcType="DATE" />
    <result column="address" property="address" jdbcType="VARCHAR" />
   	<!-- collection配置一对多关系,ofType属性为关联的属性的jdbc类型,
   	如:User有多个订单Orders,则这里的ofType类型为“com.gec.pojo.Orders” -->
   	<collection property="ordersList" ofType="com.gec.pojo.Orders">
   		<id column="oid" property="id" jdbcType="INTEGER" />
	    <result column="userId" property="userid" jdbcType="INTEGER" />
	    <result column="orderId" property="orderid" jdbcType="VARCHAR" />
	    <result column="createtime" property="createtime" jdbcType="DATE" />
	    <result column="note" property="note" jdbcType="VARCHAR" />
   	</collection>
  </resultMap>


<select id="findUserWithOrderses" resultMap="BaseResultMap" >
  	select u.id,u.username,u.birthday,u.address,
  	o.id oid,o.orderId,o.createtime,o.note
  	from orders o 
  	join t_user u
  	on o.userId=u.id
  </select>

UserMapper.java
public interface UserMapper{
	List<User> findUserWithOrderses();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis是一款优秀的ORM框架,支持一对一、一对多、多对一、多对多等关联映射。其中,一对多关联映射是指一个实体类中包含多个另一个实体类的对象。下面是一对多关联映射的实现方法: 1.在主实体类中定义一个包含从实体类对象的List集合属性。 2.在主实体类对应的Mapper.xml文件中,使用<collection>标签来映射从实体类对象的List集合属性。 3.在从实体类对应的Mapper.xml文件中,使用<association>标签来映射主实体类对象。 具体实现可以参考以下代码: 主实体类User: ``` public class User { private Integer id; private String username; private List<Order> orders; //getter和setter方法 } ``` 从实体类Order: ``` public class Order { private Integer id; private String orderNo; private User user; //getter和setter方法 } ``` 主实体类User对应的Mapper.xml文件: ``` <mapper namespace="com.biem.mapper.UsersMapper"> <resultMap id="userMap" type="User"> <id property="id" column="id"/> <result property="username" column="username"/> <collection property="orders" ofType="Order"> <id property="id" column="order_id"/> <result property="orderNo" column="order_no"/> </collection> </resultMap> <select id="getUserById" resultMap="userMap"> select * from user where id=#{id} </select> </mapper> ``` 从实体类Order对应的Mapper.xml文件: ``` <mapper namespace="com.biem.mapper.OrdersMapper"> <resultMap id="orderMap" type="Order"> <id property="id" column="id"/> <result property="orderNo" column="order_no"/> <association property="user" javaType="User"> <id property="id" column="user_id"/> <result property="username" column="username"/> </association> </resultMap> <select id="getOrderById" resultMap="orderMap"> select * from order where id=#{id} </select> </mapper> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值