Mybatis表关联一对多
有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如:最常见到的多对一,一对多等。这些查询是如何处理的呢,这一讲就讲这个问题。前面几篇教程中介绍的都是单表映射的一些操作,然而在我们的实际项目中往往是用到多表映射。在Java实体对象对中,一对多可以根据List和Set来实现,两者在mybitis中都是通过collection标签来配合来加以实现。这篇介绍的是多表中的多对一表关联查询。
应用场景:首先根据用户 ID 读取一个用户信息,然后再读取这个用户所发布贴子(post)。
1、先做一些准备工作
我们首先在创建一个 java 工程,工程名称为:mybatis04-one2many(下载),还需要创建两张表,它们分别是用户表 user,和帖子表 post,一个户用户可以有多个帖子。
user表的结构和数据:
- -- ----------------------------
- -- 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', 'yiibai', '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 对象
这个例子中,我们需要在包 com.yiibai.pojo 下创建两个类,它们分别是: User.java 和 Post.java,我们一个一个地来看它们的代码,User.java 类的代码如下:
- package com.yiibai.pojo;
- import java.io.Serializable;
- import java.util.Date;
- import java.util.List;
- public class User implements Serializable{
- private int id;
- private String username;
- private String mobile;
- private List<Post> posts;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- 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=" + username + "]";
- }
- }
Post.java 类的代码如下:
- package com.yiibai.pojo;
- import java.io.Serializable;
- public class Post implements Serializable{
- 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/config/Configure.xml 和 User.java对应的配置文件 User.xml,我们先来看看 src/config/Configure.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>
- <typeAliases>
- <typeAlias alias="User" type="com.yiibai.pojo.User" />
- <typeAlias alias="Post" type="com.yiibai.pojo.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://127.0.0.1:3306/yiibai" />
- <property name="username" value="root" />
- <property name="password" value="" />
- </dataSource>
- </environment>
- </environments>
- <mappers>
- <!-- // power by http://www.yiibai.com -->
- <mapper resource="com/yiibai/pojo/User.xml" />
- </mappers>
- </configuration>
这里需要注意的是 <typeAliases> 这个标签内容,它就是用于定义一个 JavaBean 类的别名,如将 com.yiibai.pojo.User 简写为 User,可以认为 com.yiibai.pojo.User 就是 User,User 就是 com.yiibai.pojo.User 。
另外一个配置文件 User.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.yiibai.userMaper">
- <!-- User 级联文章查询 方法配置 (一个用户对多个文章) -->
- <resultMap type="User" id="resultUserMap">
- <result property="id" column="user_id" />
- <result property="username" column="username" />
- <result property="mobile" column="mobile" />
- <collection property="posts" ofType="com.yiibai.pojo.Post" column="userid">
- <id property="id" column="post_id" javaType="int" jdbcType="INTEGER"/>
- <result property="title" column="title" javaType="string" jdbcType="VARCHAR"/>
- <result property="content" column="content" javaType="string" jdbcType="VARCHAR"/>
- </collection>
- </resultMap>
- <select id="getUser" resultMap="resultUserMap" parameterType="int">
- SELECT u.*,p.*
- FROM user u, post p
- WHERE u.id=p.userid AND id=#{user_id}
- </select>
- </mapper>
4、测试程序运行
到这里,整个工作准备得已经差不多了,我们创建一个主类来测试上面程序,在 src 下创建一个 Main.java,代码如下:
- import java.io.Reader;
- import java.text.MessageFormat;
- import java.util.List;
- import org.apache.ibatis.io.Resources;
- import org.apache.ibatis.session.SqlSession;
- import org.apache.ibatis.session.SqlSessionFactory;
- import org.apache.ibatis.session.SqlSessionFactoryBuilder;
- import com.yiibai.pojo.Post;
- import com.yiibai.pojo.User;
- public class Main {
- private static SqlSessionFactory sqlSessionFactory;
- private static Reader reader;
- static {
- try {
- reader = Resources.getResourceAsReader("config/Configure.xml");
- sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static SqlSessionFactory getSession() {
- return sqlSessionFactory;
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- SqlSession session = sqlSessionFactory.openSession();
- try {
- int userid = 1;
- User user = session.selectOne("com.yiibai.userMaper.getUser", 1);
- System.out.println("username: "+user.getUsername()+",");
- List<Post> posts = user.getPosts();
- for(Post p : posts) {
- System.out.println("Title:" + p.getTitle());
- System.out.println("Content:" + p.getContent());
- }
- } finally {
- session.close();
- }
- }
- }
输出结果如下:
- username: yiibai,
- Title:MyBatis关联数据查询
- Content:在实际项目中,经常使用关联表的查询,比如:多对一,一对多等。这些查询是如何处理的呢,这一讲就讲这个问题。我们首先创建一个 post 表,并初始化数据.
- Title:MyBatis开发环境搭建
- Content:为了方便学习,这里直接建立java 工程,但一般都是开发 Web 项目。
附工程目录结构图如下:
Mybatis表关联一对多的更多相关文章
- Mybatis表关联一对多、多对一、多对多
项目工程结构如下: 1. 搭建MyBatis框架环境 首先需要引入两个包:mybatis.jar 和 sqljdbc42.jar包 若分页需要导入两个包:pagehelper-5.1.0.jar 和 ...
- 后盾网lavarel视频项目---lavarel多表关联一对多操作实例
后盾网lavarel视频项目---lavarel多表关联一对多操作实例 一.总结 一句话总结: 1.一对多中多那个部分的数据前端通过json弄到服务器 2.所有通过一操作多的时候,都要用上模型中定义的 ...
- Mybatis表关联多对一
在上章的 一对多 中,我们已经学习如何在 Mybatis 中关联多表,但在实际项目中也是经常使用 多对一 的情况,这些查询是如何处理的呢,在这一节中我们来学习它.多表映射的多对一关系要用到 mybit ...
- mybatis表关联彻底理解
1.多张表关联 三张表,用户表,主播表,关注表. 查询用户已经关注的主播的信息,那就要三张表关联起来啊.分别left join联在一起,通过id相同的连接在一起.最后where查找出最终条件. < ...
- 20.Yii2.0框架多表关联一对多查询之hasMany
目录 新手模式 hasMany关联模式查询 新建mode层Article.php 新建mode层Category.php 新建控制器HomeController.php 新手模式 用上次的查询结果,作 ...
- Mybatis表关联多对多
创建表 创建表对应的 JavaBean 对象 package com.tanlei.newer.model; import java.util.List; /** * @author:Mr.Tan * ...
- 21.Yii2.0框架多表关联一对多查询之性能优化--模型的使用
控制器里 功能: 通过分类,查分类下的所有文章 //关联查询 public function actionRelatesearch(){ //关联查询 //查询方法一(查一行) 一维数组下的值是obj ...
- MyBatis实现关联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- MyBatis——实现关联表查询
原文:http://www.cnblogs.com/xdp-gacl/p/4264440.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创 ...
随机推荐
- npm WARN build `npm build` called with no arguments. Did you mean to `npm run-script build`?
跑npm build结果如下: npm WARN build `npm build` called with no arguments. Did you mean to `npm run-script ...
- iOS开发之二维码扫描
二维码扫描 01-导入系统库 02 新建继承自UIView的 LHQPreView 2.1导入系统库头文件 #import <AVFoundation/AVFoundation.h> 2. ...
- 【Java】Java复习笔记-第三部分
修饰符abstract 抽象的,定义框架不去实现,可以修饰类和方法 abstract修饰类: 会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型 抽象类 ...
- 对dump的文件进行状态统计
1.jps -lvm 查出pid 2.jstack pid >1.dump 3.grep java.lang.Thread.State 1.dump| awk '{print $2$3$4$ ...
- JAVA-JSP内置对象之request对象参数
相关资料:<21天学通Java Web开发> request对象1.request对象不但可以用来设置和取得requset范围变量,还可以用来获得客户端请求参数请求的来源.表头.cooki ...
- 对象序列化为何要定义serialVersionUID的来龙去脉
在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对象,当有10万用户并发访问,就有可能出现10万个Session对象 ...
- json数据在前端(javascript)和后端(php)转换
学习目的:前后端数据交换 思路: json数据格式是怎么样? 后端各种语言怎么将自己内容转换成json格式的内容? 前端怎么接收json数据?有几种方式? js中怎么将json数据转换成js中的数 ...
- Thrift——栗子
这张经典的图:黄色部分是用户实现的业务逻辑,褐色部分是根据Thrift定义的服务接口描述文件(IDL,接口定义语言)生成的客户端和服务端代码框架,红色部分是根据Thrift文件生成代码实现数据的读写操 ...
- 【Visual Studio】项目的引用显示黄色叹号
情况一:个别引用的DLL显示黄色叹号. 通常是因为该DLL需要的.Net Framework版本与当前项目使用的版本不兼容.如该DLL需要的版本高于当前项目使用的版本.考虑修改项目的.Net Fram ...
- 【Unity Shader】三、漫反射Diffuse Shader例子
学习目标: 漫反射Diffuse Shader,逐顶点计算和逐像素计算. 半兰伯特(HalfLambert)光照模型. 结合材质自身的色彩(Material Color)及环境光(Ambient). ...