mytabits表关联一对一(多对一?)
mytabits表关联一对一(多对一?)
association联合
联合元素用来处理“一对一”的关系。需要指定映射的Java实体类的属性,属性的javaType(通常MyBatis 自己会识别)。对应的数据库表的列名称。如果想覆写的话返回结果的值,需要指定typeHandler。
不同情况需要告诉MyBatis 如何加载一个联合。MyBatis 可以用两种方式加载:
- select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活;
- resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。
例如,一个班级对应一个班主任。
首先定义好班级中的班主任 private TeacherEntity teacherEntity;
在上章的 一对多 中,我们已经学习如何在 Mybatis 中关联多表,但在实际项目中也是经常使用 多对一 的情况,这些查询是如何处理的呢,在这一节中我们来学习它。多表映射的多对一关系要用到 mybitis 的 association 来加以实现。这篇介绍的是多表中的多对一表关联查询。
应用场景:首先根据帖子 ID 读取一个帖子信息,然后再读取这个帖子所属的用户信息。
1、先做一些准备工作
我们首先在创建一个 java 工程,工程名称为:mybatis4,还需要创建两张表,它们分别是用户表 user,和帖子表 post,一个户用户可以有多个帖子。-- ---------------------------- -- Table structure for `user` -- ---------------------------- CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(64) NOT NULL DEFAULT '', `mobile` int(10) unsigned NOT NULL DEFAULT '0', `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES ('1', 'bb', '100', '2015-09-23 20:11:23');
帖子表 post 的结构和数据:
-- ---------------------------- -- Table structure for `post` -- ---------------------------- CREATE TABLE `post` ( `post_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `userid` int(10) unsigned NOT NULL, `title` varchar(254) NOT NULL DEFAULT '', `content` text, `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`post_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of post -- ---------------------------- INSERT INTO `post` VALUES ('1', '1', 'MyBatis关联数据查询', '在实际项目中,经常使用关联表的查询,比如:多对一,一对多等。这些查询是如何处理的呢,这一讲就讲这个问题。我们首先创建一个 post 表,并初始化数据.', '2015-09-23 21:40:17'); INSERT INTO `post` VALUES ('2', '1', 'MyBatis开发环境搭建', '为了方便学习,这里直接建立java 工程,但一般都是开发 Web 项目。', '2015-09-23 21:42:14'); INSERT INTO `post` VALUES ('3', '2', '这个是别人发的', 'content,内容...', '0000-00-00 00:00:00');
从上面应该看出,这几个帖子对应的 userid 都是1,所以需要用户表 user 里面有 id=1 的数据。可以修改成满足自己条件的数据,按照 orm 的规则,表肯定需要一个对象与之对应,所以我们增加一个 Post 类。
2、创建表对应的 JavaBean 对象
这个例子中,我们需要在包 mybatis4.pojo 下创建两个类,它们分别是: User.java 和 Post.java,我们一个一个地来看它们的代码,User.java 类的代码如下:
package mybatis4.pojo; import java.util.List; public class User { private int id; private String name; private String mobile; private List<Post> posts; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public List<Post> getPosts() { return posts; } public void setPosts(List<Post> posts) { this.posts = posts; } @Override public String toString() { return "User [id=" + id + ", name=" + name + "]"; } }
post
package mybatis4.pojo; public class Post { private int id; private User user; private String title; private String content; public int getId() { return id; } public void setId(int id) { this.id = id; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
3、配置文件
在这一章节中,要用到的配置文件有两个,一个是 mybatis 的主配置文件:src/conf.xml 和 User.java对应的配置文件 UserMapper.xml,我们先来看看 src/conf.xml,其详细配置信息如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 引入数据库model --> <typeAliases> <typeAlias type="mybatis4.pojo.User" alias="User" /> <typeAlias type="mybatis4.pojo.Post" alias="Post" /> </typeAliases> <!-- 数据库配置 --> <environments default="development"> <environment id="development"> <!-- 事务管理 --> <transactionManager type="JDBC"/> <!-- 数据库 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/yiibai"/> <property name="username" value="root"/> <property name="password" value=""/> </dataSource> </environment> </environments> <!-- 引入mysql表xml --> <mappers> <mapper resource="mybatis4/mapper/userMapper.xml"/> </mappers> </configuration>
这里需要注意的是 <typeAliases> 这个标签内容,它就是用于定义一个 JavaBean 类的别名,如将 mybatis4.pojo.User 简写为 User,可以认为 mybatis4.pojo.User 就是 User,User 就是 mybatis4.pojo.User 。
另外一个配置文件 userMapper.xml 的内容如下:
请注意:<association property="user" javaType="User">下的
<id property="id" column="id"/> property="id",id为User.java中的id,
<result property="name" column="username" /> property="name"中的name为User.java中的name
<?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="mybatis4.mapper.userMapper"> <!-- 多个文章对应一个用户 --> <resultMap type="post" id="resultPostMap"> <result property="id" column="post_id" /> <result property="title" column="title" /> <result property="content" column="content" /> <association property="user" javaType="User"> <id property="id" column="id"/> <result property="name" column="username" /> <result property="mobile" column="mobile" /> </association> </resultMap> <!-- 查询语句 --> <select id="getPost" resultMap="resultPostMap" parameterType="int"> select u.*,p.* from user u, post p where u.id=p.userid and p.post_id=#{post_id} </select> </mapper>