文章目录
接上述所讲,若有一个表名为books
,里面存有的数据包括 num
,name
,author
三个属性,分别为输的编号、书名、书的作者,再创建一个 charaters
的表,里面存有的数据列为 book_id
、person_name
、gender
三个属性,分别是书的编号,书中角色名,书中角色性别。
设上述需要进行的为连接查询,在查询指定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);
}
能够查询到对应的信息,测试通过。