Spring框架总结(三)

Spring框架总结(三)

一、基于aspectj的注解Aop操作

  • 1、创建对象

    <!-- 配置对象 -->
    <bean id="book" class="cn.wyd.aop.Book"></bean>
    <bean id="myBook" class="cn.wyd.aop.MyBook"></bean>
  • 2、在spring核心配置文件中,开启aop操作

    <!-- 开启aop操作 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
  • 3、在增强类上面使用注解完成aop操作

    @Aspect
    public class MyBook {
    
        //在方法上面使用注解完成增强配置
        @Before(value="execution(* cn.wyd.aop.Book.*(..))")
        private void before1() {
            System.out.println("before..........");
        }
    }

二、Spring的jdbcTemplate操作

  • 1、spring框架一站式框架
    • (1)针对javaee三层,每一层都有解决技术
    • (2)在dao层,使用 jdbcTemplate
  • 2、spring对不同的持久化层技术都进行封装
    • jdbcTemplate对jdbc进行封装
      这里写图片描述
  • 3、jdbcTemplate使用和dbutils使用很相似,都数据库进行crud操作
增加
  • 1、导入jdbcTemplate使用的jar包
    这里写图片描述
  • 2、创建对象,设置数据库信息
  • 3、创建jdbcTemplate对象,设置数据源
  • 4、调用jdbcTemplate对象里面的方法实现操作
//1、增加操作
    @Test
    public void add() {
        //1、设置数据库信息
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3305/spring_day03");
        dataSource.setUsername("root");
        dataSource.setPassword("1211124");

        //2、创建jdbcTemplate对象 设置数据源
        JdbcTemplate jt = new JdbcTemplate(dataSource);
        //3、调用jdbc里面的方法实现操作
            //创建你sql语句
        String sql = "insert into user value(NULL,?,?)";
        int row = jt.update(sql, "Lucy","250");
        System.out.println(row);
    }
修改
//2、更新操作
    @Test
    public void update() {
        //设置基本信息
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3305/spring_day03");
        dataSource.setUsername("root");
        dataSource.setPassword("1211124");

        //创建JdbcTemplate对象
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        //调用里面的方法
        //sql语句
        String sql = "update user set passWord=? where userName=?";
        int rows = jdbcTemplate.update(sql, "1314","lucy");
        System.out.println(rows);
    }
删除
    //3、删除操作
    @Test
    public void delete() {
        //设置数据信息
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3305/spring_day03");
        dataSource.setUsername("root");
        dataSource.setPassword("1211124");
        //创建JdbcTemplate对象
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        //调用里面的方法 执行对应的sql语句、
        String sql = "delete from user where userName=?";
        int row = jdbcTemplate.update(sql,"lucy");
        System.out.println(row);
    }
查询
  • 1、 使用jdbcTemplate实现查询操作
    这里写图片描述
  • 2、查询具体实现

    • 2.1、查询返回某一个值(第一个参数是sql语句、第二个参数 返回类型的class

      这里写图片描述

          @Test
          public void selectCount() {
              //1、设置数据库信息
              DriverManagerDataSource dataSource = new DriverManagerDataSource();
              dataSource.setDriverClassName("com.mysql.jdbc.Driver");
              dataSource.setUrl("jdbc:mysql://localhost:3305/spring_day03");
              dataSource.setUsername("root");
              dataSource.setPassword("1211124");
      
              //2、创建jdbcTemplate对象 设置数据源
              JdbcTemplate jt = new JdbcTemplate(dataSource);
              //3、调用jdbc里面的方法实现操作
                  //创建你sql语句
              String sql = "select COUNT(*) from user";
              int row = jt.queryForObject(sql,Integer.class);
              System.out.println(row);
          }
    • 2.2、查询返回对象(第一个参数是sql语句、第二个参数是 RowMapper,是接口,类似于dbutils里面接口、第三个参数是 可变参数)
      这里写图片描述

    • 2.3查询返回list集合(sql语句、RowMapper接口,自己写类实现数据封装、可变参数)
      这里写图片描述

三、Spring配置连接池和dao使用jdbcTemplate

spring配置c3p0连接池
  • 第一步导入jar包
    这里写图片描述
  • 第二步 创建spring配置文件,配置连接池(把代码在配置文件中进行配置)

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <!-- 注入属性 -->
            <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3305/spring_day03"></property>
            <property name="user" value="root"></property>
            <property name="password" value="1211124"></property>
    
     </bean>
dao使用jdbcTemplate
  • 创建service和dao,配置service和dao对象,在service注入dao对象

    <bean id="userService" class="cn.wyd.c3p0.UserService">
            <!-- 注入dao对象 -->
            <property name="userDao" ref="userDao"></property>
     </bean>
     <bean id="userDao" class="cn.wyd.c3p0.UserDao">
    
  • 创建jdbcTemplate对象,把模板对象注入到dao里面

    private JdbcTemplate jdbcTemplate;
        public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
    }
    <bean id="userDao" class="cn.wyd.c3p0.UserDao">
                <property name="jdbcTemplate" ref="jdbcTemplate"></property>
          </bean>
          <!-- 添加JdbcTemplate对象 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  • 在jdbcTemplate对象里面注入dataSource

      <!-- 添加JdbcTemplate对象 -->
          <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
                <!-- 注入dataSource -->
                <property name="dataSource" ref="dataSource"></property>
          </bean>

四、Spring的事务管理

Spring事务管理api
  • 1、spring事务管理两种方式
    • 第一种 编程式事务管理(不用)
    • 第二种 声明式事务管理
      • (1) 基于xml配置文件实现
      • (2) 基于注解实现
  • 2、spring事务管理的api介绍
    这里写图片描述
    • spring针对不同的dao层框架,提供接口不同的实现类
      这里写图片描述
    • 首先 配置事务管理器
搭建转账环境(小王转账1000给小马; 小王少1000,小马多1000)
  • 创建数据库表,添加数据
    这里写图片描述
  • 创建service和dao类,完成注入关系

    <!-- 注入对象类型属性 -->
    <bean id="orderService" class="cn.wyd.service.OrderService">
        <property name="orderDao" ref="orderDao"></property>
    </bean>
    <bean id="orderDao" class="cn.wyd.dao.OrderDao">
        <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    </bean>
    
    <!-- 配置JdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    注意:service层又叫业务逻辑层 ;dao层,单纯对数据库操作层,在dao层不添加业务

    //转账
    //转出
    public void lessSalary() {
        String sql = "update salary set salary=salary-? where name=?";
        jdbcTemplate.update(sql, "1000","小明");
    }
    
    //转入
    public void moreSalary() {
        String sql = "update salary set salary=salary+? where name=?";
        jdbcTemplate.update(sql, "1000","小张");
    }

    调用dao的方法

    //开启转账业务
    public void transationSalary() {
        //转出
        orderDao.lessSalary();
    
        int i = 10/0;
    
        //转入
        orderDao.moreSalary();
    
    }
  • 产生问题:
    • 如果小王少了1000之后,出现异常,小马不会多1000,钱丢失了
  • 解决:
    • 添加事务解决,出现异常进行回滚操作
声明式事务管理(xml配置)
  • 配置文件方式使用aop思想配置

    • 配置事务管理器

      <!-- 1、配置事务管理器 -->
      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <!-- 注入dataSource -->
          <property name="dataSource" ref="dataSource"></property>
      </bean>
    • 配置事务增强

      <!-- 2、配置事务增强 -->
      <tx:advice id="txadvice" transaction-manager="transactionManager">
          <!-- 事务操作 -->
          <tx:attributes>
              <!-- 设置进行事务操作的方法设置匹配规则 transation*:transation表示开头的所有方法-->
              <tx:method name="transation*"/>
          </tx:attributes>
      </tx:advice>
    • 配置切面

      <!-- 配置切面 -->
      <aop:config>
          <!-- 切入点 -->
          <aop:pointcut expression="execution(* cn.wyd.service.OrderService.*(..))" id="pointcut1"/>
          <!-- 配置切面 -->
          <aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"/>
      </aop:config>
声明式事务管理(注解)
  • 第一步 配置事务管理器

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入dataSource -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
  • 第二步 配置事务注解

    <!-- 2、开启事务注解 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>
    • 第三步 在要使用事务的方法所在类上面添加注解
    //开启转账业务
    @Transactional
    public void transationSalary() {
        //转出
        orderDao.lessSalary();
    
        int i = 10/0;
    
        //转入
        orderDao.moreSalary();
    
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值