Mybatis 注解接口一对一快捷关联查询简单例子@Results@Result@One

这是一对一,即一夫一妻式的数据关联关系的查询

1,准备实体类C1和C2,数据库D1和D2,准备好Mybatis配置文件等相关条件

2,写注解接口

@Results用于包含多个@Result,

@Result用于指定类-表属性字段对应,

其中column = "xx"表示将C2中的xx字段内容用作调用@One中selectC2ByX的参数

property = "C1"表示@One返回的类型是C1

@One用于调用第二个查询语句

package com.xxx.dao;

import com.xxx.xxx.C2;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
public interface xxx {

    public interface C2Mapper {
        @Select("select * from D2 where x=#{x}")
        @Results({@Result(column = "xx",property = "C1",
                one = @One(select = "com.xxx.dao.C2Mapper.selectC2ByX"))})
        C2 selectC2ByX(int x);
    }

}

第二个查询语句

package com.xxx.dao;

import com.xxx.xxx.C1;
import org.apache.ibatis.annotations.Select;

public interface C1Mapper {
    @Select("select * from D1 where x=#{x}")
    C1 selectC2ByX(int x);
}

3,写Mybtis配置文件

        <mapper class="com.xxx.dao.C1Mapper"/>
        <mapper class="com.xxx.dao.C2Mapper"/>

4,调用

    @Test
    public void selectC2ByXTest(){
        String resources = "mybatis-config.xml";
        Reader reader=null;
        try{
            reader= Resources.getResourceAsReader(resources);
        } catch (IOException e){
            e.printStackTrace();
        }
        SqlSessionFactory sqlMapper=new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = sqlMapper.openSession();
        
        C2aMapper mapper = session.getMapper(C2Mapper.class);
        C2 c2 = C2.selectC2ByX(x);
        System.out.println(c2.toString());
        session.close();
    }

5,实际调用结果的形式

C2{  x ,  C2{}} 

即C2中包含C1

 C1{x=x, xx='xx', c2=C2{x=x, xx='xxxx'}}

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 中,使用注解实现一对一查询可以通过 @One 注解来实现。 假设有两个实体类,分别为 User 和 Order,一个 User 可以拥有多个 Order,但一个 Order 只能属于一个 User,它们之间的关系是一对多的关系。 首先,在 User 实体类中添加一个 List<Order> 属性,表示一个 User 拥有多个 Order: ```java public class User { private Integer id; private String name; private List<Order> orders; // getter 和 setter 方法 } ``` 然后,在 Order 实体类中添加一个 User 属性,表示一个 Order 属于一个 User: ```java public class Order { private Integer id; private String name; private Double amount; private User user; // getter 和 setter 方法 } ``` 在 Mapper 接口中,定义一个方法来查询 User 和它的所有 Order: ```java public interface UserMapper { @Select("SELECT * FROM user WHERE id = #{id}") @Results({ @Result(property = "id", column = "id"), @Result(property = "name", column = "name"), @Result(property = "orders", column = "id", javaType = List.class, many = @Many(select = "com.example.mapper.OrderMapper.findByUserId")) }) User findById(@Param("id") Integer id); } ``` 在上面的代码中,@Results 注解用于定义查询结果的映射关系。@Result 注解用于定义一个属性和查询结果中的一个列之间的映射关系。其中,javaType 属性表示该属性的类型;many 属性表示该属性是一个集合类型;select 属性表示查询 Order 的方法。 在 OrderMapper 接口中,定义一个方法来查询某个 User 的所有 Order: ```java public interface OrderMapper { @Select("SELECT * FROM `order` WHERE user_id = #{userId}") List<Order> findByUserId(@Param("userId") Integer userId); } ``` 最后,使用 UserMapper 中的 findById 方法来查询 User 和它的所有 Order: ```java User user = userMapper.findById(1); System.out.println(user.getName()); for (Order order : user.getOrders()) { System.out.println(order.getName()); } ``` 以上就是使用注解实现一对一查询的方法。需要注意的是,在使用 @One 注解时,需要指定查询的方法,并且查询的方法需要返回一个对象,而不能返回一个集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值