spring第6天(spring加mybatis)

ctrl+shift+h
image
org.apache.commons.dbcp.BasicDataSource

Mybatis加Spring

一,首先引入连接数据库的配置文件:database.properties

这里是引入database.properties文件.

<context:property-placeholder
		location="database.properties" />
<!--注意:此处的name属性是定死的,只能这么写,value属性需要和配置文件一致,用${值}方式写 -->

二,创建BasicDataSource对象

创建BasicDataSource对象,这是内置对象,class需要ctrl+shift+h然后搜索复制全路径
注意:此处的name属性是定死的,只能这么写,value属性需要和配置文件一致,用${值}方式写,里面的四个属性需要和database.properties配置文件一致

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
	<property name="driverClassName" value="${driver}"></property>
	<property name="url" value="${url}"></property>
	<property name="username" value="${user}"></property>
	<property name="password" value="${password}"></property>
</bean>

三,创建核心对象,通过SqlSessionFactoryBean创建Factory对象

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<!-- 引入数据源,ref需要跟上面配置的dataSource一致 -->
	<property name="dataSource" ref="dataSource"></property>
	<!-- 配置别名 -->
	<!-- <property name="typeAliasesPackage" value="entity"></property> -->
	<!--引入mybatis-config配置文件 -->
	<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>

四,创建SqlSession对象

有一个SqlSessionTemplate可以更好替代mybatis中的SqlSession对象, SqlSessionTemplate实现了SqlSession接口

bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
	<!-- 往SqlSessionTemplate中的SqlSessionFactory属性中注入SqlSessionFactory -->
	<constructor-arg ref="sqlSessionFactory" name="sqlSessionFactory"></constructor-arg>
</bean>

五,定义扫描的基础包

MapperScannerConfigurer:自动扫描指定包下面的XXXMapper接口,并且会自动根据 该XXXMapper的名字的首字母小写,创建实现类的对象,如果XXXMapper接口和XXXMapper.xml 文件是处于同一个包下面的话,映射也不需要写了,会自动找到相关同名的XXXMapper.xml进行映射

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
	<!-- 定义扫描的基础包 -->
	<property name="basePackage" value="dao" />
</bean>

六,扫描service包

扫描service包

<context:component-scan base-package="service" />

七,定义事务管理器:指定要管理的数据库连接

注意:事务:AOP切入事务(mysql引擎必须是innerDB)

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<!-- 具体管理哪个数据库(管理数据源) -->
	<property name="dataSource" ref="dataSource"></property>
</bean>

八,配置事务增强

propagation:事务的传播机制
REQUIRED:默认事务的传播机制
isolation:事务隔离级别
DEFAULT:默认事务隔离级别
注意:以下是针对get/add/del/update开头的方法

<tx:advice id="txAdvice">
	<!-- 具体增强到哪些方法当中 -->
	<tx:attributes>
		<tx:method name="get*" propagation="REQUIRED" isolation="DEFAULT"/>
		<tx:method name="add*" propagation="REQUIRED" isolation="DEFAULT"/>
		<tx:method name="del*" propagation="REQUIRED" isolation="DEFAULT"/>
		<tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT"/>
	</tx:attributes>
</tx:advice>

九,利用AOP将配置的事务增强加入到指定方法中

利用AOP将配置的事务增强加入到指定方法中

<aop:config>
	<!-- 定义切入点 -->
	<aop:pointcut expression="execution(* service..*.*(..))" id="pointcut"/>
	<!-- 引入事务增强 -->
	<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut"/>
</aop:config>

十,事务说明

propagation:事务的传播机制

  • REQUIRED:默认值,表示如果存在一个事务,就支持当前事务,如果没有事务,则开启一个新的事务
  • SUPPORTS:表示如果存在一个事务,就支持当前事务,如果没有事务,就按照没有事务执行
  • NESTED:表示如果存在一个活跃的事务,则创建一个事务作为该事务的嵌套事务运行,不弱不存在事务,则按照REQUIRED的方式执行
  • NEVER:总是以没有事务的方式执行,如果当前存在一个事务,则抛出异常
  • NOT_SUPPORTED:总是以没有事务的方式执行,如果当前存在一个事务则将这个事务挂起(晾在一边),去执行方法
  • REQUIRES:表示总是开启一个新事物,如果有一个事务存在,则将这个事务挂起,再重新新建一个事务运行

isolation:事务隔离级别

  • DEFAULT:默认的隔离级别
  • READ_COMMITTED:提交读(会出现幻读和不可重复读)(会锁定正在读取的行)
  • READ_UNCOMMITTED:未提交读(会出现脏读,不可重复读和幻读)(隔离级别低)
  • REPEATABLE_READ:可重复读(会出现幻读)
  • SERIALIZABLE:串行读(都不会出现)(会锁表)

事务可能会出现的问题

  • 脏读:事务没有提交,提前读,只一个事务处理数据的过程中读取到另一个没有提交事务的数据
  • 不可重复读:两次读取的数据不一致,指两次事务在读取一个数据的中间,当中的一个事务在读取第一次数据的时候,另一个事务对当中的数据进行了修改(或者删除),此时如果该事物继续读取第二遍数据的时候,就会发现两次读取的数据不一致
  • 幻读:当某一个事务在对数据进行修改的时候,另一个事务插入进来对数据进行了修改(或者插入),并且提交了,(该数据会影响第一个事务所修改的数据)而此时第一个事务在修改完数据后,再去查看自己修改的数据的时候,发现和自己更改的数据不一致了(也就是第二个事务修改或者插入的数据影响了第一个事务的数据),感觉就像出现了幻觉一样

十一,需要使用注解创建对象

UserServiceImpl需要使用注解创建对象
image

posted @   不再犹豫27  阅读(9)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示