Mybatis学习笔记(三)—高级映射,延迟加载

本文主要介绍了如何使用resultMap完成高级映射;分析数据库中表之间的关系(一对一、一对多、多对多)

如何在mapper.xml文件中配置resultMap实现一对一、一对多、多对多;mybatis如何实现延迟加载

1       数据模型

数据库中有已经导入的四个表:items:(商品信息表);orderdetail:(订单明细表);orders:(订单表);user:(用户表)

1 CREATE TABLE items (
 2   id INT NOT NULL  AUTO_INCREMENT,
 3   itemsname VARCHAR(32) NOT NULL COMMENT ‘商品名称‘,
 4   price FLOAT(10,1) NOT NULL COMMENT ‘商品定价‘,
 5   detail TEXT COMMENT ‘商品描述‘,
 6   pic VARCHAR(64) DEFAULT NULL COMMENT ‘商品图片‘,
 7   createtime DATETIME NOT NULL COMMENT ‘生产日期‘,
 8   PRIMARY KEY (id)
 9 )  DEFAULT CHARSET=utf8;
10
11 /*Table structure for table `orderdetail` */
12
13 CREATE TABLE orderdetail (
14   id INT NOT NULL AUTO_INCREMENT,
15  orders_id INT NOT NULL COMMENT ‘订单id‘,
16   items_id INT NOT NULL COMMENT ‘商品id‘,
17   items_num INT  DEFAULT NULL COMMENT ‘商品购买数量‘,
18   PRIMARY KEY (id),
19   KEY `FK_orderdetail_1` (`orders_id`),
20   KEY `FK_orderdetail_2` (`items_id`),
21   CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
22   CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
23 )  DEFAULT CHARSET=utf8;
24
25 /*Table structure for table `orders` */
26
27 CREATE TABLE orders (
28   id INT NOT NULL AUTO_INCREMENT,
29   user_id INT NOT NULL COMMENT ‘下单用户id‘,
30   number VARCHAR(30) NOT NULL COMMENT ‘订单号‘,
31   createtime DATETIME NOT NULL COMMENT ‘创建订单时间‘,
32   note VARCHAR(100) DEFAULT NULL COMMENT ‘备注‘,
33   PRIMARY KEY (`id`),
34   KEY `FK_orders_1` (`user_id`),
35   CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
36 )  DEFAULT CHARSET=utf8;
37
38 /*Table structure for table `t_user` */
39
40 CREATE TABLE user (
41   id INT NOT NULL AUTO_INCREMENT,
42   username VARCHAR(32) NOT NULL COMMENT ‘用户名称‘,
43   birthday DATE DEFAULT NULL COMMENT ‘生日‘,
44   sex CHAR(1) DEFAULT NULL COMMENT ‘性别‘,
45   address  VARCHAR(256) DEFAULT NULL COMMENT ‘地址‘,
46   PRIMARY KEY (`id`)
47 ) DEFAULT CHARSET=utf8;

测试数据代码:

 1 /*Data for the table `items` */
 2
 3 INSERT  INTO items(itemsname,price,detail,pic,createtime) VALUES
 4 (‘台式机‘,3000.0,‘该电脑质量非常好!‘,NULL,‘2015-07-07 13:28:53‘),
 5 (‘笔记本‘,6000.0,‘笔记本性能好,质量好!‘,NULL,‘2015-07-08 13:22:57‘),
 6 (‘背包‘,200.0,‘名牌背包,容量大质量好!‘,NULL,‘2015-07-010 13:25:02‘);
 7
 8 /*Data for the table `orderdetail` */
 9
10 INSERT  INTO `orderdetail`(`orders_id`,`items_id`,`items_num`) VALUES
11  (1,1,1),
12  (1,2,3),
13  (2,3,4),
14  (3,2,3);
15
16 /*Data for the table `orders` */
17
18 INSERT  INTO `orders`(`user_id`,`number`,`createtime`,`note`) VALUES
19 (1,‘1000010‘,‘2015-06-04 13:22:35‘,NULL),
20 (1,‘1000011‘,‘2015-07-08 13:22:41‘,NULL),
21 (2,‘1000012‘,‘2015-07-17 14:13:23‘,NULL),
22 (3,‘1000012‘,‘2015-07-16 18:13:23‘,NULL),
23 (4,‘1000012‘,‘2015-07-15 19:13:23‘,NULL),
24 (5,‘1000012‘,‘2015-07-14 17:13:23‘,NULL),
25 (6,‘1000012‘,‘2015-07-13 16:13:23‘,NULL);
26
27 /*Data for the table `user` */
28
29 INSERT  INTO `user`(`username`,`birthday`,`sex`,`address`) VALUES
30 (‘王五‘,NULL,‘2‘,NULL),
31 (‘张三‘,‘2014-07-10‘,‘1‘,‘北京市‘),
32 (‘张小明‘,NULL,‘1‘,‘河南郑州‘),
33 (‘陈小明‘,NULL,‘1‘,‘河南郑州‘),
34 (‘张三丰‘,NULL,‘1‘,‘河南郑州‘),
35 (‘陈小明‘,NULL,‘1‘,‘河南郑州‘),
36 (‘王五‘,NULL,NULL,NULL),
37  (‘小A‘,‘2015-06-27‘,‘2‘,‘北京‘),
38 (‘小B‘,‘2015-06-27‘,‘2‘,‘北京‘),
39 (‘小C‘,‘2015-06-27‘,‘1‘,‘北京‘),
40 (‘小D‘,‘2015-06-27‘,‘2‘,‘北京‘);

用户表user:

记录了购买商品的用户

订单表orders:

记录了用户所创建的订单信息

订单明细表orderdetail:

记录了用户创建订单的详细信息

商品信息表items:

记录了商家提供的商品信息

分析表与表之间的关系:

用户user和订单orders:

user---->orders:一个用户可以创建多个订单   一对多

orders-->user:一个订单只能由一个用户创建  一对一

订单orders和订单明细orderdetail:

orders-->orderdetail:一个订单可以包括多个订单明细  一对多

orderdetail-->orders:一个订单明细只属于一个订单  一对一

订单明细orderdetail和商品信息items:

orderdetail-->items:一个订单明细对应一个商品信息一对一

items--> orderdetail:一个商品对应多个订单明细  一对多

以下是这四个表的对应关系:

1.1     项目的目录结构

2       一对一查询

2.1     需求

使用Mapper接口代理的方式查询订单信息关联查询用户信息

2.2     sql语句

查询语句:

先确定主查询表:订单信息表

再确定关联查询表:用户信息

通过orders关联查询用户使用user_id一个外键,只能关联查询出一条用户记录就可以使用内连接

SELECT

orders.*,

user.username,

user.sex

FROM

orders,

USER

WHERE orders.user_id = user.id

2.3使用resultType实现

2.3.1一对一查询映射的java对象

这里输出的结果包括 订单信息和用户信息,之前创建的pojo都是单表的实体类,所以这里需要自定义一个组合的pojo才能完成resultType的映射。

创建OrderCustom作为自定义pojo,补充相应的get()和set()方法

packagecn.itcast.mybatis.po;

public
class
OrderCustomextends Orders {

//补充用户信息

privateStringusername;

privateStringsex;

privateString
address;

}

2.3.2 mapper.xml文件的配置

定义OrdersMapperCustom.xml文件,

<!--一对一查询使用reusltType完成

查询订单关联查询用户信息使用resultType的方式

-->

<selectid="findOrderUserList"resultType="orderCustom">

SELECT

orders.*,

user.username,

user.sex

FROM

orders,

USER

WHEREorders.user_id = user.id

</select>

2.3.3 mapper.java接口

定义OrderMapperCustomer.java文件

packagecn.itcast.mybatis.mapper;

public
interface
OrdersMapperCustom {

// 一对一查询,查询订单关联查询用户,使用resultType

publicList<OrderCustom> findOrderUserList()throwsException;

}

2.3.4  测试OrdersMapperCustomerTest.java

package cn.itcast.mybatis.mapper;

public class OrdersMapperCustomTest {

//会话工厂

privateSqlSessionFactory sqlSessionFactory;

//创建工厂

@Before

publicvoid init() throws IOException {

//配置文件(SqlMapConfig.xml)

Stringresource = "SqlMapConfig.xml";

//加载配置文件到输入流

InputStreaminputStream = Resources.getResourceAsStream(resource);

//创建会话工厂

sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);

}

@Test

publicvoid testFindOrderUserList() throws Exception {

SqlSessionsqlSession = sqlSessionFactory.openSession();

//创建mapper代理对象

OrdersMapperCustomordersMapperCustom = sqlSession

.getMapper(OrdersMapperCustom.class);

//调用方法

List<OrderCustom>list = ordersMapperCustom.findOrderUserList();

System.out.println(list);

}

}

2.4    使用resultMap实现

2.4.1 resultMap映射思路

resultMap提供一对一关联查询的映射和一对多关联查询映射,一对一映射思路:将关联查询的信息映射到查询的POJO中,如下:

在Orders类中创建一个User属性,将关联查询的信息映射到User属性中。

Orders.java补充相应的get()和set()方法

package cn.itcast.mybatis.po;

public class Orders implements Serializable{

private Integer id;

private Integer userId;

private String number;

private Date createtime;

private String note;

//关联用户信息

private User user;

}

2.4.2  mapper.xml文件的配置

OrdersMapperCustomer.xml定义sql语句以及resultMap映射之间的关系

<!-- 一对一查询resultMap,这里的ID是一个唯一的标识,与输出参数resultMap定义的相同(用黄色标出)

-->

<resultMaptype="orders"id="ordersUserResultMap">

<!--完成了订单信息的映射配置-->

<!--id:订单关联用户查询的唯一标识  -->

<!--column: sql语句中查询的列,property:pojo中对应的属性-->

<idcolumn="id"property="id"/>

<resultcolumn="user_id"property="userId"/>

<resultcolumn="number"property="number"/>

<resultcolumn="createtime"property="createtime"/>

<resultcolumn="note"property="note"/>

<!--下边完成关联信息的映射

association:用于对关联信息映射到单个pojo

property:要将关联信息映射到orders的哪个属性中

javaType:关联信息映射到orders的属性的类型,是user的类型

-->

<associationproperty="user"javaType="user">

<!--id:关联信息的唯一标识  -->

<!--property:要映射到user的哪个属性中-->

<idcolumn="user_id"property="id"/>

<!--result就是普通列的映射-->

<resultcolumn="username"property="username"/>

<resultcolumn="sex"property="sex"/>

</association>

</resultMap>

<!-- 一对一查询使用reusltMap完成

查询订单关联查询用户信息 -->

<selectid="findOrderUserListResultMap"resultMap="ordersUserResultMap">

SELECT

orders.*,

user.username,

user.sex

FROM

orders,

USER

WHEREorders.user_id = user.id

</select>

2.4.3  mapper.java接口

在OrderMapperCustomer.java中添加使用resultMap进行一对一查询的接口

packagecn.itcast.mybatis.mapper;

public
interface
OrdersMapperCustom {

// 一对一查询,使用resultMap

publicList<Orders> findOrderUserListResultMap()throwsException;

}

2.4.4  测试OrdersMapperCustomerTest.java

package cn.itcast.mybatis.mapper;

public class OrdersMapperCustomTest {

//会话工厂

privateSqlSessionFactory sqlSessionFactory;

//创建工厂

@Before

publicvoid init() throws IOException {

//配置文件(SqlMapConfig.xml)

Stringresource = "SqlMapConfig.xml";

// 加载配置文件到输入流

InputStreaminputStream = Resources.getResourceAsStream(resource);

//创建会话工厂

sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);

}

// 一对一查询使用resultMap

@Test

public
void
testFindOrderUserListResultMap() throwsException {

SqlSessionsqlSession = sqlSessionFactory.openSession();

// 创建mapper代理对象

OrdersMapperCustomordersMapperCustom = sqlSession

.getMapper(OrdersMapperCustom.class);

// 调用方法

List<Orders>list = ordersMapperCustom.findOrderUserListResultMap();

System.out.println(list);

}

}

2.5    小结

resultType:要自定义pojo 保证sql查询列和pojo的属性对应,加入sql语句使用别名,则查询不到该列的信息,这种方法相对较简单,所以应用广泛。

resultMap:使用association完成一对一映射需要配置一个resultMap,过程有点复杂,如果要实现延迟加载就只能用resultMap实现 ,如果为了方便对关联信息进行解析,也可以用association将关联信息映射到pojo中方便解析。

3       一对多查询

3.1     需求

使用mapper接口代理的方式查询所有订单信息(关联用户)及订单下的订单明细信息。

3.2     sql语句

主查询表:订单表

关联查询表:订单明细

SELECT

orders.*,

user.username,

user.sex ,

orderdetail.id orderdetail_id,

orderdetail.items_num,

orderdetail.items_id

FROM

orders,

USER,

orderdetail

WHERE orders.user_id = user.id  AND orders.id = orderdetail.orders_id

3.3     resultMap进行一对多映射思路

resultMap 提供collection完成关联信息映射到集合对象中。

在orders类中创建集合属性:

package cn.itcast.mybatis.po;

public class Orders implements Serializable{

private Integer id;

private Integer userId;

private String number;

private Date createtime;

private String note;

//关联用户信息

private User user;

//订单明细

privateList<Orderdetail> orderdetails;

}

3.4     mapper.xml文件的配置

<!-- 一对多,查询订单及订单明细 -->

<resultMaptype="orders"id="orderAndOrderDetails"extends="ordersUserResultMap">

<!--映射订单信息,和用户信息,这里使用继承ordersUserResultMap-->

<!--映射订单明细信息

property:要将关联信息映射到orders的哪个属性中

ofType:集合中pojo的类型

-->

<collectionproperty="orderdetails"ofType="cn.itcast.mybatis.po.Orderdetail">

<!--id:关联信息订单明细的唯一标识

property:Orderdetail的属性名

-->

<idcolumn="orderdetail_id"property="id"/>

<resultcolumn="items_num"property="itemsNum"/>

<resultcolumn="items_id"property="itemsId"/>

</collection>

</resultMap>

<!-- 一对多查询使用reusltMap完成

查询订单关联查询订单明细

-->

<selectid="findOrderAndOrderDetails"resultMap="orderAndOrderDetails">

SELECT

orders.*,

user.username,

user.sex ,

orderdetail.id orderdetail_id,

orderdetail.items_num,

orderdetail.items_id

FROM

orders,

USER,

orderdetail

WHEREorders.user_id = user.id  AND orders.id =orderdetail.orders_id

</select>

3.5     mapper.java接口

在OrderMapperCustomer.java中添加使用resultMap进行一对多查询的接口

packagecn.itcast.mybatis.mapper;

public
interface
OrdersMapperCustom {

// 一对多查询,使用resultMap

publicList<Orders> findOrderAndOrderDetails()throwsException;

}

3.6     测试OrdersMapperCustomerTest.java

package cn.itcast.mybatis.mapper;

public class OrdersMapperCustomTest {

//会话工厂

privateSqlSessionFactory sqlSessionFactory;

//创建工厂

@Before

publicvoid init() throws IOException {

//配置文件(SqlMapConfig.xml)

Stringresource = "SqlMapConfig.xml";

//加载配置文件到输入流

InputStreaminputStream = Resources.getResourceAsStream(resource);

//创建会话工厂

sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);

}

// 一对多查询使用resultMap

@Test

public
void
testFindOrderAndOrderDetails() throwsException {

SqlSessionsqlSession = sqlSessionFactory.openSession();

// 创建mapper代理对象

OrdersMapperCustomordersMapperCustom = sqlSession

.getMapper(OrdersMapperCustom.class);

// 调用方法

List<Orders>list = ordersMapperCustom.findOrderAndOrderDetails();

System.out.println(list);

}

}

3.7使用resultMap进行一堆多映射小结

mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中。使用resultType实现:将订单明细映射到orders中的orderdetails中,需要自己处理,使用双重循环遍历,去掉重复记录,将订单明细放在orderdetails中。

4       多对多查询

4.1     需求

查询所有用户信息,关联查询订单及订单明细信息及商品信息,订单明细信息中关联查询商品信息

4.1    sql

主查询表:用户信息

关联查询:订单、订单明细,商品信息

SELECT

orders.*,

user.username,

user.sex ,

orderdetail.id orderdetail_id,

orderdetail.items_num,

orderdetail.items_id,

items.name items_name,

items.detail items_detail

FROM

orders,

USER,

orderdetail,

items

WHERE orders.user_id = user.id  AND orders.id = orderdetail.orders_id ANDitems.id = orderdetail.items_id

4.2     resultMap进行多对多映射思路

一对多映射是多对对映射的一个特殊例子,多对多映射思路如下:

在user.java中创建映射的属性:集合 List<Orders>orderlist

在Orders中创建映射的属性:集合List<Orderdetail> orderdetails

在Orderdetail中创建商品属性:pojo   Items items

User.java

package cn.itcast.mybatis.po;

public class User implements Serializable {

privateint id;

privateString username;// 用户姓名

privateString sex;// 性别

privateDate birthday;// 生日

privateString address;// 地址

//多个订单

private List<Orders> orderlist;

}

Orders.java

package cn.itcast.mybatis.po;

public class Orders implements Serializable{

private Integer id;

private Integer userId;

private String number;

private Date createtime;

private String note;

//关联用户信息

private User user;

//订单明细

privateList<Orderdetail> orderdetails;

}

Orderdetail.java

packagecn.itcast.mybatis.po;

importjava.io.Serializable;

public
class
Orderdetailimplements Serializable {

privateIntegerid;

privateIntegerordersId;

privateIntegeritemsId;

privateIntegeritemsNum;

//商品信息

private Items items;

}

4.3      mapper.xml文件的配置

OrdersMapperCustomer.xml定义sql语句以及resultMap映射之间的关系

<!-- 多对多查询,查询用户及订单明细和商品信息-->

<resultMaptype="user"id="userOrderDetailResultMap">

<!--用户信息映射-->

<idcolumn="user_id"property="id"/>

<resultcolumn="username"property="username"/>

<resultcolumn="sex"property="sex"/>

<!--订单信息-->

<collectionproperty="orderlist"ofType="cn.itcast.mybatis.po.Orders">

<idcolumn="id"property="id"/>

<resultcolumn="user_id"property="userId"/>

<resultcolumn="number"property="number"/>

<resultcolumn="createtime"property="createtime"/>

<resultcolumn="note"property="note"/>

<!--订单明细映射-->

<collectionproperty="orderdetails"ofType="cn.itcast.mybatis.po.Orderdetail">

<!--id:关联信息订单明细的唯一标识

property:Orderdetail的属性名

-->

<idcolumn="orderdetail_id"property="id"/>

<resultcolumn="items_num"property="itemsNum"/>

<resultcolumn="items_id"property="itemsId"/>

<!--商品信息-->

<associationproperty="items"javaType="cn.itcast.mybatis.po.Items">

<idcolumn="item_id"property="id"/>

<resultcolumn="items_name"property="name"/>

<resultcolumn="items_detail"property="detail"/>

</association>

</collection>

</collection>

</resultMap>

<!--多对多查询使用reusltMap完成

查询用户及订单和订单明细,关联商品,的信息

-->

<selectid="findUserOrderDetail"resultMap="userOrderDetailResultMap">

SELECT

orders.*,

user.username,

user.sex ,

orderdetail.id orderdetail_id,

orderdetail.items_num,

orderdetail.items_id,

items.name items_name,

items.detail items_detail

FROM

orders,

USER,

orderdetail,

items

WHERE orders.user_id = user.id  AND orders.id = orderdetail.orders_id ANDitems.id = orderdetail.items_id

</select>

4.1    mapper.java接口

在OrderMapperCustomer.java中添加使用resultMap进行一对多查询的接口

packagecn.itcast.mybatis.mapper;

public
interface
OrdersMapperCustom {

// 多对多查询,使用resultMap

publicList<User> findUserOrderDetail()throwsException;

}

4.2     测试OrdersMapperCustomerTest.java

package cn.itcast.mybatis.mapper;

public class OrdersMapperCustomTest {

//会话工厂

privateSqlSessionFactory sqlSessionFactory;

//创建工厂

@Before

publicvoid init() throws IOException {

//配置文件(SqlMapConfig.xml)

Stringresource = "SqlMapConfig.xml";

//加载配置文件到输入流

InputStreaminputStream = Resources.getResourceAsStream(resource);

//创建会话工厂

sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);

}

// 一对多查询使用resultMap

@Test

public
void
testFindUserOrderDetail() throwsException {

SqlSessionsqlSession = sqlSessionFactory.openSession();

// 创建mapper代理对象

OrdersMapperCustomordersMapperCustom = sqlSession

.getMapper(OrdersMapperCustom.class);

// 调用方法

List<User>list = ordersMapperCustom.findUserOrderDetail();

System.out.println(list);

}

}

5       延迟加载

5.1     使用延迟加载意义

在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快。

如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载。

mybatis中resultMap提供延迟加载功能,通过resultMap配置延迟加载。

5.2     配置mybatis支持延迟加载

在SqlMapConfig.xml文件中配置延迟加载

<!-- 全局配置参数 -->

<settings>

<!-- 延迟加载总开关 -->

<settingname="lazyLoadingEnabled"value="true"/>

<!-- 设置按需加载 -->

<settingname="aggressiveLazyLoading"value="false"/>

</settings>

5.3     延迟加载实现

5.3.1     实现思路

需求:查询订单及用户的信息,一对一查询。

刚开始只查询订单信息

当需要用户时调用 Orders类中的getUser()方法执行延迟加载 ,向数据库发出sql。

5.3.2     mapper.xml文件的配置

定义OrdersMapperCustom.xml文件,

<!-- 一对一查询延迟加载resultMap的配置-->

<resultMaptype="orders"id="orderCustomLazyLoading">

<!--完成了订单信息的映射配置-->

<!--id:订单关联用户查询的唯一标识-->

<idcolumn="id"property="id"/>

<resultcolumn="user_id"property="userId"/>

<resultcolumn="number"property="number"/>

<resultcolumn="createtime"property="createtime"/>

<resultcolumn="note"property="note"/>

<!--配置用户信息的延迟加载select:延迟加载执行的sql所在的statement的id,如果不在同一个namespace需要加namespace

sql:根据用户id查询用户信息column:关联查询的列property:将关联查询的用户信息设置到Orders的哪个属性-->

<associationproperty="user"

select="cn.itcast.mybatis.mapper.UserMapper.findUserById"column="user_id"></association>

</resultMap>

Sql语句的配置

<!-- 一对一查询延迟加载

开始只查询订单,对用户信息进行延迟加载

-->

<selectid="findOrderUserListLazyLoading"resultMap="orderCustomLazyLoading">

SELECT

orders.*

FROM

orders

</select>

2.4.3mapper.java接口

在OrderMapperCustomer.java中添加使用延迟加载进行一对一查询的接口

packagecn.itcast.mybatis.mapper;

public
interface
OrdersMapperCustom {

//一对一查询,延迟加载

publicList<Orders> findOrderUserListLazyLoading()throwsException;

}

2.4.4  测试OrdersMapperCustomerTest.java

package cn.itcast.mybatis.mapper;

public class OrdersMapperCustomTest {

//会话工厂

privateSqlSessionFactory sqlSessionFactory;

//创建工厂

@Before

publicvoid init() throws IOException {

//配置文件(SqlMapConfig.xml)

Stringresource = "SqlMapConfig.xml";

//加载配置文件到输入流

InputStreaminputStream = Resources.getResourceAsStream(resource);

//创建会话工厂

sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);

}

// 一对一查询延迟加载

@Test

public
void
testFindOrderUserListLazyLoading() throwsException {

SqlSessionsqlSession = sqlSessionFactory.openSession();

// 创建mapper代理对象

OrdersMapperCustomordersMapperCustom = sqlSession

.getMapper(OrdersMapperCustom.class);

// 调用方法

List<Orders>list = ordersMapperCustom.findOrderUserListLazyLoading();

//这里执行延迟加载,要发出sql

Useruser = list.get(0).getUser();

System.out.println(user);

}

}

6       resultType、resultMap、延迟加载使用场景总结

延迟加载:

延迟加载实现的方法多种多样,在只查询单表就可以满足需求,为了提高数据库查询性能使用延迟加载,再查询关联信息。

mybatis提供延迟加载的功能用于service层。

resultType:

作用:

将查询结果按照sql列名pojo属性名一致性映射到pojo中。

场合:

常见一些明细记录的展示,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。

resultMap:

使用association和collection完成一对一和一对多高级映射。

association:

作用:

将关联查询信息映射到一个pojo类中。

场合:

为了方便获取关联信息可以使用association将关联订单映射为pojo,比如:查询订单及关联用户信息。

collection:

作用:

将关联查询信息映射到一个list集合中。

场合:

为了方便获取关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块和功能,可使用collection将模块和功能列表映射到list中。

时间: 2024-08-23 12:48:16

Mybatis学习笔记(三)—高级映射,延迟加载的相关文章

【MyBatis学习08】高级映射之一对一查询

从这一篇博文开始,将总结一下mybatis中的几个高级映射,即一对一.一对多.多对多查询,这篇先总结一下mybatis中的一对一查询. 为了模拟这些需求,事先要建立几个表,不同的表之间将对应上面提到的不同的映射,为此,我建立4个表,如下: DROP TABLE IF EXISTS `items`; DROP TABLE IF EXISTS `orders`; DROP TABLE IF EXISTS `user`; DROP TABLE IF EXISTS `orderdetail`; /*it

【MyBatis学习10】高级映射之多对多查询

本文来总结一下mybatis中的多对多映射,从第8节的文章中可以看出,用户表和商品表示多对多关系,它们两的多对多是通过订单项和订单明细这两张表所关联起来的,那么这一节主要来总结一下用户表和商品表之间的多对多映射. 首先在上一节的基础上继续写sql, SELECT orders.*, user.`username`, user.`sex`, user.`address`, orderdetail.`id` orderdetail_id, orderdetail.`items_id`, orderd

【MyBatis学习09】高级映射之一对多查询

上一篇博文总结了一下一对一的映射,本文主要总结一下一对多的映射,从上一篇文章中的映射关系图中可知,订单项和订单明细是一对多的关系,所以本文主要来查询订单表,然后关联订单明细表,这样就有一对多的问题出来了. 首先还是先写sql语句,在写sql语句的时候遵循两点: 查询的主表是哪个? 订单表 查询的关联表是哪个? 订单明细表 明确了主表和关联表,下面就可以写sql了,我们在上一节的sql基础上添加订单明细表的关联即可. SELECT orders.*, user.`username`, user.`

mybatis学习笔记三(关联关系)

学习mybatis的关联关系,主要注解在代码上,这里不做解释.配置文件一样的就不贴了 1.关联关系表创建(学生对应老师 多对一) 学生老师表 2.表对应的实体类 package com.home.entity; /** * 此类是:学生 * @author hpc * @2017年1月14日下午7:06:33 */ public class Student { private Integer student_id;//学生id private String student_name;//学生名字

MyBatis学习笔记(三) 关联关系

一.多对多关系. 一般我们在设置多对多关系的时候,都是建立第三张关系表. 例子:学生t_student与课程t_courses,一个学生可以对应学习多门课程,一门课程对应可以有多名学生学习.第三张关系表t_stu_cou. 1)关系整理好,接着建立数据库表,添加信息. 1 create table t_student( 2 id int primary key auto_increment, 3 student_name varchar(20) 4 ); 5 6 create table t_c

python学习笔记(三) - 高级特性

一. 切片 切片操作和java中的subList类似,就是获取一个子列表 比如L=['zhangsan','lisi','wangwu'] 那么L[0, 2]表示从索引0开始取,直到索引2(不含2), 正好2个元素.如果第一个索引为0, 还可以省略. 下面我们创建一个0-99的数列: L = range(100) 1. 获取前10个数: L[:10] 2. 获取后10个数: L[-10:]    # 倒数第一个元素的索引是-1 3. 获取前11-20个数: L[10:20] 4. 获取前10个数

mybatis学习笔记(三)-- 优化数据库连接配置

原来直接把数据库连接配置信息写在conf.xml配置中,如下 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration&

转:C#制作ORM映射学习笔记三 ORM映射实现

现在开始实现ORM的主体模块,首先需要在项目中新建一个类,命名为DbAccess,然后在项目的引用中添加两个dll,分别是MySql.Data.dll和System.Data.SQLite.dll,这两个dll都可以在对应的数据库官网上下载到,为了方便我这里也提供一个下载地址.添加好dll后需要在DbAccess中添加几个名空间,具体代码如下: using System; using System.Collections; using System.Collections.Generic; us

springmvc+mybatis学习笔记(汇总)

springmvc+mybatis学习笔记(汇总) 标签 : springmvc mybaits springmvcmybatis学习笔记汇总 目录 联系作者 笔记分为两大部分:mybatis和springmvc mybatis springmvc 笔记内容主要是mybatis和springmvc的一些基本概念和使用方法,涉及概念介绍.环境搭建.编程细节.运行调试等方面. 这套笔记整体偏入门和应用,适合快速上手,对底层实现和机理并未做过多分析.我后续会研读spring源码,并把学习的收获写成博客

APUE 学习笔记(九) 高级I/O

1. 非阻塞I/O 低速系统调用时可能会使进程永远阻塞的一类系统调用,包括以下调用: (1)某些文件类型你(网络socket套接字.终端设备.管道)暂无可使用数据,则读操作可能会使调用者永远阻塞 (2)如果数据不能立即被(1)中文件类型接受,则写操作会使调用者永远阻塞 (3)某些进程间通信函数 非阻塞I/O使我们可以调用open.read.write这样的I/O操作,并使这些操作不会永远阻塞,如果这种操作不能完成,则调用立即出错返回 对于一个给定的文件有两种方法对其指定非阻塞I/O: (1)调用