3. spring 組建掃描+Dao

1.組件掃描

      簡化了原來xml 的配置

  <context:component-scan base-package="com.xdl"></context:component-scan>

  1.1  和簡化配置文件相關的標註
  @PostConstruct   構造方法之後進行初始化
  @PreDestroy      銷燬之前指定銷燬方法
  @Scope           指定對象作用域
  @Value           注入簡單類型的值 (現在可以注入對象類型 但是結合EL表達式)
 
  1.2 和組件裝配有關的標註
  @Autowired   可以用在成員變量   set方法   構造方法上 (依然是要參數個數匹配)
                 優先按照類型進行組件的查找  如果找不到則使用名字進行查找
                 配合 @Qualifier 可以直接指定名字進行查找   但是這樣就不能用在構造方法上了
                  
  @Resource  可以用在成員變量  set方法上    不能用在構造器上 但是這基本上就夠用了
                這個標註不是spring 框架中 而是java的基本標註    
               優先按照名字 去查找  如果沒有找到則啓用類型查找                      
 
 2.Spring DAO
   2.1  什麼是 DAO
    Data  Access  Object  數據訪問對象   以面向對象的方式訪問數據庫
   2.2 Spring DAO 做了哪些工作?
         對JDBC 做了封裝 和 簡化  使用Spring 提供的對象和api 這樣可以不用考慮連接 執行環境的獲取 以及資源的釋放
         提供了AOP模式的事務處理  讓業務代碼 和 事務管理進行分離
         把JDBC的異常處理進行封裝  由原來的檢查異常(必須處理)  變成成了一個 DataAccessException 這個異常
             繼承RuntimeException  是運行時異常不用強制處理         
   2.3 JdbcTemplate
    SpringDAO 把最核心的封裝 交給了    JdbcTemplate   這個對象來負責 驅動加載  連接獲取  執行環境獲取 以及
    資源的釋放。 使用 JdbcTemplate 有兩種手段  第一種使用 繼承JdbcDaoSupport類的方式 這種方式 大家無需注入

   JdbcTemplate  從JdbcDaoSupport 直接獲取使用即可。 第二種方式 我們自己手工注入JdbcTemplate。

  <util:properties  id="dbparam2">
            <prop key="driverClassName" >oracle.jdbc.OracleDriver</prop>
            <prop key="url">jdbc:oracle:thin:@127.0.0.1:1521:xe</prop>
            <prop key="username">system</prop>
            <prop key="password">123456</prop>
        </util:properties>
        <!--  定義一個數據源對象  -->
      <bean  id="dataSource"  class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName"  value="#{dbparam2.driverClassName}"></property>
            <property name="url" value="#{dbparam2.url}"></property>
            <property name="username" value="#{dbparam2.username}"></property>
            <property name="password" value="#{dbparam2.password}"></property>
      </bean>


   2.4 使用繼承  JdbcDaoSupport 類的方式 來使用 JdbcTemplate 查詢一張表的數據量
      2.4.1 先建立一張表  和序列   插入幾條數據
      drop    table  xdl_bank_account cascade constraints;
      create  table  xdl_bank_account(
          id   number  constraint  xdl_bank_account_id_pk  primary key,
          card_no    varchar2(30),
          card_name  varchar2(30),
          card_password  varchar2(30),
          card_money   number
      );
      drop   sequence  xdl_bank_account_id_seq;
      create sequence  xdl_bank_account_id_seq;
      insert  into  xdl_bank_account values(xdl_bank_account_id_seq.nextval,
        '110001','mengge','123456',12345678);
      insert  into  xdl_bank_account values(xdl_bank_account_id_seq.nextval,
        '110002','liangge','123456',10005678);
      insert  into  xdl_bank_account values(xdl_bank_account_id_seq.nextval,
        '110002','xiaoma','123456',2234567);
      commit;  
      
      2.4.2 建立一個項目  拷貝 ioc  aop  和  dao  以及連接數據庫的連接池包 和 數據庫驅動包
      2.4.3 寫一個 dao 接口  定義一個方法 可以用來獲取表中的數據量
      2.4.4 寫一個dao的實現類 繼承  JdbcDaoSupport  並實現 dao 接口
                        注入一個 dataSouce 對象   dataSource對象定義在配置文件中
                       使用JdbcDaoSupport 中對應的模板對象 完成具體的查詢工作
                       思考如何把dao的實現類 加載到spring 容器
      2.4.5 從容器中 獲取 dao 對象 調用查詢表中數據量的方法進行測試
                                      
    2.5 JdbcTemplate 提供的核心方法
       queryForInt(sql)
       queryForObject(sql,對象類型或者映射器類型)  查詢一個整數 或者一個對象  
       query   查詢多條數據
       update  實現  增  刪  改

       execute  可以執行任何語句 一般不使用

  @Repository("bankDao")
public class BankAccountDAOOracleImp extends JdbcDaoSupport implements BankAccountDAO {
    // 注入一個 dataSource 對象
    // private  DataSource  dataSource;
    @Resource
    public void setMyDataSource(DataSource dataSource) {
        //this.dataSource = dataSource;
        // 傳給父類使用
        super.setDataSource(dataSource);
    }
    @Override
    public int getBankAccountCount() {
        // 使用父類中對應的模板 完成查詢
        /* return  super.getJdbcTemplate().
                queryForInt("select count(*) from xdl_bank_account"); */
        String  sql = "select count(*) from xdl_bank_account";
        return  super.getJdbcTemplate().queryForObject(sql, Integer.class);
    }
    @Override
    public BankAccount getBankAccountByNameAndPassword
        (String card_name, String card_password) {
        String sql = "select * from xdl_bank_account where card_name = ? and card_password = ?";
        // new BankAccountMapper() 說明數據和對象之間的翻譯規則
        return super.getJdbcTemplate().queryForObject(sql, new BankAccountMapper(),
                card_name,card_password);
    }
    @Override
    public List<BankAccount> getBankAccountList() {
        String sql = "select * from xdl_bank_account";
        return super.getJdbcTemplate().query(sql, new BankAccountMapper());
    }
    @Override
    public int insertBankAccount(BankAccount account) {
        String sql = "insert into xdl_bank_account values(xdl_bank_account_id_seq.nextval,"
                + "?,?,?,?)";
        return super.getJdbcTemplate().update(sql, account.getCard_no(),
            account.getCard_name(),account.getCard_password(),account.getCard_money());
    }

}


    2.6 根據用戶名  和  密碼 查詢一個賬戶對象出來
       1.根據表 設計一個實體類 BankAccount
       2.在接口中 增加一個方法 可以根據 用戶名 和 密碼 進行對象的查詢
       3.在實現類中 增加實現方法
                          少把數據庫中的數據 變成 相應對象的規則,需要使用 RowMapper 接口進行說明
       4.測試
    2.7 查詢所有的賬戶的信息
       1.根據表 設計一個實體類 BankAccount
       2.在接口中 增加一個方法 可以查詢所有的賬戶 返回 List
       3.在實現類中 增加實現方法
                          少把數據庫中的數據 變成 相應對象的規則,需要使用 RowMapper 接口進行說明
       4.測試    
    2.8 增加賬戶信息
       1.在接口中 增加一個方法  
       2.寫實現類
       3.測試
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章