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 {}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章