多对一关联查询

一、数据库关系。article表和user表示多对一的关系

CREATE TABLE `article` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userid` int() NOT NULL,
`title` varchar(100) NOT NULL,
`content` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
CREATE TABLE `user` (
`id` int() NOT NULL AUTO_INCREMENT,
`userName` varchar(50) DEFAULT NULL,
`gender` int(11) DEFAULT NULL,
`hobby` varchar(255) DEFAULT NULL,
`member` int(11) DEFAULT NULL,
`userAge` int(11) DEFAULT NULL,
`userAddress` varchar(200) DEFAULT NULL,
`reg_time` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

二、创建跟表对应关系的model

public class Article {
private int id;
private User user;
private String title;
private String content; setter()... getter()...
}
public class User {
private int id;
private String userName;
private String userAge;
private Gender gender;
private Hobby hobby;
private Member member;
private String userAddress;
private Date regTime; setters()&getters()
}

三、新建对应的mapper映射器组合

 public interface ArticleMapper {
public List<Article> getUserArticles();
}

  组合一:

<?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.yihaomen.mybatis.dao.ArticleMapper">
<!-- User 联合文章进行查询 方法之一的配置 (多对一的方式) -->
<resultMap id="resultUserArticleList" type="Article">
<!--注意这个column=aid一定要跟下面的<association>中的<id property='id' column='id' >区分开来-->
<id property="id" column="aid" />
<result property="title" column="title" />
<result property="content" column="content" />
<association property="user" javaType="User">
<id property="id" column="id" />
<result property="userName" column="userName" />
<result property="userAddress" column="userAddress" />
       <result property="gender" column="gender" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
     </association>
    </resultMap>
<select id="getUserArticles" resultMap="resultUserArticleList">
<!--如果两个表的id字段有关联,那必须都查询出来-->
SELECT u.id,u.userName,u.gender,u.userAddress,a.id aid,a.title,a.content
FROM `user` u,`article` a
WHERE u.id=a.userid
</select>
</mapper>

  组合二:

<?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.yihaomen.mybatis.dao.ArticleMapper"> <resultMap id="resultUserArticleList2" type="Article">
<id property="id" column="aid" />
<result property="title" column="title" />
<result property="content" column="content" />
<association property="user" javaType="User" resultMap="resultListUser2" />
</resultMap>
<resultMap id="resultListUser2" type="User">
<id column="id" property="id" />
<result column="userName" property="userName" />
<result column="userAge" property="userAge" />
<result column="gender" property="gender" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
<result column="userAddress" property="userAddress" />
</resultMap> <select id="getUserArticles" resultMap="resultUserArticleList2">
<!--如果两个表的id字段有关联,那必须都查询出来-->
SELECT u.id,u.userName,u.gender,u.userAddress,a.id aid,a.title,a.content
FROM `user` u,`article` a
WHERE u.id=a.userid
</select>
</mapper>

  组合三:

<?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.yihaomen.mybatis.dao.ArticleMapper"> <resultMap id="resultUserArticleList3" type="Article">
<id property="id" column="aid" />
<result property="title" column="title" />
<result property="content" column="content" />
<association property="user" column="userid" select="com.yihaomen.mybatis.dao.UserMapper.selectUserByID" />
</resultMap>
<select id="getUserArticles" resultMap="resultUserArticleList3">
<!--如果两个表的id字段有关联,那必须都查询出来-->
     <!--这个a.userid一定要查出来,否则上面的column="userid"就没有值,在查询的时候就会报空指针异常-->
SELECT u.id,u.userName,u.gender,u.userAddress,a.id aid,a.userid,a.title,a.content
FROM `user` u,`article` a
WHERE u.id=a.userid
</select>
</mapper>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.yihaomen.mybatis.dao.UserMapper"> <resultMap id="resultListUser" type="User">
<id column="id" property="id" />
<result column="userName" property="userName" />
<result column="userAge" property="userAge" />
<result column="gender" property="gender" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
<result column="hobby" property="hobby" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
<result column="member" property="member" typeHandler="com.yihaomen.mybatis.type.MyMemberTypeHandler"/>
<result column="userAddress" property="userAddress" />
<result column="reg_time" property="regTime" javaType="java.util.Date" jdbcType="VARCHAR"
typeHandler="com.yihaomen.mybatis.type.MyDateTypeHandler"/>
</resultMap>
<select id="selectUserByID" parameterType="int" resultType="User" >
select * from `user` where id = #{id}
</select> </mapper>

四、在configuration.xml 配置别名和注册映射器:

<typeAliases>
<typeAlias alias="User" type="com.yihaomen.mybatis.model.User"/>
<typeAlias alias="Article" type="com.yihaomen.mybatis.model.Article" />
</typeAliases>
<mappers>
<mapper resource="com/yihaomen/mybatis/model/User.xml"/>
<mapper resource="com/yihaomen/mybatis/model/Article.xml"/>
</mappers>

五、测试

public class ArticleTest extends BaseTest{
public static void main(String[] args) {
selectArticlesWithUser();
} public static void selectArticlesWithUser() {
SqlSessionFactory sessionFactory =getSession();
SqlSession session = sessionFactory.openSession();
ArticleMapper mapper = session.getMapper(ArticleMapper.class);
List<Article> list = mapper.getUserArticles();
for(Article a : list) {
System.out.println(a.getTitle() + "," + a.getUser().getUserName() + "," + a.getUser().getGender());
}
}
}

一对多关联查询

一、数据库关系。user表和article表示一对多的关系

二、创建跟表对应关系的model

public class User {
private int id;
private String userName;
private String userAge;
private Gender gender;
private Hobby hobby;
private Member member;
private String userAddress;
private Date regTime;
private List<Article> articleList; setters()&getters()
}

三、新建对应的mapper映射器组合

@Repository
public interface UserMapper { public List<User> getUserArticlesById(Long id); }

组合一:

<?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.yihaomen.mybatis.dao.UserMapper"> <resultMap id="resultUserArticleList3" type="User">
<id column="id" property="id" />
<result column="userName" property="userName" />
<result column="userAge" property="userAge" />
<result column="gender" property="gender" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
<result column="hobby" property="hobby" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
<result column="member" property="member" typeHandler="com.yihaomen.mybatis.type.MyMemberTypeHandler"/>
<result column="userAddress" property="userAddress" />
<result column="reg_time" property="regTime" javaType="java.util.Date" jdbcType="VARCHAR"
typeHandler="com.yihaomen.mybatis.type.MyDateTypeHandler"/>
<!--一对多-->
<collection property="articleList" ofType="Article">
<!--这个column=aid 一定要跟上面id的区分开来,否则会查询不出来-->
<id property="id" column="aid"></id>
<result column="title" property="title" />
<result column="content" property="content"/>
</collection> </resultMap>
<select id="getUserArticlesById" resultMap="resultUserArticleList3" parameterType="Long">
SELECT u.id, u.userName, u.userAddress, u.gender, a.id aid,a.userid, a.title, a.content
FROM `user` u,`article` a
WHERE u.id=a.userid and u.id=#{id}
</select>
</mapper>

组合二:这种方法适合SQL类似 SELECT * FROM table_name,就是没有where条件的情况

<resultMap id="resultUserArticleList4" type="User">
<id column="id" property="id" />
<result column="userName" property="userName" />
<result column="userAge" property="userAge" />
<result column="gender" property="gender" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
<result column="hobby" property="hobby" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
<result column="member" property="member" typeHandler="com.yihaomen.mybatis.type.MyMemberTypeHandler"/>
<result column="userAddress" property="userAddress" />
<result column="reg_time" property="regTime" javaType="java.util.Date" jdbcType="VARCHAR"
typeHandler="com.yihaomen.mybatis.type.MyDateTypeHandler"/>
<!--一对多-->
<collection property="articleList" column="userid"
select="com.yihaomen.mybatis.dao.ArticleMapper.getArticlesByUserId">

</collection> </resultMap> <select id="getUserArticlesById" resultMap="resultUserArticleList4" parameterType="Long">
SELECT u.id, u.userName, u.userAddress, u.gender, a.id aid,a.userid, a.title, a.content
FROM `user` u,`article` a
WHERE u.id=a.userid and u.id=#{id}
</select>

Article.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.yihaomen.mybatis.dao.ArticleMapper"> <resultMap id="resultArticles" type="Article">
<id column="id" property="id" />
<result column="title" property="title" />
<result column="content" property="content" />
</resultMap> <select id="getArticlesByUserId" parameterType="Integer" resultMap="resultArticles">
SELECT
id, title, content
FROM
article a
WHERE
a.userid=#{userId}
</select> </mapper>

四、测试

import com.yihaomen.mybatis.dao.UserMapper;
import com.yihaomen.mybatis.model.Article;
import com.yihaomen.mybatis.model.User;
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 java.io.IOException;
import java.io.Reader;
import java.util.List; public class TestGetUser {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static {
try {
reader = Resources.getResourceAsReader("configuration.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSession() {
return sqlSessionFactory;
} public static void getUserArticlesById(Long id) {
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> users = userMapper.getUserArticlesById(id);
for(User u : users) {
System.out.println("------------------");
System.out.println(u.getUserName());
for(Article a : u.getArticleList()) {
System.out.println(a.getTitle() + "," + a.getContent());
}
}
} public static void main(String[] args) { getUserArticlesById(11L);
}
}

https://gitee.com/huayicompany/springmvc-mybatis

参考:

[1] 《mybati实战教程》

[2] CSDN博客,http://www.cnblogs.com/hq233/p/6752335.html

mybatis实战教程二:多对一关联查询(一对多)的更多相关文章

  1. NHibernate教程(11)--多对多关联查询

    本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...

  2. mybatis 14: 多对一关联查询

    业务背景 根据订单id查询订单的信息,以及该订单所属的客户的基本信息(不包括该客户自己的订单信息) 两张数据表 客户表 订单表 实体类 客户实体类:Customer private Integer i ...

  3. 【转】mybatis实战教程(mybatis in action),mybatis入门到精通

    MyBatis 目录(?)[-] mybatis实战教程mybatis in action之一开发环境搭建 mybatis实战教程mybatis in action之二以接口的方式编程 mybatis ...

  4. mybatis实战教程(mybatis in action),mybatis入门到精通

    转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过hibernate了那这个就非常的简单) (再加 ...

  5. mybatis实战教程(mybatis in action),mybatis入门到精通(转)

    转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门一下下,如果你看过Hibernate了那这个就非常的简单) (再加 ...

  6. Spring Security教程(二):自定义数据库查询

    Spring Security教程(二):自定义数据库查询   Spring Security自带的默认数据库存储用户和权限的数据,但是Spring Security默认提供的表结构太过简单了,其实就 ...

  7. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  8. 1.mybatis实战教程mybatis in action之一开发环境搭建

    转自:https://www.cnblogs.com/shanheyongmu/p/5652471.html 什么是mybatis MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框 ...

  9. Mybatis学习系列(五)关联查询

    前面几节的示例基本都是一些单表查询,实际项目中,经常用到关联表的查询,比如一对一,一对多等情况.在Java实体对象中,一对一和一对多可是使用包装对象解决,属性使用List或者Set来实现,在mybat ...

随机推荐

  1. 什么是TNB?如何买TNB?

    我天天在微博上看到有人吹TNB,今天一起来看下它到底是什么玩意? 什么是TNB? Time New Bank (TNB) 旨在打造精淮的时间价值传输网络.   我们高度认可人们时间付出的商业价值,每个 ...

  2. 一些关于memcpy memmove函数的区别,和模拟实现

    memcpy: 它是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 函数原型:void* memcp ...

  3. master_pos_wait函数与MySQL主从切换

    背景 主从切换是高可用MySQL架构的必要步骤(即使用不发生,也要有备无患).一般设置为双M(M1.M2),假设当前状态为写M1,而M2只读,切换的大致流程如下: 1.  停止应用写M1,将M1设置为 ...

  4. 二叉树——遍历篇(递归/非递归,C++)

    二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...

  5. 利用JParticles制作粒子

    JParticles 2.0发布,打造炫酷的粒子 一. 介绍 JParticles 2.0发布之前叫Particleground.js, 相信有在用的朋友应该不会陌生, 关于1.x的介绍可以看这里 二 ...

  6. nodejs+express+mysql实现restful风格的增删改查示例

    首先,放上项目github地址:https://github.com/codethereforam/express-mysql-demo 一.前言 之前学的java,一直用的ssm框架写后台.前段时间 ...

  7. FPGA学习之路——一路走来

    既然选择了远方,便不顾风雨兼程,一路走下去. —韩彬 在看bingo的书时,看到这样写到.做什么事情都不容易,学习也是,所以一个词很重要不忘初心.作为一名大二的学生,我很高兴能够将自己学习FPGA的过 ...

  8. 前端构建工具gulp之基本介绍

    1.基本介绍 gulp.js是一个自动化构建工具,是自动化项目的构建利器.可以对网站的资源进行优化,将开发过程中一些重复的任务通过执行命令自动完成.这样能很大的提高我们的工作效率. gulp.js是基 ...

  9. 【JavaScript数组】

    1.什么是数组--Array 数组就是一组数据的集合 其表现形式就是内存中的一段连续的内存地址 数组名称其实就是连续内存地址的首地址 2.关于js中的数组特点 数组定义时无需指定数据类型 数组定义时可 ...

  10. React Router 使用教程

    一.基本用法 React Router 安装命令如下. $ npm install -S react-router 使用时,路由器Router就是React的一个组件. import { Router ...