延迟加载,缓存与声明式事务

一.延迟加载(懒加载):就是什么时候用什么时候加载

resultMap(一对一,一对多的关系自带延迟加载,在开发里面最常用的)
作用是:什么时候用什么时候加载

  <!--开启延迟加载-->
			  <setting name="lazyLoadingEnabled" value="true"/>
	  <!--关闭积极加载-->
			  <setting name="aggressiveLazyLoading" value="false"/>
			  <setting name="lazyLoadTriggerMethods" value=""/>(调用toString无效时加载)

查询主表的信息(根据id来进行查询,子查询在resultMap(select="")如果是另一个包引入进来要加上完整的包名和类名,关联的字段)
调用其方法时,会走子查询;

二. 缓存

好处:提高加载的速度,同样的数据,不用一直查询数据库
缺点;可能查询出脏数据;
一级缓存:(一级缓存的作用域是针对于我们的sqlsession(出了sqlsession 就没有一级缓存);默认一级缓存自动开启;
如果是要关闭一级缓存,需要调用其commit()方法;

二级缓存:(是针对于整个mapper(namespace=“com.offcn.dao.UserMapper”))只要在同一个mapper中,缓存都有效果;

配置二级缓存要注意(settings 里面配置两句话(开启缓存配置的按钮,第二个是要把你的对象序列化,
第三个就是要把你的namespace 配置 <cache/> 标签,这样就配置了二级缓存(用二级缓存的时候,一定要sqlsession.commit()(关闭一级缓存,加载二级缓存)),

步骤:在nameSpace 加上 cache;刷新二级缓存的方法:sqlSession.clearCache();禁用:useCache=“false”

自定义缓存

spring的声明式事务
事务:避免脏数据或者错误的数据提交到数据库,一般读取缓存里面的数据,容易产生脏数据
四大原则:原子性,隔离性,持久性,一致性;spring声明式事务也支持这四大原则

三.Spring MyBatis整合

第一步 导入jar包
导入mybatis-spring-1.2.0.jar
第二步 所有的都是由spring来进行管理,写spring的核心配置文件applicationContext.xml
(第一个bean,获取连接数据源
第二个bean
获取sqlsessionFactory (第一个property引入数据源DataSource,第二个property加载MyBatis的核心配置文件)
第三个bean,配置dao层
第一种方式(第一个property是通过这个对象MapperFactoryBean(引入你的接口的类),第二个property是你的sqkSessionFactory))
第二种方式是MapperScannerConfigurer

<!--这是老的配置dao层的方式,这样配置的话,如果有多个mapper时,需要写多条property-->
  <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <!--引入dao层的接口-->
        <property name="mapperInterface" value="com.offcn.mapper.UserMapper"></property>
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
    </bean>
<!--配置DAO层现在都使用这种方式,直接扫描路径下的所有mapper-->
  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
         <property name="basePackage" value="com.offcn.mapper"></property>
     </bean>

四.spring与声明式事务

spring 的声明式事务:
事务:避免脏数据或错误的数据提交到数据库,一般读取缓存里面的数据容易产生脏数据
事务的四大原则:原子性,隔离性,一致性,持久性 声明式事务也支持这四大原则
第一步:引入数据库的配置信息(DataSource)
第二步:配置dao层
第三步:配置事务管理器DataSourceTransactionManager(引入数据源资源,也就是DataSource)
第四步:定义事务通知(一种不用注解,一种使用注解)
第一种:

<tx:advice id="txAdvice"  transaction-manager="transactionManager">
        	<tx:attributes>
      	 <!--tx的一些属性值,name是声明式对哪些方法有效(如只要包含find就有效)-->
          	  <tx:method name="find*" propagation="SUPPORTS" />
          	  <tx:method name="add*" propagation="REQUIRED" />
          	  <tx:method name="del*" propagation="REQUIRED" />
          	  <tx:method name="update*" propagation="REQUIRED" />
           	  <tx:method name="*" propagation="REQUIRED" />
       		</tx:attributes>
  	</tx:advice>
 <!-- 定义切面 -->
    <aop:config>
        <aop:pointcut id="serviceMethod"
                      expression="execution(* com.offcn.service.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" />
    </aop:config>

第二种:使用关键注解

 <!--自动扫描包-->
 	 <context:component-scan base-package="com.offcn.service"/>
 <!--开启注解驱动-->
     <tx:annotation-driven/>

在类前面,也就是你的service的类上@Transactional
再到你的方法上配置具体的 @Transactional(propagation = Propagation.REQUIRED)等同于<tx:method name=“find*” propagation=“REQUIRED”/>

前面写过的注解

dao层注解@Repository service层的@Service @Autowired(按类型) @Qualifired(按名称) @Resource

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
J2Cache 支持使用注解的方式实现声明式缓存。在 Spring Boot 中,你可以使用 `@Cacheable`、`@CachePut`、`@CacheEvict` 等注解来声明缓存。 `@Cacheable`:表示该方法是需要被缓存的,如果缓存中有对应的值,则直接返回缓存中的值,否则执行方法并将返回值放入缓存。 `@CachePut`:表示该方法是需要被缓存的,每次都会执行方法并将返回值放入缓存。 `@CacheEvict`:表示该方法执行后会将缓存中对应的值删除。 下面是一个简单的示例: ```java @Service public class UserService { @Autowired private CacheChannel cacheChannel; @Cacheable(name = "userCache", key = "#userId") public User getUserById(int userId) { // 模拟从数据库中获取用户信息 User user = new User(); user.setId(userId); user.setName("test"); return user; } @CachePut(name = "userCache", key = "#user.id") public User updateUser(User user) { // 更新用户信息 return user; } @CacheEvict(name = "userCache", key = "#userId") public void deleteUserById(int userId) { // 删除用户信息 } } ``` 在上面的示例中,我们使用了 `@Cacheable`、`@CachePut`、`@CacheEvict` 注解来声明缓存。其中,`name` 属性指定了缓存名称,`key` 属性指定了缓存的 key,`#` 符号表示使用 SpEL 表达式,这样可以动态地指定缓存的 key。 在实际应用中,你可以根据自己的需求来配置缓存的名称、有效时间等等。同时,你也可以根据自己的缓存策略来选择缓存的类型,比如使用本地缓存或者使用分布式缓存

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值