MyBatis框架学习(四)——关联查询

接上述所讲,若有一个表名为books,里面存有的数据包括 numnameauthor 三个属性,分别为输的编号、书名、书的作者,再创建一个 charaters 的表,里面存有的数据列为 book_idperson_namegender 三个属性,分别是书的编号,书中角色名,书中角色性别。

设上述需要进行的为连接查询,在查询指定book的ID中存在的角色。

1. 数据准备

  • 定义书中角色的属性如下
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Character {
    private int id;
    private String c_name;
    private String c_gender;
}
  • 定义修改书的属性如下
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Book {
    private int num;
    private String book_name;
    private String author;
    private Character character;
}

可以看到,增加了一个书中角色的类。

2. 连接查询

连接查询即仿照数据库中的 select num,name,author,book_id,person_name,gender from novels.books b inner join novels.charaters c on b.num=c.book_id where b.num=5 这种连接语句进行查询,该语句中唯一需要交互的就是连接的条件。

2.1 重新定义映射

类不一样了,类的映射 resultMap 自然也就不同了,其相关的定义如下

<resultMap id="BookOne2OneMap" type="com.mr.things.Book">
    <id column="num" property="num"/>
    <result column="name" property="book_name"/>
    <result column="author" property="author"/>
    <result column="book_id" property="character.id"/>
    <result column="person_name" property="character.c_name"/>
    <result column="gender" property="character.c_gender"/>
</resultMap>
<select id="selectOne2One" resultMap="BookOne2OneMap">
    select num,name,author,book_id,person_name,gender from
    novels.books b
    inner join novels.charaters c
    on b.num=c.book_id
    where b.num=#{book_num}
</select>

在这里,查询语句我不写 * 是为了让大家看的更清楚一点,因为 book_id,person_name,gender 三个属性在数据库的 books 表中并没有定义,所以这里映射的时候必须将其映射到 Book 类中的 character 属性中的相关属性中去。

2.2 定义查询接口

BookDAO 中定义查询接口

public interface BookDAO {
    public List<Book> selectOne2One(int book_num);
}

2.3 测试

@Test
public void selectOne2One() {
    BookDAO bookDAO = MyBatisUtil.getMapper(BookDAO.class);
    List<Book> books = bookDAO.selectOne2One(5);
    System.out.println(books);
}

最后能够显示出所有的相关属性。

3. 子查询

子查询,就是通过多次查询得到结果。比如这里我们通过查询bookID得到书的相关信息以及书中的角色信息,我们可以先在 books 表中进行查询,然后再到 charaters 表中进行查询,多次查勋组合得到结果。

3.1 定义 charater 表的查询

首先定义查询接口如下:

public List<Character> selectCharacter(int book_num);

charater 接口的实现如下

<resultMap id="CharacterMap" type="com.mr.things.Character">
    <id column="book_id" property="id"/>
    <result column="person_name" property="c_name"/>
    <result column="gender" property="c_gender"/>
</resultMap>

<select id="selectCharacter" resultMap="CharacterMap">
    select * from novels.charaters where book_id=#{num}
</select>

3.2 重新定义 Book

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Book {
    private int num;
    private String book_name;
    private String author;
    private List<Character> characters;
}

3.3 重新定义映射

我们已经能够给出一个 ID,在 charater 表中进行对应ID的角色信息查询,接下来只需要将其套进Book信息的查询中去就行。
下面的 association 属性的意思是将 column 中的属性也就是 num 传入 com.mr.DAO.BookDAO.selectCharacter 这个方法中去( 该方法就是对 charaters 这个表的查询),然后将返回值注入 Book 类中的 characters 属性中。

<resultMap id="BookSonMap" type="com.mr.things.Book">
    <id column="num" property="num"/>
    <result column="name" property="book_name"/>
    <result column="author" property="author"/>
    <association property="characters" select="com.mr.DAO.BookDAO.selectCharacter" column="num"></association>
</resultMap>
<select id="selectSon" resultMap="BookSonMap">
    select * from novels.books where num=#{num}
</select>

3.4 测试

@Test
public void selectSon() {
    BookDAO bookDAO = MyBatisUtil.getMapper(BookDAO.class);
    Book book = bookDAO.selectSon(5);
    System.out.println(book);
}

能够查询到对应的信息,测试通过。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值