高级结果映射(一对一、一对多、多对多)
1 高级结果映射
1.1 数据模型分析
1、 明确每张表存储的信息
2、 明确每张表中关键字段(主键、外键、非空)
3、 明确数据库中表与表之间的外键关系
4、 明确业务中表与表的关系(建立在具体的业务)
1.2 一对一映射
查询订单信息,关联查询用户信息
1.1使用resultType来进行一对一结果映射,查询出的列的个数和映射的属性的个数要一致。而且映射的属性要存在与一个大的对象中,它是一种平铺式的映射,即数据库查询出多少条记录,则映射成多少个对象。
1.2
使用resultMap来进行一对一结果映射,它是将关联对象添加到主信息的对象中,具体说是对象嵌套对象的一种映射方式。
1.2.1 Sql
主信息:orders
从信息:user
SELECT
orders.`id`,
orders.`user_id`,
orders.`number`,
user.`username`,
user.`sex`
FROM
orders,
USER
WHERE orders.`user_id` = user.`id`
步骤:
Jar包导入,生成数据库表,创建与src同级资源目录 config,test目录(注意,config,test均为资源目录)
1.创建实体类:
User.java ---一对一用户类
Orders_OneToOne.java– 专用 一对一 订单类
OrdersExt1_resultMap_OneToOne–User和Orders_OneToOne的扩展类,用于接受resultMap
OrdersExt1_resultType_OneToOne –User和Orders_OneToOne的扩展类,用于授受resulttyep
2.建实体类对应的映射文件OrdersMapper.xml(局部xml文件)
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEmapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mappernamespace="com.xiangshuai.mybatis.mapper.OrdersMapper">
<!-- user与order一对一映射resultType -->
<selectid="findOrdersAndUser"resultType="com.xiangshuai.mybatis.pojo.OrdersExt1_resultMap_OneToOne">
SELECT
orders.`id`,
orders.`user_id`,
orders.`number`,
user.`username`,
user.`sex`
FROM
orders,
USER
WHEREorders.`user_id` = user.`id`
</select>
<!-- OrdersAndUserRstMap user与order 一对一映射之resultMap -->
<resultMaptype="com.xiangshuai.mybatis.pojo.OrdersExt1_resultMap_OneToOne"id="OrdersAndUserRstMap">
<!-- 订单信息 -->
<idcolumn="id"property="id"/>
<resultcolumn="user_id"property="userId"/>
<resultcolumn="number"property="number"/>
<!-- 用户信息(一对一) -->
<!-- association:一对一关联映射 -->
<!-- property:关联信息查询的结果将要映射的扩展类中的对象属性名称 -->
<!-- id标签:建议在关联查询时必须写上,不写不会报错,但是会影响性能 -->
<associationproperty="user"javaType="com.xiangshuai.mybatis.pojo.User">
<idcolumn="user_id"property="id"/>
<resultcolumn="username"property="username"/>
<resultcolumn="sex"property="sex"/>
</association>
</resultMap>
<!-- user与order 一对一映射之resultMap -->
<selectid="findOrdersAndUserRstMap"resultMap="OrdersAndUserRstMap">
SELECT
orders.`id`,
orders.`user_id`,
orders.`number`,
user.`username`,
user.`sex`
FROM
orders,
USER
WHEREorders.`user_id` = user.`id`
</select>
</mapper>
3.将DBUserMapper.xml(局部xml文件)mapper到 SqlMapConfig.xml(全局配置文件)中
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEconfiguration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 加载java的配置文件或者声明属性信息 -->
<propertiesresource="db.properties">
</properties>
<!-- <settings></settings> -->
<!-- 自定义别名 -->
<!-- <typeAliases>
单个别名定义
<typeAliastype="com.itheima.mybatis.po.User" alias="user"/>
批量别名定义(推荐)
package:指定包名称来为该包下的po类声明别名,默认的别名就是类名(首字母大小写都可)
<packagename="com.itheima.mybatis.po" />
</typeAliases>
-->
<!-- 配置mybatis的环境信息,与spring整合,该信息由spring来管理 -->
<environmentsdefault="development">
<environmentid="development">
<!-- 配置JDBC事务控制,由mybatis进行管理 -->
<transactionManagertype="JDBC"></transactionManager>
<!-- 配置数据源,采用mybatis连接池 -->
<dataSourcetype="POOLED">
<propertyname="driver"value="${db.driver}"/>
<propertyname="url"value="${db.url}"/>
<propertyname="username"value="${db.username}"/>
<propertyname="password"value="${db.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapperresource="com/xiangshuai/mybatis/mapper/OrdersMapper.xml"/>
<!-- 批量加载映射文件 -->
<!-- <package name="com.itheima.mybatis.mapper"/> -->
</mappers>
</configuration>
4.严格参照OrdersMapper.xml 按照mapper规范创建mapper接口SqlMapConfig.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEconfiguration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 加载java的配置文件或者声明属性信息 -->
<propertiesresource="db.properties">
</properties>
<!-- <settings></settings> -->
<!-- 自定义别名 -->
<!-- <typeAliases>
单个别名定义
<typeAliastype="com.itheima.mybatis.po.User" alias="user"/>
批量别名定义(推荐)
package:指定包名称来为该包下的po类声明别名,默认的别名就是类名(首字母大小写都可)
<packagename="com.itheima.mybatis.po" />
</typeAliases>
-->
<!-- 配置mybatis的环境信息,与spring整合,该信息由spring来管理 -->
<environmentsdefault="development">
<environmentid="development">
<!-- 配置JDBC事务控制,由mybatis进行管理 -->
<transactionManagertype="JDBC"></transactionManager>
<!-- 配置数据源,采用mybatis连接池 -->
<dataSourcetype="POOLED">
<propertyname="driver"value="${db.driver}"/>
<propertyname="url"value="${db.url}"/>
<propertyname="username"value="${db.username}"/>
<propertyname="password"value="${db.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件 -->
<mappers>
<mapperresource="com/xiangshuai/mybatis/mapper/OrdersMapper.xml"/>
<!-- 批量加载映射文件 -->
<!-- <packagename="com.itheima.mybatis.mapper" /> -->
</mappers>
</configuration>
5.测试类Demo1.java
package com.xiangshuai.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
importorg.apache.ibatis.session.SqlSession;
importorg.apache.ibatis.session.SqlSessionFactory;
importorg.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import com.xiangshuai.mybatis.mapper.OrdersMapper;
importcom.xiangshuai.mybatis.pojo.OrdersExt1_resultMap_OneToOne;
importcom.xiangshuai.mybatis.pojo.OrdersExt1_resultType_OneToOne;
public class Demo1 {
/*mybatis开发方式mapper开发非mapper开始:查询,操作和hibernate很像,也是先造实体类,然后配实体类的XML映射文件,然后将实体类的XML映射文件mapper到全局映射 XML文件
SqlMapConfig.xml中去,
* */
privateSqlSessionFactory sqlSessionFactory;
@Before
publicvoid before(){
//读取配置文件
//全局配置文件的路径
Stringresource = "SqlMapConfig.xml";
InputStreaminputStream = null;
try{
inputStream= Resources.getResourceAsStream(resource);
}catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
//创建SqlSessionFactory
sqlSessionFactory = newSqlSessionFactoryBuilder().build(inputStream);
}
//resultMap标签测试--user与order 一对一映射resultType
@Test
public void findOrdersAndUser(){
//创建mapper对象 -- UserMapper对象
//创建mapper对象 -- UserMapper对象
SqlSessionsqlsession = sqlSessionFactory.openSession();
OrdersMappermapper = sqlsession.getMapper(OrdersMapper.class);
//调用mapper完成 增删改查方法
List<OrdersExt1_resultType_OneToOne>fodersExt1 = mapper.findOrdersAndUser();//user与order 一对一映射resultType
System.out.println(fodersExt1);
}
//resultMap标签测试--user与order 一对一映射resultType
@Test
publicvoid findOrdersAndUserRstMap(){
//创建mapper对象 -- UserMapper对象
//创建mapper对象 -- UserMapper对象
SqlSessionsqlsession = sqlSessionFactory.openSession();
OrdersMappermapper = sqlsession.getMapper(OrdersMapper.class);
//调用mapper完成 增删改查方法
List<OrdersExt1_resultMap_OneToOne>fodersExt1 = mapper.findOrdersAndUserRstMap();//user与order 一对一映射resultType
System.out.println(fodersExt1);
}
}