zoukankan      html  css  js  c++  java
  • 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,一个户用户可以有多个帖子。
     
    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>
    

      

     
     
  • 相关阅读:
    vue-music 关于搜索历史本地存储
    Node.js中package.json中^和~的区别
    主流浏览器内核
    pm2 日常使用
    前端验证用户登陆状态(vue.js)
    ng-repeat循环出来的部分调用同一个函数并且实现每个模块之间不能相互干扰
    行内元素垂直方向位置调整的一些感悟和困惑
    由overflow-x:scroll产生的收获
    子代选择器(>)后代选择器(' ')的区别
    content相关属性
  • 原文地址:https://www.cnblogs.com/achengmu/p/9240966.html
Copyright © 2011-2022 走看看