Mybatis对象关系映射中一对多、多对一、多对多关系出现相同字段名的情况处理

一、有下面三个类,关系为一对多(多对一、多对多关系同理)
1、UserInfo

public class UserInfo {
    private Long id;
    private String username;
    private String password;
    private String salt;
    private List<RoleInfo> roleInfos;
。。。。。。

2、RoleInfo

public class RoleInfo {
    private Long id;
    private String roleName;
    private List<PermissionInfo> permissionInfos;
。。。。。。

3、PermissionInfo

public class PermissionInfo {
    private Long id;
    private String permissionName;
。。。。。。

二、数据库表结构

CREATE TABLE `user_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `salt` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

CREATE TABLE `role_info` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `role_name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

CREATE TABLE `permission_info` (
  `id` bigint(20) NOT NULL,
  `permission_name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

三、可以看出三个表都有相同的字段 id,如果不做任何处理,查询结果会出问题
解决方法一:修改数据库表结构,为每个表的id取不同的名称(如果项目刚开始做,表结构还没成形,推荐用这个方法;否则将会对当前代码造成大量改动,不推荐)
解决方法二:为字段名重复的列取别名,具体操作如下:

	<resultMap id="UserFullInfoMap" type="com.xxs.shirodemo.entity.UserInfo">
        <id column="u_id" jdbcType="BIGINT" property="id"/>                                   //u_id
        <result column="user_name" jdbcType="VARCHAR"  property="userName"/>
        <result column="password" jdbcType="VARCHAR" property="password"/>
        <result column="salt" jdbcType="VARCHAR" property="salt"/>

        <collection property="roleInfos" ofType="com.xxs.shirodemo.entity.RoleInfo">
            <id column="r_id" jdbcType="BIGINT" property="id"/>                               //r_id
            <result column="role_name" jdbcType="VARCHAR" property="roleName"/>
            <collection property="permissionInfos" ofType="com.xxs.shirodemo.entity.PermissionInfo">
                <id column="p_id" jdbcType="BIGINT" property="id"/>                            //p_id
                <result column="permission_name" jdbcType="VARCHAR" property="permissionName"/>
            </collection>
        </collection>
    </resultMap>

    <select id="getUserInfoByUserName" resultType="com.xxs.shirodemo.entity.UserInfo">
        select ui.id u_id,ui.user_name,ui.password,ui.salt,ri.id r_id,ri.role_name,pi.id p_id,pi.permission_name
        from (SELECT * from user_info where user_name=#{value}) ui
        left join user_role ur on ui.id=ur.user_id
        left join role_info ri on ri.id=ur.role_id
        left join role_permission rp on rp.role_id=ur.role_id
        left join permission_info pi on rp.permission_id=pi.id
    </select>
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MyBatis一对多映射可以通过使用嵌套查询或嵌套结果映射来实现。下面是两种方法的详细说明: 1. 嵌套查询 在一对多关系,通常是一方有多个子项,我们可以使用嵌套查询来实现这种映射。例如,我们有两个表:`order`和`order_item`,`order`表有一个`id`字段,`order_item`表有一个`order_id`字段,用于将订单与订单项关联起来。 我们可以使用以下Mapper XML来查询一个订单及其所有订单项: ```xml <select id="getOrderWithItems" resultMap="orderMap"> SELECT * FROM order WHERE id = #{id} </select> <resultMap id="orderMap" type="Order"> <id column="id" property="id"/> <result column="order_no" property="orderNo"/> <result column="create_time" property="createTime"/> <collection property="orderItems" ofType="OrderItem"> <select id="getOrderItemsByOrderId" parameterType="int" resultMap="itemMap"> SELECT * FROM order_item WHERE order_id = #{id} </select> </collection> </resultMap> <resultMap id="itemMap" type="OrderItem"> <id column="id" property="id"/> <result column="product_id" property="productId"/> <result column="product_name" property="productName"/> <result column="price" property="price"/> <result column="quantity" property="quantity"/> </resultMap> ``` 在上面的代码,`getOrderWithItems`方法将返回一个包含订单及其所有订单项的完整对象图。在`resultMap`元素,我们定义了一个`collection`元素,并将其`property`属性设置为`orderItems`,这是`Order`类的一个`List<OrderItem>`属性。`ofType`属性指定了集合存储的对象类型,这里是`OrderItem`。`select`元素的SQL语句将查询该订单的所有订单项,并将它们映射到`OrderItem`对象。这个查询将在MyBatis执行`getOrderWithItems`方法自动执行。 2. 嵌套结果映射 除了嵌套查询之外,我们还可以使用嵌套结果映射来实现一对多映射。 ```xml <select id="getOrderWithItems" resultMap="orderMap"> SELECT * FROM order WHERE id = #{id} </select> <resultMap id="orderMap" type="Order"> <id column="id" property="id"/> <result column="order_no" property="orderNo"/> <result column="create_time" property="createTime"/> <collection property="orderItems" ofType="OrderItem" resultMap="itemMap"/> </resultMap> <resultMap id="itemMap" type="OrderItem"> <id column="id" property="id"/> <result column="product_id" property="productId"/> <result column="product_name" property="productName"/> <result column="price" property="price"/> <result column="quantity" property="quantity"/> <result column="order_id" property="orderId"/> </resultMap> ``` 在上面的代码,我们在`resultMap`元素定义了一个`collection`元素,它将订单的所有订单项映射到`Order`对象的`orderItems`属性。与嵌套查询不同的是,我们使用了一个名为`itemMap`的嵌套结果映射映射每个订单项。这个映射定义了`OrderItem`类的所有属性,并将`order_id`列映射到`orderId`属性上。 在使用嵌套结果映射MyBatis会将每个嵌套结果映射作为单独的查询执行。这意味着如果我们查询10个订单,就会执行11个查询(一个查询用于获取订单,另外10个查询用于获取每个订单的订单项)。因此,在使用嵌套结果映射需要注意性能问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值