一对一查询
在实际开发中,经常会遇到一对一查询,一对多查询等。这里我们先来看一对一查询。例如:每本书都有一个作者,作者都有自己的属性,根据这个,我来定义两个实体类:
public class Book { private Integer id; private String name; private Author author; // 省略 getter/setter }
public class Author { private Integer id; private String name; private Integer age; // 省略 getter/setter }
然后,在数据库中,添加两张表:
CREATE DATABASE /*!32312 IF NOT EXISTS*/`test01` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */; USE `test01`; /*Table structure for table `author` */ DROP TABLE IF EXISTS `author`; CREATE TABLE `author` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*Data for the table `author` */ /*Table structure for table `book` */ DROP TABLE IF EXISTS `book`; CREATE TABLE `book` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, `aid` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
添加成功后,我们新建一个 BookMapper,BookMapper 中定义了一个查询 Book 的方法,但是我希望查出来 Book 的同时,也能查出来它的 Author:
public interface BookMapper { Book getBookById(Integer id); }
再定义一个 BookMapper.xml ,内容如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.antonio.hello.mybatis.mapper.BookMapper"> <resultMap id="BookWithAuthor" type="com.antonio.hello.mybatis.entity.Book"> <id column="id" property="id"/> <result column="name" property="name"/> <association property="author" javaType="com.antonio.hello.mybatis.entity.Author"> <id column="aid" property="id"/> <result column="aname" property="name"/> <result column="aage" property="age"/> </association> </resultMap> <select id="getBookById" resultMap="BookWithAuthor"> SELECT b.*,a.`age` AS aage,a.`id` AS aid,a.`name` AS aname FROM book b,author a WHERE b.`aid`=a.`id` AND b.`id`=#{id} </select> </mapper>
在这个查询 SQL 中,首先应该做好一对一查询,然后,返回值一定要定义成 resultMap,注意,这里千万不能写错。然后,在 resultMap 中,来定义查询结果的映射关系。其中,association 节点用来描述一对一的关系。这个节点中的内容,和 resultMap 一样,也是 id,result 等,在这个节点中,我们还可以继续描述一对一。
由于在实际项目中,每次返回的数据类型可能都会有差异,这就需要定义多个 resultMap,而这多个 resultMap 中,又有一部份属性是相同的,所以,我们可以将相同的部分抽出来,做成一个公共的模板,然后被其他 resultMap 继承,优化之后的 mapper 如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.antonio.hello.mybatis.mapper.BookMapper"> <resultMap id="BaseResultMap" type="com.antonio.hello.mybatis.entity.Book"> <id column="id" property="id"/> <result column="name" property="name"/> </resultMap> <resultMap id="BookWithAuthor" type="com.antonio.hello.mybatis.entity.Book" extends="BaseResultMap"> <association property="author" javaType="ocom.antonio.hello.mybatis.entity.Author"> <id column="aid" property="id"/> <result column="aname" property="name"/> <result column="aage" p<p>本文来源gao!%daima.com搞$代*!码9网(</p>roperty="age"/> </association> </resultMap> <select id="getBookById" resultMap="BookWithAuthor"> SELECT b.*,a.`age` AS aage,a.`id` AS aid,a.`name` AS aname FROM book b,author a WHERE b.`aid`=a.`id` AND b.`id`=#{id} </select> </mapper>