JdbcTemplate 和 事务操作
JdbcTemplate(概念和准备)设么是JdbcTemplateSpring框架里面对JDBC进行封装,使用JdbcTemplate 方便实现对数据库操作准备工作引入相关的jar包在spring配置文件配置数据库连接池配置JdbcTemplate对象,注入DataSource创建service类,创建dao类,在dao注入jdbcTemplatejdbcTemplate操作数据库(添加)对应数
看尚硅谷老师视频写的笔记
JdbcTemplate(概念和准备)
-
设么是JdbcTemplate
- Spring框架里面对JDBC进行封装,使用JdbcTemplate 方便实现对数据库操作
-
准备工作
- 引入相关的jar包
- 在spring配置文件配置数据库连接池
- 配置JdbcTemplate对象,注入DataSource
- 创建service类,创建dao类,在dao注入jdbcTemplate
-
jdbcTemplate操作数据库(添加)
- 对应数据库创建实体类
- 编写service和dao 在dao数据库添加操作
jdbcTemplate操作数据库(查询返回某个值)
@Override
public int selectCount() {
String sql="SELECT COUNT(*) FROM t_book";
Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
return count;
}
jdbcTemplate操作数据库(查询返回对象)
- 场景:查询图书详情
- 用jdbcTemplate实现查询返回对象
@Override
public Book findBookInfo(String id) {
String sql="select * from t_book where user_id=?";
//调用方法实现
Book book = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Book>(Book.class), id);
return book;
}
jdbcTemplate操作数据库(查询返回集合)
- 场景:查询图书列表分页…
- 调用JdbcTemplate方法实现查询返回集合
//查询返回集合
@Override
public List<Book> findAllBook() {
String sql="select * from t_book";
//调用方法
List<Book> booklist = jdbcTemplate.query(sql, new BeanPropertyRowMapper<Book>(Book.class));
return booklist;
}
jdbcTemplate操作数据库(批量操作)
- 批量操作:操作表里面多条记录
- jdbcTemplate实现批量添加操作
- jdbcTemplate实现批量删除操作
事务概念
- 什么是事务
- 事务是数据库操作的最基本单元,逻辑上的一组操作,要么都成功,如果有一个失败所有操作都失败.
- 典型场景:银行转账;
- 事务四个特性 (ACID):
- 原子性
- 一致性
- 隔离性
- 持久性
事务操作(搭建事物操作环境)
1.创建数据库,添加记录
2.创建service,搭建dao,完成对象创建和注入关系
* 在service 注入dao, 在dao注入jdbcTemplate,在JdbcTemplate注入DataSource
* 在dao创建两个方法,多钱和烧钱的方法,在service创建方法(转账)
模拟异常:
//转账的方法
public void accountMoney(){
//lucy少100
userDao.reduceMoney();
//模拟异常
int i=5/0;
//mary多100
userDao.addMoney();
}
- 如何解决? 用事务解决
//转账的方法
public void accountMoney(){
try{
//第一步开启事务操作
//第二步,进行业务操作
//lucy少100
userDao.reduceMoney();
//模拟异常
int i=5/0;
//mary多100
userDao.addMoney();
//第三步,没有发生异常,提交事务
}catch (Exception ex){
//第四步 出现异常,事务回滚
}
}
事务操作(Spring事务管理介绍)
- 事务添加到JavaEE三层结构里面Service层(业务逻辑层)
- 在Spring进行事务管理操作
- 有两种方式:
- 编程式事务管理
- 声明式事务管理(使用)
- 声明式事务管理
- 基于注解方式
- 基于xml配置文件形式
- 在Spring进行声明式事务管理,底层使用AOP
- Spring事务管理API
- 提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类
事务操作(注解声明式事务管理)
1.在spring配置文件配置事务管理器
<!--创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>
2.在spring配置文件,开始事务注解
- 在spring配置文件引入名称空间tx
- 开启事务的注解
3.在service类上面(或者获取service类里面方法上面)添加事务注解 - @Transactional 这个注解添加到类上面,也可以添加方法上面
- 如果把这个注解添加到类上面,这个类里面所有的方法都添加事务
- 如果把这个注解添加到方法上面,为这个方法添加了事务
事务操作(声明式事务管理参数配置)
1.在service类上面添加注解@Transactional 在这个注解里面可以配置事务相关参数
-
propagation: 事务传播行为
多事务方法直接进行调用,这个过程中事物是如何进行管理的
事务方法:对数据库表数据进行变化的操作
-
ioslation:事务隔离级别
* 事物有特性称为隔离性,多事务操作之间不会产生影响
* 不考虑隔离性会产生一系列问题
* 有三个问题: 脏读、不可重复读、虚读
脏读:一个未提交的事务读取到另一个未提交事务的数据
假如事物A也回滚,name起始数据就变成60000了
不可重复读:一个未提交事务读取到另一提交事务修改数据
虚读:一个未提交事务读取到另一提交事务添加的数据
通过设置事务的隔离性,解决读问题
- timeout:超时时间
- 事务需要在一定时间内进行提交,如果不提交进行回滚
- 默认值是-1,不超时 设置时间以秒为单位
- readOnly:是否只读
- 读:查询操作,写:添加修改删除操作
- 默认值是false,表示可以查询,可以添加修改删除操作
- 设置readOnly值是true,设置成true之后,只能查询
- rollbackFor:回滚
- 设置出现哪些异常进行事务回滚
- noRollbackFor:不回滚
- 设置出现哪些异常不进行事务回滚
事务操作(XML声明式)
1.在spring配置文件中进行配置
第一步配置事务管理器
第二步配置通知
第三部配置切入点和切面
<!--1.创建事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置通知-->
<tx:advice id="txadvice">
<!--配置事务参数-->
<tx:attributes>
<!--指定哪种规则的方法上添加事务-->
<tx:method name="accountMoney" propagation="REQUIRED"/>
<!-- <tx:method name="account*"/>-->
</tx:attributes>
</tx:advice>
<!-- 配置切入点和切面-->
<aop:config>
<!-- 配置切入点-->
<aop:pointcut id="pt" expression="execution(* com.spring5.service.UserService.*(..))"/>
<!-- 配置切面-->
<aop:advisor advice-ref="txadvice" pointcut-ref="pt"></aop:advisor>
</aop:config>
事务操作(完全注解声明式事务管理)
1.创建配置类,使用配置类替代xml配置文件
@Configuration //配置类
@ComponentScan(basePackages = "com.spring5")
@EnableTransactionManagement
public class TxConfig {
//创建数据库连接池
@Bean
public DruidDataSource getDruidDataSource(){
DruidDataSource dataSource=new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///user_db");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
//JdbcTemplate对象
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource){
//到ioc容器中根据类型找到dataSource
JdbcTemplate jdbcTemplate=new JdbcTemplate();
//注入dataSource
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
//创建事务管理器
@Bean
public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager transactionManager=new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
更多推荐
所有评论(0)