第1章 Spring中的JdbcTemplate[会用]
1.1 JdbcTemplate概述
最主要jdbcTemplate自带ThreadLocal,每次获取链接,都是当前线程
它是spring框架中提供的一个对象,是对原始Jdbc API对象的简单封装。spring框架为我们提供了很多的操作模板类。
操作关系型数据的:JdbcTemplateHibernateTemplate
操作nosql数据库的:RedisTemplate
操作消息队列的:JmsTemplate
我们今天的主角在spring-jdbc-5.0.2.RELEASE.jar中,我们在导包的时候,除了要导入这个jar包外,还需要导入一个spring-tx-5.0.2.RELEASE.jar
(它是和事务相关的)。
1.2 使用JdbcTemplate增删改查
创建maven工程并导入坐标
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<!--
引入了 spring框架对于 jdbc基本的支持 也就是 jdbcTemplate
-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<version>5.1.8.RELEASE</version>
<optional>true</optional>
</dependency>
beans.xml
dao层
第2章 Spring中的事务控制
2.1 Spring事务控制我们要明确的
第一:JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计业务层的事务处理解决方案。
第二:spring框架为我们提供了一组事务控制的接口。具体在后面的第二小节介绍。这组接口是在spring-tx-5.0.2.RELEASE.jar中。
第三:spring的事务控制都是基于AOP的,它既可以使用编程的方式实现,也可以使用配置的方式实现。我们学习的重点是使用配置的方式实现。
2.2 Spring中事务控制的API介绍
PlatformTransactionManager
此接口是spring的事务管理器,它里面提供了我们常用的操作事务的方法,如下图:
TransactionDefinition
它是事务的定义信息对象,里面有如下方法:
事务的隔离级别
事务的传播行为(了解)
当事务里面嵌套事务的时候,有以下选项
REQUIRED
你没有我就新建一个事务,你有的话我就跟随第一个事务
SUPPORTS
父类有事务,子类就有事务,父类没有,子类也没有
MANDATORY
父类没有事务就会报错
REQUERS_NEW
两个事务,两个链接
嵌套事务
加入父类事务,子类设置一个保留点,哪里出异常,回滚到保留点,下面模拟
以此类推,非事务方式为空
超时时间
是否是只读事务
建议查询时设置为只读。
TransactionStatus
2.3基于XML的声明式事务控制(配置方式)重点
创建Spring的配置文件并导入约束
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--配置一个事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入dataSource-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--
advice:通知 加强的意思 需要你把transactionManager对象给他
由它使用transactionManager完成事务 环绕加强
事务的配置
-->
<tx:advice id="transactionTX" transaction-manager="transactionManager">
<!--
细化的控制
name 感兴趣的方法名 支持通配符
read-only:是否是只读事务
isolation:隔离级别 你可以针对某个方法修改需要的隔离级别 但是 支持你要用 默认就挺好
timeout:超时时间 默认-1 执行到啥时候就是啥时候 一般没人改
rollback-for:写个类名 异常的类名 只有遇到该类型才会回滚 默认就是个异常回滚
no-rollback-for:写个类名 遇到异常不回滚 没人改
propagation:指定事务的传播行为。
-->
<tx:attributes>
<tx:method name="*" read-only="false"></tx:method>
<tx:method name="find*" read-only="true" isolation="DEFAULT" timeout="-1" rollback-for=""/>
</tx:attributes>
</tx:advice>
<!--配置aop-->
<aop:config>
<!--配置切入点表达式-->
<aop:advisor advice-ref="transactionTX" pointcut="execution(* top.baivip.service..*.*(..))"></aop:advisor>
</aop:config>
2.4 半xml半注解事务控制
核心xml语句
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--
开启注解扫描
-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
该注解的属性和xml中的属性含义一致。该注解可以出现在接口上,类上和方法上。出现接口上,表示该接口的所有实现类都有事务支持。
出现在类上,表示类中所有方法有事务支持出现在方法上,表示方法有事务支持。
以上三个位置的优先级:方法>类>接口
true只读,false加事务
/**
* 等同于你 配置切面编程
*
*/
@Transactional(readOnly = true)
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Override
@Transactional(readOnly = false)
public void save(Account account) {
accountDao.save(account);
}
@Override
public Account findById(int id) {
return accountDao.findById(id);
}
@Override
@Transactional(readOnly = false)
public void update(Account account) {
accountDao.update(account);
}
@Override
@Transactional(readOnly = false)
public void delete(int id) {
accountDao.delete(id);
}
@Override
@Transactional(readOnly = true)
public List<Account> findAll() {
return accountDao.findAll();
}
@Override
public List<Account> findAllWithAlias() {
return accountDao.findAllWithAlias();
}
@Override
@Transactional
public void transfer(String sname, String rname, double money) {
//一个加 一个减去
accountDao.update(sname,0-money);
int i=5/0;
accountDao.update(rname,money);
}
}
2.5 纯注解事务控制
@Configuration
@ComponentScan("com.itheima")
@PropertySource("classpath:db.properties")
@EnableTransactionManagement
//等同于 该配置<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
public class Config {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource getDataSource(){
HikariDataSource hikariDataSource = new HikariDataSource();
hikariDataSource.setDriverClassName(driver);
hikariDataSource.setJdbcUrl(url);
hikariDataSource.setUsername(username);
hikariDataSource.setPassword(password);
return hikariDataSource;
}
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource){
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}
第三章 spring5新特性
jdk版本要求
spring5.0在2017年9月发布了它的GA(通用)版本。该版本是基于jdk8编写的,所以jdk8以下版本将无法使用。同时,可以兼容jdk9版本。
tomcat版本要求8.5及以上。注:
我们使用jdk8构建工程,可以降版编译。但是不能使用jdk8以下版本构建工程。
由于jdk和tomcat版本的更新,我们的IDE也需要同时更新。(目前使用的eclipse 4.7.2)
利用jdk8版本更新的内容