看尚硅谷老师视频写的笔记

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事务管理介绍)

  1. 事务添加到JavaEE三层结构里面Service层(业务逻辑层)
  2. 在Spring进行事务管理操作
  • 有两种方式:
    • 编程式事务管理
    • 声明式事务管理(使用)
  1. 声明式事务管理
    • 基于注解方式
    • 基于xml配置文件形式
  2. 在Spring进行声明式事务管理,底层使用AOP
  3. 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;
    }

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐