Mybatis高级部分

Mybatis高级部分

添加订单表
订单表
Orders pojo对象

import java.util.Date;

public class Orders implements Serializable {
	private Integer id;
	private Integer userId;
	private String number;
	private Date ctime;
	//get set方法 
}

一对一查询

数据库查询结果

数据库结果

resultType查询

需要pojo类接收,查询结果orders表数据多,建立ordersCustom类,继承orders,添加mobileNumber和nickname属性

public class OrdersCustom extends Orders {
	//添加用户信息
	private String mobileNumber;
	private String nickname;
	public String getMobileNumber() {
		return mobileNumber;
	}
	public void setMobileNumber(String mobileNumber) {
		this.mobileNumber = mobileNumber;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
}

创建OrdersCustomMapper.xml和OrdersCustomMapper.java
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

resultMap

1.直接将上面的resultType别名映射
2.将订单信息直接映射在orders对象中,orders类中添加User属性,将关联查询出来的结果映射到orders对象的user属性中

public class Orders implements Serializable {
	private User user;
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
}

修改OrdersCustomMapper.xml和OrdersCustomMapper.java
在这里插入图片描述
在这里插入图片描述

一对多查询

数据库查询结果

在这里插入图片描述

resultMap

User类中添加List属性

public class User implements Serializable {
	private List<Orders> ordersList;
	public List<Orders> getOrdersList() {
		return ordersList;
	}
	public void setOrdersList(List<Orders> ordersList) {
		this.ordersList = ordersList;
	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

resultMap继承

在这里插入图片描述

一对多查询总结

  1. 使用resultMap将查询结果存储在list集合属性中
  2. 使用resultType查询,将结果存储在list对象中

多对多查询

参考上面 使用collection标签和association组合

延迟加载

  1. 什么是延迟加载?
    resultMap可以实现高级映射(使用collection标签和association组合),association和collection具有延迟加载功能。先从单表查询,再需要时,查询关联表。
  2. 实现原理
    resultType可以分成多个查询,组合。resultMap在association标签使用select和column属性
			<!-- select就是延迟加载的查询关联的statementid 调用getUser()方法时开始延迟加载-->
		<association property="user" javaType="com.shyb.bean.User" select="com.shyb.mapper.UserMapper.findUserById" column="userId"> column="">

sqlMapConfig.xml配置开关

<setting>
	<setting name="lazyLoadingEnabled" value="true"/>
	<setting name="aggressiveLazyLoading" value="false"/>
</setting>

查询缓存

  1. mybatis提供用于减轻数据库的压力,提高数据库的性能。
  2. Mybatis提供一级缓存和二级缓存。
  3. 操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(hashMap)存储缓存数据,不同sqlSession之间缓存数据区域互不影响(一级缓存)。
  4. 二级缓存是mapper级别缓存,多个sqlSession操作同一个Mapper的sql语句,数据会存储在二级缓存区域。
  5. 在执行sqlSession的commit操作(即增删改)时,会清空缓存

一级缓存

  1. mybatis默认支持一级缓存
    在这里插入图片描述
    在同一个sqlSession,查询同一条查询,查询语句一样,只会执行一次。
    在这里插入图片描述
    执行commit操作,清空了缓存,又执行一次查询。
    正式开发中,是将mybatis和spring整合开发,事务控制在service中,一个service中包含多个mapper方法。
    service开始执行是,开始事务,创建sqlSession对象,在方法内可以使用一级缓存,但如果执行两次service,就不执行一级缓存(service方法结束,sqlSession对象关闭,一级缓存就清空)

二级缓存

每个mapper都会有一个二级缓存(如UserMapper和OrdersMapper
按namespace区分,如果两个namespace相同,两个mapper执行同一个二级缓存)。
如果sqlSession执行相同mapper下的sql,执行commit操作,就会清空mapper下的二级缓存。

  1. 开启二级缓存(默认关闭)
    不仅需要在sqlMapConfig.xml设置二级缓存的总开关,还需要在具体的mapper.xml中开启二级缓存。
	<!-- sqlMapConfig.xml开启二级缓存 -->
	<settings>
		<!-- 开启二级缓存 注意:properties和settings配置放在配置文件最上面 -->
		<setting name="cacheEnabled" value="true"/>
	</settings>

在UserMapper.xml中开启二级缓存。
在这里插入图片描述

  1. pojo类实现序列化接口
    为了将缓存数据取出执行反序列化操作,二级缓存存储介质多种多样。
    在这里插入图片描述
    insert后提交,发现又读取一次数据库(清除缓存)
    在这里插入图片描述
  2. 刷新二级缓存
    flushCache=“false”(默认true),一般commit操作都设置刷新(清除)缓存(避免脏读)
    在这里插入图片描述

在这里插入图片描述

  1. 不使用二级缓存
    select标签可以设置useCache=“false”,不使用缓存
    在这里插入图片描述

mybatis整合ehcache

分布缓存

  1. 为了提高系统并发,一般采用分布式部署。
  2. mybatis二级缓存在不同服务器上单独存储,影响用户使用,因此采取分布式缓存(redis,ehcache,memcached)。
  3. mybatis无法实现分布式缓存。需要和其他分布式缓存数据进行处理。
  4. 整合方法:mybatis提供了cache接口。实现cache接口即可。mybatis有默认实现类(perpetualCache)。
	<!--导入jar包-->
	<dependency>
	    <groupId>org.mybatis.caches</groupId>
	    <artifactId>mybatis-ehcache</artifactId>
	    <version>1.0.3</version>
	</dependency>

	<dependency>
	    <groupId>net.sf.ehcache</groupId>
	    <artifactId>ehcache</artifactId>
	    <version>2.10.1</version>
	    <type>pom</type>
	</dependency>

整合ehcache
在这里插入图片描述
加入ehcache配置文件ehcache.xml
在这里插入图片描述
在这里插入图片描述

应用场景

  1. 访问多且对实时性要求不高
  2. 查询特别耗时的sql
    实现方法:
  3. 设置刷新频率(如30分钟,60分钟,24小时)

二级缓存局限性

对细粒度级别的缓存不好。(如修改一个商品价格,所有缓存全部清空)

spring和mybatis整合

整合思路

  1. 需要通过单例方式管理sqlSessionFactory。
    spring和mybatis整合生成代理对象,使用sqlSessionFactory创建sqlSession(整合自动)
    持久层的mapper交给spring管理
  2. 整合环境
	<!-- 整合jar包-->
	<!-- mybatis和spring整合jar包 -->
	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis-spring</artifactId>
		<version>1.3.2</version>
	</dependency>
	<!--druid数据库连接池-->
     <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>druid</artifactId>
         <version>1.0.18</version>
     </dependency>
  1. sqlSessionFactory配置
    添加applicationContext.xml配置文件,配置sqlSessionFactory和数据源
    在这里插入图片描述
  2. mapper代理
    在这里插入图片描述
    在这里插入图片描述

    mybatis逆向工程

    逆向工程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值