Spring DAO編程-oracle數據庫操作

1.Spring DAO 對JDBC做出的改進

對DAO實現類的編寫做了簡化和封裝

Spring DAO 提供了基於AOP的事務管理

對JDBC中的異常 做了封裝 把原來的檢查異常 封裝成了運行時異常DataAccessException

2.完成真正數據庫訪問的對象 叫JdbcTemplate 模板

這個對象可以完成1.驅動加載2.連接獲取3.執行環境獲取4.資源釋放這四個步驟!

只需要自己寫sql語句即可!

JdbcDaoSupport 這個類可以提供 JdbcTemplate 類型的對象

3.採用繼承JdbcDaoSupport 的方式完成對數據庫的訪問

1.建立表和對應的序列並插入幾條測試數據

2.建立一個項目 導入jar(ioc aop組件掃描 dao數據庫模板和實現類 數據庫驅動 連接池具體連數據庫的時候用到的)並拷貝配置文件到src下

3.編寫DAO接口

public interface XdlBankAccountDAO {
	 int getBankAccountCount();
	 double getBankAccountAccMoneyById(int id);
	 String getBankAccountAccNoById(int id);
}

4.編寫DAO的實現類 實現DAO 接口 並繼承JdbcDaoSupport

      開啓組件掃描

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

      在Spring容器中創建連接池對象 並注入給DAO實現類的父類JdbcDaoSupport

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
		<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:MLDN"></property>
		<property name="username" value="system"></property>
		<property name="password" value="123456"></property>
</bean>
//先從容器中獲取dataSource對象 然後賦值給父類
	@Autowired
	public XdlBankAccountDAOOracleImp(DataSource dataSource){
		super.setDataSource(dataSource);
	}

獲取 JdbcDaoSupport 中的模板對象使用API 完成查詢並返回數據

@Repository("accountDao")在public class XdlBankAccountDAOOracleImp extends JdbcDaoSupport implements XdlBankAccountDAO 之上注意是先繼承在實現。

@Override
	public int getBankAccountCount() {
		String sql = "select count(0) from xdl_bank_account";
		//從父類中獲取模板對象 完成查詢
		//return super.getJdbcTemplate().queryForInt(sql);
		return super.getJdbcTemplate().queryForObject(sql, Integer.class);
	}

5.創建Spring容器對象 並從容器中獲取DAO 實現類的對象 通過DAO實現類獲取銀行賬戶的數量

public static void main(String[] args) {
		ApplicationContext app = 
				new ClassPathXmlApplicationContext("applicationContext.xml");
		XdlBankAccountDAO dao = app.getBean("accountDao",
				XdlBankAccountDAOOracleImp.class);
		System.out.println(dao.getBankAccountCount());
		
	}

。傳入一個id值查詢對應的錢數

@Override
	public double getBankAccountAccMoneyById(int id) {
		String sql="select acc_money from xdl_bank_account where id = ?";
		return super.getJdbcTemplate().queryForObject(sql, Double.class,id);
	}

。傳入一個id值查詢對應的賬號

    Surround With 的 try/catch 異常的避免。注意queryForObject返回的只能是一個結果集,不能爲空也不能爲多個。

    @Override
	public String getBankAccountAccNoById(int id) {
		String sql = "select acc_no from xdl_bank_account where id = ?";
		try {
			return super.getJdbcTemplate().queryForObject(sql, String.class, id);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
		return null;
	}

。傳入一個id 的值  查詢對應的銀行賬戶 
   如果有對應的對象 則返回 否則返回null
   

   結果集 轉換成對象的過程 需要大家自己完成  
   自己寫一個類  實現 RowMapper 接口   (這叫行映射器接口  包裝結果集轉換成對象的過程)  

//映射器接口
public class XdlBankAccountMapper implements RowMapper<XdlBankAccount> {

	@Override
	public XdlBankAccount mapRow(ResultSet rs, int index) throws SQLException {
		return new XdlBankAccount(rs.getInt("id"),
				rs.getString("acc_no"),rs.getString("acc_password"),rs.getDouble("acc_money"));
	}
	
}
//實現類
@Override
	public XdlBankAccount getBankAccountById(int id) {
		String sql = "select * from xdl_bank_account where id=?";
		
		try {
			return super.getJdbcTemplate().queryForObject(sql, new XdlBankAccountMapper(), id);
		} catch (DataAccessException e) {
			e.printStackTrace();
		}
		return null;
	}

6.包裝一個Service對象 對應DAO封裝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章