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,一个户用户可以有多个帖子。

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‘, ‘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>

  

原文地址:https://www.cnblogs.com/achengmu/p/9240966.html

时间: 2024-11-13 07:52:52

mytabits表关联一对一(多对一?)的相关文章

表与表关联 一对一

1...表与表之间的关系 一对一: A   B  两张表  A表中的每条的记录对应的B的一条记录 :一对一关系实现方式:          1:使用外键关联  :  场景:使用客户表和客户拓展表  :在属性上 添加一个@OneToOne代表一个对一个的关系    在属性上添加@JoinColumn? name 存储外键的字段     referencedColumnNm 对方表的字段名称 (可以省略)          2:使用主键关联,两个表  A  B 的主键相同. : 使用@Primary

mysql初识(六) 多表关联

/**mysql 多表关联 */ 一对一的关联 比如城市和区号的关联******************* 先是一个city表cid city coid1 北京 12 上海 23 广州 3 再一个区号表 coid code 1 0102 0203 0755 这样通过 cid和coid的关联将两张表连在一起一对一的类型 他的关联字段可以随便放在两个表中mysql> select * from city,code where city.coid=code.coid;+-----+------+---

MySQL 表的一对一、一对多、多对多问题

将实体与实体的关系,反应到最终数据库表的设计上,将关系分为三种:一对一,一对多(多对一)和多对多,所有的关系都是表与表之间的关系; 一对一 一对一:一张表的一条记录只能与另外一条记录进行对应,反之亦然学生表:姓名,性别,年龄,体重,身高,婚姻状况,籍贯,家庭地址,紧急联系人 Id(P) 姓名 性别 年龄 身高 婚姻状况 籍贯 家庭地址 紧急联系人 体重 表设计成以上这种形式:符合要求,其中姓名,性别,年龄,身高体重属于常用数据,但是婚姻籍贯住址联系人属于不常用的数据,如果每次查询所有数据,不常用

Hibernate 多表关联

hibernate中可以一次对多个表进行数据插入,这种插入类似 Hibernate的关联映射关系有:多对一 ---- many-to-one一对多 ---- one-to-many一对一 ---- one-to-one多对多 ---- many-to-many 比较常用的是多对一和一对一关联映射多对一关联映射: 场景:用户和组:从用户角度来看,多个用户属于一个组(多对一关联)使用Hibernate开发的思路:先建立对象模型,把实体抽取出来.目前两个实体:用户和组两个实体,多个学生拥有同一个地址,

【Hibernate步步为营】--单向关联一对一映射(一)

上篇文章对多对一的关联映射做了详细的分析,它在实现上可以有两种方式,并且这两种方式实现也很简单,关键是标签<many-to-one>的使用,它分别指明了多端和一端的映射关系,这种映射关系既是对象模型中的聚合关系.接下来继续讨论关联映射. 一.唯一外键 唯一外键说的是数据库表中的每一行的外键唯一对应着另一张表中的主键,也就是说一个表的主键作为另一张表的外键,并且它们之间的关系是唯一的,这种反应到关系模型中如下图所示: 上图的两个实体表,分别为人和身份证,很明显的一个人对应着一个身份证.身份证作为

oracle02--多表关联查询

1. 多表(关联)查询 多表查询也称之为关联查询.多表关联查询等,主要是指通过多个表的关联来获取数据的一种方式. 1.1. 多表映射关系 一对多:A表的一行数据,对应B表中的多条.如:一个部门可以对应多个员工. 多对一:B表中的多条对应A表的一行数据.如:多个员工对应一个部门. 多对多:学生和选修课表----学生和课程对应表. 一对一:人员基本信息和人员信息扩展表. 1.2. 笛卡尔集 笛卡尔集对于我们数据库的数据查询结果的影响: 1. 数据冗余.---笛卡尔集并不是我们所需要的数据. 2. 效

Android数据库高手秘籍(四)——使用LitePal建立表关联

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/39207945 目前我们已经对LitePal的用法有了一定了解,学会了使用LitePal来创建表和升级表的方式,那么今天就让我们一起继续进阶,探究一下如何使用LitePal来建立表与表之间的关联关系.还没有看过前一篇文章的朋友建议先去参考 Android数据库高手秘籍(三)--使用LitePal升级表 . LitePal的项目地址是:https://github.com/LiteP

EF里单个实体的增查改删以及主从表关联数据的各种增删 改查

本文目录 EF对单个实体的增查改删 增加单个实体 查询单个实体 修改单个实体 删除单个实体 EF里主从表关联数据的各种增删改查 增加(增加从表数据.增加主从表数据) 查询(根据主表找从表数据.根据从表找主表数据) 修改(修改从表的外键) 删除(删除主从表关系.删除主表数据.删除主从表数据.修改从表数据外键) 补充内容 SaveChanges方法提交多次操作 DbSet.Add方法返回当前实体 源码和系列文章导航 注:本章节多次演示了各种删除,要重复查看效果,需要解开注释初始化数据方法. 一.EF

yii多表关联

1,首先多表关联是在models/xx.php的relations里配置的.而且是互配,但有区别.格式:'VarName'=>array('RelationType', 'ClassName', 'ForeignKey', ...additional options) 需要弄清楚的几点:1,VarName指什么?  详见下面例2.2,RelationType.一共有4种,分别为self::HAS_MANY, self::BELONGS_TO, self::MANY_MANY, self::HAS