mybatis学习(八)——resultMap之association&&collection解析
一、resultMap的使用
resultMap 也是定义返回值类型,返回值为用户自定义的类型,可用于解决JavaBean中的属性名和数据库中的列名不一致的情况
之前对于JavaBean中属性名和数据库中的列名不一致的情况,通过有两种办法,1、通过在sql中使用别名 2、如果正好符合驼峰命名,需要在settings中配置,现在可以通过resultMap来解决
hotelMapper.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.pjf.mybatis.dao.HotelMapper">
<!-- resultMap定义
type:javaBean的全类名,
id为该resultMap的唯一标识 -->
<resultMap type="com.pjf.mybatis.po.Hotel" id="myHotel">
<!--id 指定主键的封装规则
column:数据库中列名
property:javaBean的属性名 -->
<id column="id" property="id" jdbcType="INTEGER" />
<!--result 指定非主键的封装规则
column:数据库中列名
property:javaBean的属性名 -->
<result column="hotel_name" property="hotelName" jdbcType="VARCHAR" />
<result column="hotel_address" property="hotelAddress"
jdbcType="VARCHAR" />
<result column="price" property="price" jdbcType="INTEGER" />
</resultMap> <!-- resultMap使用 -->
<select id="getHotel" resultMap="myHotel">
select * from hotel
where
id=#{id}
</select>
</mapper>
二、association的使用
association和collection都是用来关联另一个表的数据,区别就是用来关联对象的封装的,而collection是用来关联集合封装的,
举个例子,比如通过查询酒店,查出该酒店的城市,是一个城市对应一个酒店,用association
而查询一个城市的酒店,是一对多的,用collection,下面来具体实现下这个例子。
1、环境准备
修改hotel.java代码,增加一种类成员变量City,通过查询酒店,直接查出他所在的城市
package com.pjf.mybatis.po;
public class Hotel {
private int id;
private String hotelName;
private String hotelAddress;
private int price;
private City city;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getHotelName() {
return hotelName;
}
public void setHotelName(String hotelName) {
this.hotelName = hotelName;
}
public String getHotelAddress() {
return hotelAddress;
}
public void setHotelAddress(String hotelAddress) {
this.hotelAddress = hotelAddress;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public City getCity() {
return city;
}
public void setCity(City city) {
this.city = city;
}
@Override
public String toString() {
return "Hotel [id=" + id + ", hotelName=" + hotelName + ", hotelAddress=" + hotelAddress + ", price=" + price
+ "]";
}
}
增加城市类 City.java
package com.pjf.mybatis.po;
public class City {
private int cityCode;
private String cityName;
public int getCityCode() {
return cityCode;
}
public void setCityCode(int cityCode) {
this.cityCode = cityCode;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
@Override
public String toString() {
return "City [cityCode=" + cityCode + ", cityName=" + cityName + "]";
}
}
还有数据库的修改,hotel表中增加一列city_code,新增一个city表,
hotel表

city表

hotelMapper接口不变
package com.pjf.mybatis.dao;
import com.pjf.mybatis.po.Hotel;
public interface HotelMapper {
public Hotel getHotel(Integer i);
}
2、association的使用
通过association来关联city表,使用规则如下
hotelMapper.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.pjf.mybatis.dao.HotelMapper">
<!-- resultMap定义 type:javaBean的全类名, id为该resultMap的唯一标识 -->
<resultMap type="com.pjf.mybatis.po.Hotel" id="myHotel">
<!--id 指定主键的封装规则 column:数据库中列名 property:javaBean的属性名 -->
<id column="id" property="id" jdbcType="INTEGER" />
<!--result 指定非主键的封装规则 column:数据库中列名 property:javaBean的属性名 -->
<result column="hotel_name" property="hotelName" jdbcType="VARCHAR" />
<result column="hotel_address" property="hotelAddress"
jdbcType="VARCHAR" />
<result column="price" property="price" jdbcType="INTEGER" /> <!--association 关联的表
property 指被关联的类成员变量
javaType 指被关联的类成员变量的全类名 -->
<association property="city" javaType="com.pjf.mybatis.po.City">
<id column="city_code" property="cityCode" jdbcType="INTEGER"/>
<result column="city_name" property="cityName" jdbcType="VARCHAR"/>
</association>
</resultMap> <!-- resultMap使用 -->
<select id="getHotel" resultMap="myHotel">
select
h.id,h.hotel_name,h.hotel_address,h.price,c.city_code,c.city_name from
hotel h ,city c
where
h.city_code=c.city_code and h.id=#{id}
</select>
</mapper>
测试类:
package com.pjf.mybatis; import java.io.IOException;
import java.io.InputStream;
import java.util.Map; 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 org.junit.Test; import com.pjf.mybatis.dao.HotelMapper;
import com.pjf.mybatis.po.Hotel; public class TestHotel { public SqlSessionFactory sqlSessionFactory() throws IOException {
// mybatis的配置文件
String resource = "mybatis_config.xml";
// 使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)TestHotel.class.getClassLoader()
InputStream is = Resources.getResourceAsStream(resource);
// 构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
return sessionFactory;
} // 查
@Test
public void getHotel() throws IOException { SqlSessionFactory sessionFactory = sqlSessionFactory();
SqlSession session = sessionFactory.openSession();
HotelMapper hotelMapper = session.getMapper(HotelMapper.class);
System.out.println(hotelMapper.getClass());
Hotel hotel = hotelMapper.getHotel(1004);
// 打印酒店
System.out.println(hotel);
// 打印城市
System.out.println(hotel.getCity());
session.close();
}
}
这时候就可以看到结果了

3、association的分步查询的使用
三、collection的使用
实例:查询某个城市的全部酒店
修改city类
package com.pjf.mybatis.po;
import java.util.List;
public class City {
private int cityCode;
private String cityName;
private List<Hotel> hotel;
public List<Hotel> getHotel() {
return hotel;
}
public void setHotel(List<Hotel> hotel) {
this.hotel = hotel;
}
public int getCityCode() {
return cityCode;
}
public void setCityCode(int cityCode) {
this.cityCode = cityCode;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
@Override
public String toString() {
return "City [cityCode=" + cityCode + ", cityName=" + cityName + "]";
}
}
修改hotelMapper接口(可以重新定义一个接口和mapper.xml文件)
package com.pjf.mybatis.dao;
import com.pjf.mybatis.po.City;
public interface HotelMapper {
public City getCityHotel(Integer i);
}
hotelMapper.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.pjf.mybatis.dao.HotelMapper">
<resultMap type="com.pjf.mybatis.po.City" id="cityHotel">
<id column="city_code" property="cityCode"/>
<result column="city_name" property="cityName"/>
<!--collection被关联的集合
ofType被关联集合元素的全类名
-->
<collection property="hotel" ofType="com.pjf.mybatis.po.Hotel">
<id column="id" property="id"/>
<result column="hotel_name" property="hotelName"/>
<result column="hotel_address" property="hotelAddress"/>
<result column="price" property="price"/>
</collection>
</resultMap> <select id="getCityHotel" resultMap="cityHotel">
SELECT c.city_code,c.city_name ,h.id,h.hotel_name,h.hotel_address,h.price
FROM city c LEFT JOIN hotel h ON c.city_code=h.city_code
WHERE c.city_code=#{cityCode}
</select>
</mapper>
测试类
package com.pjf.mybatis; import java.io.IOException;
import java.io.InputStream;
import java.util.Map; 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 org.junit.Test; import com.pjf.mybatis.dao.HotelMapper;
import com.pjf.mybatis.po.City;
import com.pjf.mybatis.po.Hotel; public class TestHotel { public SqlSessionFactory sqlSessionFactory() throws IOException {
// mybatis的配置文件
String resource = "mybatis_config.xml";
// 使用类加载器加载mybatis的配置文件(它也加载关联的映射文件)TestHotel.class.getClassLoader()
InputStream is = Resources.getResourceAsStream(resource);
// 构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
return sessionFactory;
} // 查
@Test
public void getHotel() throws IOException { SqlSessionFactory sessionFactory = sqlSessionFactory();
SqlSession session = sessionFactory.openSession();
HotelMapper hotelMapper = session.getMapper(HotelMapper.class);
System.out.println(hotelMapper.getClass());
City city = hotelMapper.getCityHotel(1);
// 打印城市
System.out.println(city);
// 打印酒店
for (Hotel hotel : city.getHotel()) {
System.out.println(hotel);
}
session.close();
}
}
查看结果

mybatis学习(八)——resultMap之association&&collection解析的更多相关文章
- mybatis学习 十三 resultMap标签 一对一
1 .<resultMap>标签 写在mapper.xml中,由程序员控制SQL查询结果与实体类的映射关系. 在写<select>标签中,有一个resultType属性,此时s ...
- Mybatis学习笔记-ResultMap结果集映射
解决属性名与字段名不一致的问题 新建项目 --> 测试实体类字段不一致的情况 数据库字段:id,name,pwd 实体类属性:id,name,password 输出结果 User{id=1, n ...
- mybatis学习八 事物
1.事物的定义: 是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源. 2,事物的特性: ...
- Mybatis学习笔记导航
Mybatis小白快速入门 简介 本人是一个Java学习者,最近才开始在博客园上分享自己的学习经验,同时帮助那些想要学习的uu们,相关学习视频在小破站的狂神说,狂神真的是我学习到现在觉得最GAN的老师 ...
- MyBatis之ResultMap的association和collection标签详解
一.前言 MyBatis 创建时的一个思想是:数据库不可能永远是你所想或所需的那个样子. 我们希望每个数据库都具备良好的第三范式或 BCNF 范式,可惜它们并不都是那样. 如果能有一种数据库映射模式, ...
- mybatis collection解析以及和association的区别
1.collection标签 说到mybatis的collection标签,我们肯定不陌生,可以通过它解决一对多的映射问题,举个例子一个用户对应多个系统权限,通过对用户表和权限表的关联查询我们可以得到 ...
- 解决 Mybatis 元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id*,result*,association*,collection*,discriminat
在配置 mybatis mapper.xml文件时, 一不小心就会报如下类似的异常: Caused by: org.springframework.beans.factory.BeanCreation ...
- mybatis项目启动报错 The content of element type "resultMap" must match "(constructor?,id*,result*,association*,collection*,discriminator?)".
启动项目报错 2018-02-26 17:09:51,535 ERROR [org.springframework.web.context.ContextLoader] - Context initi ...
- MyBatis学习 之 二、SQL语句映射文件(1)resultMap
目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...
随机推荐
- IDE spec for registry settings
IDE spec for registry settings Advanced customization of Visual Assist is possible with registry set ...
- Python正则表达式计算器流程图
- OC中的宏定义
我们都知道,宏定义是编译期常量.而OC是一种动态语言. 1.iOS系统版本判断的两个宏定义 __IPHONE_OS_VERSION_MAX_ALLOWED // iOS系统版本最大允许 __IPHON ...
- C#MySQL增删改查
首先在项目中添加引用 using MySql.Data.MySqlClient; 连接字符串 private string connString="server=localhost;use ...
- PHP 存储密码
最佳实践是 $hashedPassword = password_hash('my super cool password', PASSWORD_DEFAULT); $res = password_v ...
- 【最大权闭合子图 tarjan】bzoj1565: [NOI2009]植物大战僵尸
dinic+tarjan板子练手题 Description Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其 中P ...
- 小程序电脑调试没有问题,真机预览报错fail hand shake error
今天在做小程序的过程中使用HTTPS请求数据时,遇到安卓机型无法获取到数据,通过一系列的排查,发现是因为ssl证书的问题,后来通过https://www.myssl.cn/tools/check-se ...
- Python基础——概述
新建Python代码 Jupyter Notebook是在浏览器中运行的. 地址栏输入http://localhost:8888后直接进入工作文件夹,显示文件夹中的内容. 右上角选择New——Pyth ...
- QT添加自定义信号后编译出现undefined reference
QT添加自定义信号后编译出现undefined reference 这是需要重新生成qmake: build --->run qmake
- SQL_1_简介
了解一门语言,还是应该从名字开始.SQL中的S即Structured(结构),L即Language(语言),Q即Query(查询),但不仅仅只是查询,还可以建立数据库,添加和删除数据,对数据作联合,当 ...