Spring深入研究(三)

基于aspectJ的注解aop操作

使用注解方式实现aop操作

第一步 创建对象

<!-- 创建对象 -->
  <bean id="car" class="com.jia.aop.Car"></bean>
  <bean id="myCar" class="com.jia.aop.MyCar"></bean>

第二步 在spring核心配置文件中,开启aop操作

  <!-- 开启aop操作 -->
  <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

第三步 在增强类上面使用注解完成aop操作


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

jdbcTemplate实现crud操作(添加 修改和删除操作)

1 Spring框架一站式框架

  • (1) 针对javaee三层,每一层都有解决技术
  • (2) 在dao层,使用JDBCTemplate

2 Spring对不同的持久化层技术都进行封装

​ JDBC———->JdbcTemplate

​ Hibernate5.0——————>HibernateTemplate

​ MyBatis——————–>SqlMapClientTemplate

​ JPA—————————–>JpaTemplate

3 jdbcTemplate 使用和dbutils使用很相似,都对数据库进行crud操作

使用JdbcTemplate流程

  • 导入jdbcTemplate使用的jar包
    • spring-jdbc.RELEASE.jar
    • spring-tx.RELEASE.jar
    • 数据库驱动
  • 创建对象,设置数据库信息
  • 创建jdbcTemplate对象,设置数据源
  • 调用jdbcTemplate对象里面的方法实现操作

增加

/**
   * 添加操作
   */
  @Test
  public void add() {
      // 创建对象,设置数据库信息
      DriverManagerDataSource dataSource=new DriverManagerDataSource();
      dataSource.setDriverClassName("com.mysql.jdbc.Driver");
      dataSource.setUrl("jdbc:mysql:///tt_1");
      dataSource.setUsername("root");
      dataSource.setPassword("root");
      // 创建jdbcTemplate对象,设置数据源
      JdbcTemplate template=new JdbcTemplate(dataSource);
      // 调用jdbcTemplate对象里面的方法实现操作
      //创建sql语句
      String sql="insert into a values(?)";
      int rows = template.update(sql,"aldrich");
      System.out.println(rows);
  }

jdbcTemplate实现 CRUD 操作

查询实现

第一种 查询返回某一个值
public <T> T queryForObject(String sql, Class<T> requiredType)
    • (1) 第一个参数是sql语句
    • (2) 第二个参数 返回类型的class
  /**
   * JdbcTemplate实现查询操作 查询返回某一个值
   */
  @Test
  public void testCount() {
      // 创建对象,设置数据库信息
      DriverManagerDataSource dataSource=new DriverManagerDataSource();
      dataSource.setDriverClassName("com.mysql.jdbc.Driver");
      dataSource.setUrl("jdbc:mysql:///customer1");
      dataSource.setUsername("root");
      dataSource.setPassword("root");
      // 创建jdbcTemplate对象,设置数据源
      JdbcTemplate template=new JdbcTemplate(dataSource);
      // 调用jdbcTemplate对象里面的方法实现操作
      //创建sql语句
      String sql="select count(*) from customer";
      int count = template.queryForObject(sql, Integer.class);
      System.out.println(count);
  }
/**
   * JDBC 实现查询操作 查询返回某一个值
   */
  @Test
  public void testJDBC() {
      Connection conn = null;
      PreparedStatement psmt = null;
      ResultSet rs = null;
      try {
          // 加载驱动
          Class.forName("com.mysql.jdbc.Driver");
          // 创建连接
          conn = DriverManager.getConnection("jdbc:mysql:///customer1", "root", "root");
          // 创建SQL语句
          String sql = "select * from customer where name=?";
          // 预编译sql
          psmt = conn.prepareStatement(sql);
          // 设置参数值
          psmt.setString(1, "aldrich");
          // 执行SQL
          rs = psmt.executeQuery();
          // 遍历结果集
          while (rs.next()) {
              // 得到返回结果
              String id = rs.getString("id");
              String name = rs.getString("name");
              String gender = rs.getString("gender");
              String type = rs.getString("type");
              Customer customer = new Customer();
              customer.setId(id);
              customer.setName(name);
              customer.setGender(gender);
              customer.setType(type);
              System.out.println(customer);
          }
      } catch (Exception e) {
          e.printStackTrace();
      } finally {
          try {
              rs.close();
              psmt.close();
              conn.close();
          } catch (SQLException e) {
              e.printStackTrace();
          }
      }

  }
第二种 查询返回对象
public <T> T queryForObject(String sql, RowMapper<T> rowMapper, Object... args)
    • 第一个参数是sql语句
    • 第二个参数是RowMapper是接口,类似于dbutils里面接口
    • 第三个参数是 可变参数
/**
 * org.springframework.jdbc.core.RowMapper<>实现类
 * @author hasee
 *
 */
class MyRowMapper implements RowMapper<Customer> {

  @Override
  public Customer mapRow(ResultSet rs, int rowNum) throws SQLException {
      // 从结果集中得到数据
      String id = rs.getString("id");
      String name = rs.getString("name");
      String gender = rs.getString("gender");
      String type = rs.getString("type");
      // 把得到的数据封装到对象里面
      Customer customer = new Customer();
      customer.setId(id);
      customer.setName(name);
      customer.setGender(gender);
      customer.setType(type);
      return customer;
  }
}
第三种 查询返回List
public <T> List<T> query(String sql, RowMapper<T> rowMapper, Object... args)
    • sql语句
    • RowMapper接口,自己写类实现数据封装
    • 可变参数
      // 创建对象,设置数据库信息
      DriverManagerDataSource dataSource = new DriverManagerDataSource();
      dataSource.setDriverClassName("com.mysql.jdbc.Driver");
      dataSource.setUrl("jdbc:mysql:///customer1");
      dataSource.setUsername("root");
      dataSource.setPassword("root");
      // 创建jdbcTemplate对象,设置数据源
      JdbcTemplate template = new JdbcTemplate(dataSource);
      // 调用jdbcTemplate对象里面的方法实现操作
      // 创建sql语句
      String sql = "select * from customer";
      List<Customer> query = template.query(sql, new MyRowMapper());
      System.out.println(query.toString());

Spring配置c3p0连接池

Spring配置连接池和dao使用jdbcTemplate

Spring配置c3p0连接池
  • 第一步 导入jar包
    • c3p0.jar
    • mchange-commons-java.jar
  • 第二步 创建Spring配置文件,配置连接池
<!-- 配置c3p0连接池 -->
  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
      <!-- 注入属性值 -->
      <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
      <property name="jdbcUrl" value="jdbc:mysql:///customer1"></property>
      <property name="user" value="root"></property>
      <property name="password" value="root"></property>
  </bean>
dao使用jdbcTemplate
  • 创建service和dao,配置service和dao对象,在service注入dao对象
  • 创建jdbcTemplate对象,把模板对象注入到dao里面
  • 在jdbcTemplate对象里面注入
public class UserService {
  private UserDao userDao;

  public void setUserDao(UserDao userDao) {
      this.userDao = userDao;
  }
  public void add(){
      userDao.add();
  }
}
public class UserDao {
  /**
   * TODO 得到JdbcTemplate对象
   */
  private JdbcTemplate jdbcTemplate;

  public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
      this.jdbcTemplate = jdbcTemplate;
  }
  /**
   * 添加操作
   */
  public void add() {
      // TODO Auto-generated method stub
  }
}
  <!-- 创建service对象,在service注入dao对象 -->
  <bean id="userService" class="com.jia.c3p0.UserService">
      <!-- 注入dao对象 -->
      <property name="userDao" ref="userDao"></property>
  </bean>
  <!-- 创建dao对象 -->
  <bean id="userDao" class="com.jia.c3p0.UserDao">
      <!-- 注入jdbcTemplate对象 -->
      <property name="jdbcTemplate" ref="jdbcTemplate"></property>
  </bean>
  <!-- 创建jdbcTemplate对象 -->
  <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
      <!-- 把dataSource传递到模板对象里面 -->
      <property name="dataSource" ref="dataSource"></property>
  </bean>

Spring的事务Api

事务概念
  • 什么是事务
    • 事务是对数据库操作的最基本单元,指一组操作,要么都成功,有一个失败都失败.
  • 事务特性
    • 原子性
    • 一致性
    • 隔离性: 多个事务之间不会产生影响
    • 持久性
  • 不考虑隔离性产生读问题
    • 脏读
    • 不可重复读
    • 虚读
    • 幻读
  • 解决读问题
    • 设置隔离级别
Spring事务管理api

1 Spring事务管理两种方式

  • 第一种 编程式事务管理
  • 第二种 声明式事务管理
    • 基于xml配置文件实现
    • 基于注解实现

2 Spring事务管理的API介绍

  • PlatformTransactionManager 事务管理器
  • TransactionDefinition 事务定义信息(隔离 传播 超时 只读)
  • TransactionStatus 事务具体运行状态

Spring的事务管理

转账环境搭建

1 创建数据库,添加数据

create database transfer_spring default character set utf8 collate utf8_general_ci; 

create table account (
     id int(11) not null primary key auto_increment,
     username varchar(100),
     salary int default '0');

2 创建service和dao类,完成注入关系

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

配置文件实现

声明式事务管理(XML配置)

配置文件方式使用aop 思想配置

  • 第一步 配置事务管理器
<!-- 第一步 配置事务管理器 -->
    <bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入dataSource -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
  • 第二步 配置事务增强
<!-- 第二步 配置事务增强 -->
    <tx:advice id="txadvice" transaction-manager="transactionManager">
        <!-- 做事务操作 -->
            <tx:attributes>
                <!-- 设置进行事务操作的方法匹配规则 -->
                <tx:method name="account*" propagation="REQUIRED"/>
            </tx:attributes>
    </tx:advice>
  • 第三步 配置切面
<!-- 第三步 配置切面 -->
    <aop:config>
        <!-- 切入点 -->
        <aop:pointcut expression="execution(* com.jia.service.OrdersService.*(..))" 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>
  • 第二步 配置事务注解
<!-- 第二步 开启事务注解 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>    
  • 第三步 在要使用事务的方法所在类上面添加注解
@Transactional
public class OrdersService {}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值