myBatis系列之四:关联数据的查询

myBatis系列之三:增删改查是基于单表的查询,如果联表查询,返回的是复合对象,需要用association关键字来处理。 
如User发表Article,每个用户可以发表多个Article,他们之间是一对多的关系。

1. 创建Article表,并插入测试数据:

-- Drop the table if exists
DROP TABLE IF EXISTS `Article`;  

-- Create a table named ‘Article‘
CREATE TABLE `Article` (
    `id` int NOT NULL AUTO_INCREMENT,
    `user_id` int NOT NULL,
    `title` varchar(100) NOT NULL,
    `content` text NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;  

-- Add several test records
INSERT INTO `article`
VALUES
(‘1‘, ‘1‘, ‘title1‘, ‘content1‘),
(‘2‘, ‘1‘, ‘title2‘, ‘content2‘),
(‘3‘, ‘1‘, ‘title3‘, ‘content3‘),
(‘4‘, ‘1‘, ‘title4‘, ‘content4‘);

2. com.john.hbatis.model.Article类:

public class Article {
    private int id;
    private User user;
    private String title;
    private String content;
    // Getters and setters are omitted
}  

3. 在IUserMapper中添加:

List<Article> getArticlesByUserId(int id); 

4. 在User.xml中添加:

<resultMap type="com.john.hbatis.model.Article" id="articleList">
    <id column="a_id" property="id" />
    <result column="title" property="title" />
    <result column="content" property="content" />  

    <association property="user" javaType="User"><!-- user属性映射到User类 -->
        <id column="id" property="id" />
        <result column="name" property="name" />
        <result column="address" property="address" />
    </association>
</resultMap>  

<select id="getArticlesByUserId" parameterType="int" resultMap="articleList">
    select u.id, u.name, u.age, u.address, a.id a_id, a.title, a.content
    from article a
    inner join user u
    on a.user_id=u.id and u.id=#{id}
</select>

5. 测试方法:

@Test
public void getArticlesByUserIdTest() {
    SqlSession session = sqlSessionFactory.openSession();
    try {
        IUserMapper mapper = session.getMapper(IUserMapper.class);
        List<Article> articles = mapper.getArticlesByUserId(1);
        for (Article article : articles) {
            log.info("{} - {}, author: {}", article.getTitle(), article.getContent(), article.getUser().getName());
        }
    } finally {
        session.close();
    }
}  

附:除了在association标签内定义字段和属性的映射外,还可以重用User的resultMap:

<association property="user" javaType="User" resultMap="userList" />
  1. <resultMap type="com.john.hbatis.model.Article" id="articleList">
  2. <id column="a_id" property="id" />
  3. <result column="title" property="title" />
  4. <result column="content" property="content" />
  5. <association property="user" javaType="User"><!-- user属性映射到User类 -->
  6. <id column="id" property="id" />
  7. <result column="name" property="name" />
  8. <result column="address" property="address" />
  9. </association>
  10. </resultMap>
  11. <select id="getArticlesByUserId" parameterType="int" resultMap="articleList">
  12. select u.id, u.name, u.age, u.address, a.id a_id, a.title, a.content
  13. from article a
  14. inner join user u
  15. on a.user_id=u.id and u.id=#{id}
  16. </select>
时间: 2024-12-15 01:53:36

myBatis系列之四:关联数据的查询的相关文章

mybatis实战教程(mybatis in action)之四:实现关联数据的查询

有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.我们首先创建一个Article 这个表,并初始化数据.  程序代码 Drop TABLE IF EXISTS `article`;Create TABLE `article` (  `id` int(11) NOT NULL auto_increment,  `userid` int(11) NOT NULL,  `title` var

mybatis实战教程(mybatis in action)之四:实现关联数据的查询

有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.我们首先创建一个Article 这个表,并初始化数据. Drop TABLE IF EXISTS `article`; Create TABLE `article` ( `id` int(11) NOT NULL auto_increment, `userid` int(11) NOT NULL, `title` varchar(100

Mybatis学习(4)实现关联数据的查询

有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.我们首先创建一个Article 这个表,并初始化数据.  程序代码 Drop TABLE IF EXISTS `article`; Create TABLE `article` ( `id` int(11) NOT NULL auto_increment, `userid` int(11) NOT NULL, `title` varch

hibernate关联数据作为查询条件

hibernate中,在前台当表关联的数据作为查询条件时,因为hibernate只接受能识别的属性(即在对应的hbm.xml文件中能找到的属性),如果没有,则在后台实现类中的hql中需要用别名进行查询: 前台页面: 后台的查询hql: if(gqm.getGtm() != null &&                 gqm.getGtm().getSm() != null &&                 gqm.getGtm().getSm().getUuid()

mybatis 使用resultMap实现关联数据的查询(association 和collection )

<?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"> <!-- namespace的名字需要跟接口的类名一致 --> <mapper namesp

网络相关系列之四:数据解析之SAX方式解析XML数据

一.XML和Json数据的引入: 通常情况下.每一个须要訪问网络的应用程序都会有一个自己的server.我们能够向server提交数据,也能够从server获取数据.只是这个时候就有一个问题,这些数据是以什么格式在网络上传输的呢?一般我们都会在网络上传输一些格式化后的数据,这样的数据会有一定的结构规格和语言,当还有一方收到数据消息后就能够依照同样的结构规格进行解析.从而取出它想要的那部分内容. 在网络上数据传输最经常使用的格式:XML和Json.本文就来学习一下XML数据的解析,Json格式的数

MyBatis 系列五 之 关联映射

MyBatis 系列五 之 关联映射 一对多的关联映射 一对多关联查询多表数据 1.1在MyBatis映射文件中做如下配置 <!--一对多单向的连接两表的查询--> <resultMap type="Dept" id="deptMapper"> <id property="deptNo" column="deptNo"/> <result property="deptName

mybatis中的关联查询

1>在实体映射层中引入关联对象 package com.jinglin.hotelsup.model; import java.io.Serializable; public class Goodsinfo implements Serializable{ private Integer goodsid; private Integer companyid; private Integer goodstypeid; private Integer unitid; private String c

mybatis中的关联对象查询

方式1(嵌套查询): 在本类的mapper映射配置文件中的ResultMap标签中使用association子标签,对关联对象的属性进行关联 例如:User中关联Department(多对一) ----------User的mapper映射配置文件---------<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Map