spring第6天(spring加mybatis)
ctrl+shift+h
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需要使用注解创建对象
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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 中如何实现缓存的预热?