Spring框架中有封装好的JDBCTemplate可以使用,手动创建太麻烦并且没有参考价值,下面只展示通过注解开发的JDBCTemplate的使用代码案例:
使用步骤:
1.导入相关的坐标
使用的是druid链接池:
1 <dependencies> 2 <dependency> 3 <groupId>mysql</groupId> 4 <artifactId>mysql-connector-java</artifactId> 5 <version>5.1.47</version> 6 </dependency> 7 <dependency> 8 <groupId>com.alibaba</groupId> 9 <artifactId>druid</artifactId> 10 <version>1.1.10</version> 11 </dependency> 12 <dependency> 13 <groupId>org.springframework</groupId> 14 <artifactId>spring-context</artifactId> 15 <version>5.0.5.RELEASE</version> 16 </dependency> 17 <dependency> 18 <groupId>org.springframework</groupId> 19 <artifactId>spring-jdbc</artifactId> 20 <version>5.0.5.RELEASE</version> 21 </dependency> 22 27 <dependency> 28 <groupId>org.aspectj</groupId> 29 <artifactId>aspectjweaver</artifactId> 30 <version>1.8.13</version> 31 </dependency> 32 </dependencies>
2.创建数据库表
自行创建。
3.创建功能实现类
自行创建。
4.配置Spring核心配置文件
<!--扫描包--> <context:component-scan base-package="com.itheima"/> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/ssm_spring"/> <property name="username" value="root"/> <property name="password" value="123"/> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> </bean>
5.创建JDBCTemplate对象并使用
在Dao层实现类中通过注解注入获取对象:
@Autowired private JdbcTemplate template;
调用JDBCTemplate的query或者update方法就可以了。
6.测试
自行测试。
重复度跟Spring(4)--注解开发中比较高,所以不详细写步骤了。
Spring的事务控制:
Spring事务控制分为编程式事务控制和声明式事务控制。
编程式事务控制的意思是通过编码来开启事务控制或关闭事务控制。太过于麻烦,了解就行了。
声明式事务控制是通过配置来开启或关闭事务。声明式事务控制又分为基于xml的声明式事务控制和基于注解的声明式事务控制。
编程式事务控制:
编程式事务控制三大对象:
PlatformTransactionManager
TransactionDefinition
TransactionStatus
PlatformTransactionManager 接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法。
注意:
PlatformTransactionManager 是接口类型,不同的 Dao 层技术则有不同的实现类,例如:Dao 层技术是jdbc 或 mybatis 时:org.springframework.jdbc.datasource.DataSourceTransactionManager
Dao 层技术是hibernate时:org.springframework.orm.hibernate5.HibernateTransactionManager
TransactionDefinition 是事务的定义信息对象,里面有如下方法:
事务隔离级别
设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读。
ISOLATION_DEFAULT
ISOLATION_READ_UNCOMMITTED
ISOLATION_READ_COMMITTED
ISOLATION_REPEATABLE_READ
ISOLATION_SERIALIZABLE
事务传播行为
REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)
MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常
REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
NEVER:以非事务方式运行,如果当前存在事务,抛出异常
NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 REQUIRED 类似的操作
超时时间:默认值是-1,没有超时限制。如果有,以秒为单位进行设置
是否只读:建议查询时设置为只读
TransactionStatus 接口提供的是事务具体的运行状态,方法介绍如下。
以上了解就可以了。
声明式事务控制:
使用步骤:
1.导入相应的jar包
1 <!-- spring的事务管理 --> 2 <dependency> 3 <groupId>org.springframework</groupId> 4 <artifactId>spring-tx</artifactId> 5 <version>5.0.5.RELEASE</version> 6 </dependency> 7 <!-- Aop的切入点表达式解析 --> 8 <dependency> 9 <groupId>org.aspectj</groupId> 10 <artifactId>aspectjweaver</artifactId> 11 <version>1.8.7</version> 12 </dependency>
2.配置事务管理器
1 <!-- 事务管理器(在Spring的核心配置文件中) --> 2 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 3 <property name="dataSource" ref="dataSource"/> 4 </bean>
3.配置事务的切面和织入关系
xml配置:
1 <!--事务切面--> 2 <aop:config> 3 <aop:advisor advice-ref="txAdvice" 4 pointcut="execution(* com.itheima.service.impl.*Impl.*(..))"> 5 </aop:advisor> 6 </aop:config> 7 <!--事务的详细配置--> 8 <tx:advice id="txAdvice" transaction-manager="transactionManager"> 9 <tx:attributes> 10 <tx:method name="save*" propagation="REQUIRED" read-only="false"/> 11 <tx:method name="update*" propagation="REQUIRED" read-only="false"/> 12 <tx:method name="delete*" propagation="REQUIRED" read-only="false"/> 13 <tx:method name="find*" propagation="SUPPORTS" read-only="true"/> 14 <tx:method name="*"/> 15 </tx:attributes> 16 </tx:advice>
注解配置:
在Spring核心配置文件中:
<!--开启Spring声明式事务的注解支持--> <tx:annotation-driven />
在对应的类上加入事务注解:
1 @Transactional //表示当前类的所有方法都加入注解支持 propagation:REQUIRED read-only:false 2 public class AccountServiceImpl implements AccountService { 3 4 @Autowired 5 private AccountDao accountDao; 6 7 public void transfer(String outMan, String inMan, double money) { 8 accountDao.out(outMan, money); 9 int i = 10 / 0; 10 accountDao.in(inMan, money); 11 } 12 }
4.测试