一、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解析的更多相关文章

  1. mybatis学习 十三 resultMap标签 一对一

    1 .<resultMap>标签 写在mapper.xml中,由程序员控制SQL查询结果与实体类的映射关系. 在写<select>标签中,有一个resultType属性,此时s ...

  2. Mybatis学习笔记-ResultMap结果集映射

    解决属性名与字段名不一致的问题 新建项目 --> 测试实体类字段不一致的情况 数据库字段:id,name,pwd 实体类属性:id,name,password 输出结果 User{id=1, n ...

  3. mybatis学习八 事物

    1.事物的定义: 是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行. 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源. 2,事物的特性: ...

  4. Mybatis学习笔记导航

    Mybatis小白快速入门 简介 本人是一个Java学习者,最近才开始在博客园上分享自己的学习经验,同时帮助那些想要学习的uu们,相关学习视频在小破站的狂神说,狂神真的是我学习到现在觉得最GAN的老师 ...

  5. MyBatis之ResultMap的association和collection标签详解

    一.前言 MyBatis 创建时的一个思想是:数据库不可能永远是你所想或所需的那个样子. 我们希望每个数据库都具备良好的第三范式或 BCNF 范式,可惜它们并不都是那样. 如果能有一种数据库映射模式, ...

  6. mybatis collection解析以及和association的区别

    1.collection标签 说到mybatis的collection标签,我们肯定不陌生,可以通过它解决一对多的映射问题,举个例子一个用户对应多个系统权限,通过对用户表和权限表的关联查询我们可以得到 ...

  7. 解决 Mybatis 元素类型为 "resultMap" 的内容必须匹配 "(constructor?,id*,result*,association*,collection*,discriminat

    在配置 mybatis mapper.xml文件时, 一不小心就会报如下类似的异常: Caused by: org.springframework.beans.factory.BeanCreation ...

  8. 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 ...

  9. MyBatis学习 之 二、SQL语句映射文件(1)resultMap

    目录(?)[-] 二SQL语句映射文件1resultMap resultMap idresult constructor association联合 使用select实现联合 使用resultMap实 ...

随机推荐

  1. IDE spec for registry settings

    IDE spec for registry settings Advanced customization of Visual Assist is possible with registry set ...

  2. Python正则表达式计算器流程图

  3. OC中的宏定义

    我们都知道,宏定义是编译期常量.而OC是一种动态语言. 1.iOS系统版本判断的两个宏定义 __IPHONE_OS_VERSION_MAX_ALLOWED // iOS系统版本最大允许 __IPHON ...

  4. C#MySQL增删改查

    首先在项目中添加引用 using MySql.Data.MySqlClient; 连接字符串  private string connString="server=localhost;use ...

  5. PHP 存储密码

    最佳实践是 $hashedPassword = password_hash('my super cool password', PASSWORD_DEFAULT); $res = password_v ...

  6. 【最大权闭合子图 tarjan】bzoj1565: [NOI2009]植物大战僵尸

    dinic+tarjan板子练手题 Description Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其 中P ...

  7. 小程序电脑调试没有问题,真机预览报错fail hand shake error

    今天在做小程序的过程中使用HTTPS请求数据时,遇到安卓机型无法获取到数据,通过一系列的排查,发现是因为ssl证书的问题,后来通过https://www.myssl.cn/tools/check-se ...

  8. Python基础——概述

    新建Python代码 Jupyter Notebook是在浏览器中运行的. 地址栏输入http://localhost:8888后直接进入工作文件夹,显示文件夹中的内容. 右上角选择New——Pyth ...

  9. QT添加自定义信号后编译出现undefined reference

    QT添加自定义信号后编译出现undefined reference 这是需要重新生成qmake: build --->run qmake

  10. SQL_1_简介

    了解一门语言,还是应该从名字开始.SQL中的S即Structured(结构),L即Language(语言),Q即Query(查询),但不仅仅只是查询,还可以建立数据库,添加和删除数据,对数据作联合,当 ...