Mybatis入门(四):实现关联查询
2016-03-21 10:51
85 查看
有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等。这些查询是如何处理的呢,这一讲就讲这个问题。
注意一下,文章的用户是怎么定义的,是直接定义的一个User对象。而不是int类型。
这样配置之后,就可以了,将select 语句与resultMap 对应的映射结合起来看,就明白了。用association 来得到关联的用户,这是多对一的情况,因为所有的文章都是同一个用户的。
一、首先创建一个Article 这个表,并初始化数据。
建表语句如下:Drop TABLE IF EXISTS `article`; Create TABLE `article` ( `id` int(11) NOT NULL auto_increment, `userid` int(11) NOT NULL, `title` varchar(100) NOT NULL, `content` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; -- ---------------------------- -- 添加几条测试数据 -- ---------------------------- Insert INTO `article` VALUES ('1', '1', 'test_title', 'test_content'); Insert INTO `article` VALUES ('2', '1', 'test_title_2', 'test_content_2'); Insert INTO `article` VALUES ('3', '1', 'test_title_3', 'test_content_3'); Insert INTO `article` VALUES ('4', '1', 'test_title_4', 'test_content_4');
二、新建一个Article的Java类。
package com.nextflower.Study.entity; /** * @author nextflower * Created by root on 2016/3/21. */ public class Article { 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; } }
注意一下,文章的用户是怎么定义的,是直接定义的一个User对象。而不是int类型。
三、多对一的实现:
场景:在读取某个用户发表的所有文章。当然还是需要在User.xml 里面配置 select 语句, 但重点是这个 select的resultMap 对应什么样的数据呢。1、这是重点,这里要引入 association 看定义如下:
<!-- User 联合文章进行查询 方法之一的配置 (多对一的方式) --> <resultMap id="resultUserArticleList" type="Article"> <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" /> </association> <!--第二种可选方式 <association property="user" javaType="User" resultMap="resultListUser"/> --> </resultMap> <select id="getUserArticles" parameterType="int" resultMap="resultUserArticleList"> select user.id,user.userName,user.userAddress,article.id aid,article.title,article.content from user,article where user.id=article.userid and user.id=#{id} </select>
这样配置之后,就可以了,将select 语句与resultMap 对应的映射结合起来看,就明白了。用association 来得到关联的用户,这是多对一的情况,因为所有的文章都是同一个用户的。
2、需要注意一下,配置文件中使用了type=”Article”,所以我们还需要在Configuration.xml中增加一个别名的配置:
<typeAliases> <typeAlias alias="User" type="com.nextflower.Study.entity.User"/> <typeAlias alias="Article" type="com.nextflower.Study.entity.Article"/> </typeAliases>
3、在UserDao类中增加方法定义:
public List<Article> getUserArticles(int id);
4、测试代码:
@Test public void testGetListArticles() { SqlSession session = sqlSessionFactory.openSession(); try { UserDao userDao = session.getMapper(UserDao.class); for (Article article : userDao.getUserArticles(1)) { System.out.println(article.getId()+"----" + article.getTitle()); } session.commit(); } finally { session.close(); } }
5、测试结果:
相关文章推荐
- 深入浅析mybatis oracle BLOB类型字段保存与读取
- MyBatis MapperProvider MessageFormat拼接批量SQL语句执行报错的原因分析及解决办法
- oracle+mybatis 使用动态Sql当插入字段不确定的情况下实现批量insert
- MyBatis学习笔记(二)之关联关系
- 浅析Mybatis 在CS程序中的应用
- Java Mybatis框架入门基础教程
- Java简单实现SpringMVC+MyBatis分页插件
- MyBatis批量添加、修改和删除
- MyBatis与Hibernate的比较
- 浅析mybatis和spring整合的实现过程
- mybatis的动态sql详解(精)
- MyBatis实践之动态SQL及关联查询
- Mybatis实现增删改查及分页查询的方法
- MyBatis入门学习教程(一)-MyBatis快速入门
- Spring与Mybatis的整合方法有哪些
- 详解MyBatis直接执行SQL查询及数据批量插入
- 解决springmvc+mybatis+mysql中文乱码问题
- Spring3.1.1+MyBatis3.1.1的增、删、查、改以及分页和事务管理
- Spring+Mybatis+Mysql搭建分布式数据库访问框架的方法
- MyBatis实践之DAO与Mapper