JdbcTemplate
1. 概述
JdbcTemplate是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装。spring框架为我们提供了很多的操作模板类。
2. 开发步骤
1. 导入spring-jdbc和spring-tx坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
2. 创建数据库表和实体
3. 创建JdbcTemplate对象
4. 执行数据库操作
3. Spring产生JdbcTemplate模板对象
.配置如下:
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="jdbc" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
4. 常用CRUD操作
1. 增
public void TestSave() {
int row = jdbcTemplate.update("insert into account values(?, ?)", "wangwu", 2323);
System.out.println(row);
}
2. 删
public void TestDelete() {
int row = jdbcTemplate.update("delete from account where name=?", "wangwu");
System.out.println(row);
}
3. 改
public void TestUpdate() {
int row = jdbcTemplate.update("update account set money=? where name=?", 5000, "zhangsan");
System.out.println(row);
}
4.1 查所有行
public void TestQueryAll() {
List<Account> accountList = jdbcTemplate.query("select * from account", new BeanPropertyRowMapper<Account>(Account.class));
for (Account account : accountList) {
System.out.println(account);
}
}
4.2 查单行
public void TestQueryOne() {
Account account = jdbcTemplate.queryForObject("select * from account where name=?", new BeanPropertyRowMapper<Account>(Account.class), "zhangsan");
System.out.println(account);
}
4.3 聚合查询
public void TestQueryCount() {
Long count = jdbcTemplate.queryForObject("select count(*) from account", Long.class);
System.out.println(count);
}
声明式事物控制
1. 编程式事务控制相关对象
1. PlatformTransactionManager
方法 | 说明 |
---|---|
TransactionStatus getTransaction(TransactionDefination defination) | 获取事物的状态信息 |
void commit(TransactionStatus status) | 提交事务 |
void rollback(TransactionStatus status) | 回滚事务 |
2. TransactionDefinition
事物隔离级别
* ISOLATION_DEFAULT
* ISOLATION_READ_UNCOMMITTED
* ISOLATION_READ_COMMITTED
* ISOLATION_REPEATABLE_READ
* ISOLATION_SERIALIZABLE
事物传播行为
* REQUIRED:如果当前没有事物,就新建一个事务,如果已经存在一个事物中,加入到这个事物中。
* SUPPORTS:支持当前事物,如果当前没有事物,就以非事务方式执行
* TIMEOUT:默认值是-1,没有超时限制。如果有,以秒为单位进行设置
* READONLY:建议查询时设置为只读
方法 | 说明 |
---|---|
int getIoslationLevel() | 获得事务的隔离级别 |
int getPropogationBehavior | 获得事物的传播行为 |
int getTimeout | 获得超时时间 |
boolean isReadOnly | 是否只读 |
3. TransactionStatus
方法 | 说明 |
---|---|
boolean hasSavepoint | 是否存储回滚点 |
boolean isCompleted | 事务是否完成 |
boolean isNewTransaction | 是否是新事务 |
boolean isRollbackOnly | 事务是否回滚 |
– | – |
2. 基于XML的声明式事务控制
-
作用
事务管理不侵入开发的组件;在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务。
-
实现:
1. 引入tx命名空间和约束地址 2. 配置事务增强 <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:advice id="txAdvice" transaction-manager="dataSourceTransactionManager"> <tx:attributes> <tx:method name="*"/> </tx:attributes> </tx:advice> 3. 配置事务AOP织入 <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(void cn.spring.tx.service.impl.*.*(..))"/> </aop:config>
-
切点方法的事务参数的配置
<tx:method name=“transfer” isolation=“REPEATABLE_READ” propagation=“REQUIRED” timeout="-1" read-only=“false”>
参数:
* name:切点方法名称
* isolation:事务的隔离级别
* propogation:事务的传播行为
* timeout:超时时间
* read-only:是否只读
3. 基于注解的声明式事务控制
-
开发步骤
1. 编写Dao层代码 2. 编写Service层代码 3. 编写applicationContext.xml配置文件
<!-- 组件扫描-->
<context:component-scan base-package="cn.spring.tx"/>
<!--事物的注解驱动-->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager">
-
深入解析
1. @Transactional标注在需要进行事务控制的类或者方法上修饰,注解可用的属性通XML配置方式 2. @Transactiona注解在使用类上,那么该类中未使用@Transactional注解的方法都是用这一套参数配置 3. @Transactiona使用在方法上,不同的方法可以采用不同的事务参数配置 4. XML配置文件中要配置事务的注解驱动<tx:annotation-driven />