Spring数据访问层管理 ▎集成MyBatis ▎AOP ▎事务管理 ▎SpringWeb配置
前言:
在现代软件开发中,数据访问层的管理至关重要。Spring框架凭借其模块化结构和易用性,成为Java EE开发的首选。本文将探讨Spring在数据访问层的管理、MyBatis的集成、面向切面编程(AOP)、事务管理和Spring Web配置。
数据访问层连接应用与数据库,需关注效率和可维护性。我们将讨论如何使用Spring的JdbcTemplate和Spring Data实现数据库操作。MyBatis作为灵活的持久层框架,我们将介绍其在Spring项目中的集成方式。
AOP实现关注点分离,能将日志和安全等横切关注点与业务逻辑解耦,提高代码可重用性。我们还将讲解如何在Spring中管理事务,以确保数据一致性和完整性。
最后,我们将介绍Spring Web模块的配置方法,包括MVC架构和RESTful API的搭建,帮助开发者快速创建高效的Web应用。通过这些探讨,读者将能有效利用Spring技术提升应用开发能力。
Spring数据访问管理
引入 Spring JDBC 模块的依赖配置以及阿里巴巴的数据库连接管理组件 Druid
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
<!-- 阿里数据源 数据库连接管理组件 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
注:我们仍然需要引入sql jar包
Spring管理阿里巴巴数据源
<!--
阿里巴巴数据库连接管理对象,负责生成数据库连接对象,以及提供数据库连接池功能
让Spring管理阿里巴巴数据库连接对象
-->
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
<property name="initialSize" value="10"></property><!--初始化连接数量-->
<property name="maxActive" value="20"></property><!--最大连接数量-->
</bean>
Spring集成MyBatis
第一步:导入jar包
<!-- Spring和MyBatis结合-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
注:也需要导入MyBatis jar包
配置 sqlSessionFactory
<!--spring管理生成SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="druidDataSource"></property> <!-- 注入数据源-->
<property name="configLocation" value="classpath:mybatis.xml"></property> <!-- MyBatis配置文件-->
<property name="mapperLocations" value="classpath:mappers/*Mapper.xml"> <!-- 扫描mapper映射文件-->
</property>
</bean>
配置dao包下的所有代理对象
<!-- 生成dao包下所有的代理对象-->
<bean id="mapperFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.kid.ssm.dao"></property> <!--接口所在的包-->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory">
</property>
</bean>
AOP
AOP 为 Aspect Oriented Programming 的缩写 ,意为:面相切面编程
面相切面编程:面相切面编程是对面向对象编程的补充延续
面向切面编程思想:是将程序中非业务代码(提交事物,打印日志,权限验证,统一异常处理)提取分离出来,然后通过代理对象,然后在调用业务代码时,通过一个代理对象帮助我们调用这些提取出来的非业务代码,这样在业务代码中就不用显示调用非业务代码,做到了业务代码和非业务代码的分离,降低了耦合度
好处:模块之间的耦合度降低
原理:动态代理模式,给业务代码生成代理对象
AOP的基本概念
- 连接点:类中可以被增强(加功能)的方法
- 切入点:类中实际被增强的方法
- 通知:通知是指一个切面在特定的连接点要做的事情(增强的功能).通知分为方法执行前通知,方法执行后通知,环绕通知等
- 目标:代理的目标类(连接点和切入点所在的类)
- 代理:向目标对象 应用通知时 创建的代理对象
SpringAOP实现
第一步:引入jar包
<!-- Spring AOP -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
第二步:代码实现(通知实现)
常用通知类型
- @Before 前置通知 在业务代码之前执行
- @After 后置通知 在业务代码之后执行(即使业务代码出现异常也执行)
- @AfterReturnning 返回通知 在业务代码执行完后执行(业务代码出现异常不执行)
- @AfterThrowing 异常通知 在业务代码出现异常执行
- @Around 环绕通知 方法执行前后都有通知
代码演示:
("execution(* com.kid.springpro.Dao.AdminDao.*.*(..))") --->执行通知的方法
@Before]
@Before("execution(* com.kid.springpro.Dao.AdminDao.*.*(..))")
public void printLog() {
System.out.println("打印日志");
}
@AfterThrowing
@AfterThrowing(value = "execution(* com.kid.springpro.Dao.AdminDao.*.*(..))",throwing = "throwable")
public void exception(Throwable throwable){
System.out.println("系统忙" +throwable.getMessage());
throwable.printStackTrace();
}
注:前四个通知都类似
@Around :的执行顺序主要更具自己的定义编写,如下方代码
@Around(value = "execution(* com.kid.springpro.Dao.AdminDao.*(..))")
public void around(ProceedingJoinPoint joinPoint){
try {
System.out.println("前置通知");
joinPoint.proceed();
System.out.println("返回通知");
} catch (Throwable throwable) {
throwable.printStackTrace();
System.out.println("异常通知");
}
System.out.println("后置通知");
}
joinPoint.proceed();----->业务代码
代码解释
Spring事务管理
事务管理:本质上是数据库提供的一种管理机制
数据库事务管理 是对一次数据库操作过程中,执行的多条语句进行的管理,确保这一次操作过程中的多条sql要么都执行成功,要么都不执行,从而保证数据的一致性
转账: sql1 A-500 Sql2 B+500 确保转账数据的一致
Spring事务管理是spring框架对事物提交这以功能进行封装,程序员在业务开发中不需要显示的提交事务
Spring事物管理
1.编程式事务管理
在项目中很少使用,这种方式我们需要在代码中需要提交事务或回滚 事务时自己写代码实现
2.声明式事务管理
声明事务底层使用AOP思想,可以为方法添加事务功能,他的控制是方法级别的
事务管理的配置
配置spring管理器
<!-- 配置 spring 事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="druidDataSource"></property>
</bean>
id为数据库管理的id,即下方id
<!--
阿里巴巴数据库连接管理对象,负责生成数据库连接对象,以及提供数据库连接池功能
让Spring管理阿里巴巴数据库连接对象
-->
<bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
<property name="initialSize" value="10"></property><!--初始化连接数量-->
<property name="maxActive" value="20"></property><!--最大连接数量-->
</bean>
开启注解事务管理
<!-- 开启注解事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
开启事务管理:在类或方法上使用@Transactional 标签即可
声明事务失败的场景:
- 用在了非public的方法上(权限不够)
- 方法中的异常被捕获,会认为方法没有出现异常,事务还会提交
- 方法中出现了编译器异常,还是会提交事务
- 数据库引擎不支持事务 mysql中只有innodb支持事务
解决失败场景的第三:
@Transactional(rollbackFor = Exception.class)
SpringWeb配置
导入jar包
<!--Spring web-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
在web.xml文件中位置spring核心分发器
<servlet>
<servlet-name>application</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<!-- 请求映射 -->
<servlet-mapping>
<servlet-name>application</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
在spring.xml文件中开启SpringWeb注解
<mvc:annotation-driven></mvc:annotation-driven>
感谢大家的观看,本次分享就到这里。希望我的内容能够对您有所帮助。创作不易,欢迎大家多多支持,您的每一个点赞都是我持续更新的最大动力!如有不同意见,欢迎在评论区积极讨论,让我们一起学习、共同进步!如果有相关问题,也可以私信我,我会认真查看每一条留言。期待下次再见!
希望路飞的笑容可以治愈努力路途中的你我!
博主vx:Dreamkid05 --->欢迎大家和博主讨论问题