1. 程式人生 > >46、自適應mysql和oracle(1)

46、自適應mysql和oracle(1)

學習過程:

在需求分許裡面還有這麼一個要求就是能自適應mysql和oracle,雖然只有這麼一句話,但是我們應該如何才能實現這個功能,畢竟mysql和oracle資料庫所支援的sql語言除了基本的增刪改查是一樣之外,還是有很多是不同的,比如說分頁演算法就不同,那麼我們如何可以讓使用者在不修改java原始碼的基礎上就可以實現自適應mysql和oracle呢?這裡我們的解決方法就是使用簡單工廠模式,雖然還不是盡善盡美,但是還是可以勉強可以滿足需求的,只是需要寫的程式碼就比較多了,以後我們會有更好的實現,就是使用hibernate框架,這個是後話了,以後再說。今天先說說我們的實現方式吧,大家應該還記得簡單工廠模式的實現吧。

首先,我們在在oracle資料庫建立和mysql資料庫一樣的表結構,修改jdbc.properties檔案,寫上oracle的連線資訊,以後使用者需要切換資料庫只需要修改這個檔案即可,我們添加了一個新的屬性db,根據這個db判斷當前使用的是什麼資料庫,把mysql的連線資訊註釋了,開啟oracle的連線資訊即可。jdbc.properties檔案內容如下:

#mysql
db=mysql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/webshop?useUnicode=true&characterEncoding=utf8
name=root
password=

#oracle
#db=oracle
#driver =oracle.jdbc.driver.OracleDriver
#url =jdbc:oracle:thin:@192.168.11.253:1521:orcl
#name =liubao
#password =123456

這裡我就一商品類別和商品做一個示例,也給大家一個思路,並沒有全部完成,大家按照這個思路完成就可以了。

1、為dao層實現抽象一個介面。好的程式設計習慣都是面向介面進行程式設計的,不過我們之前的程式碼並沒有這樣做,所以我們需要抽象一個dao層的介面,然後mysql和oracle分別實現這個介面,以分別實現對mysql資料庫和oracle資料庫的操作。

商品操作的dao介面程式碼如下:

public interface IGoodsDao {
	
	public int add(Goods goods);
	
	public int del(int id);
	
	public int update(Goods goods);
	
	public Goods getById(int id);
	
	public List<Goods> getByType(int typeId, Page page);

}

mysql的實現我們在之前就已經完成了,現在只需要修改這個GoodsDao,實現這個介面就可以了,程式碼如下:

public class GoodsDao extends BaseDao implements IGoodsDao{

新建一個GoodsOracleDao類,實現對Oracle的實現,程式碼如下:

public class GoodsOracleDao extends BaseDao implements IGoodsDao {

	/**
	 * 新增商品
	 * 
	 * @param goods
	 * @return
	 */
	public int add(Goods goods) {
		int result = 0;
		getCon();
		String sql = "insert into goods(type_id,goods_name,cash,infos,pic,nums) values(?,?,?,?,?,?)";
		result = exeUpdate(
				sql,
				new Object[] { goods.getTypeId(), goods.getGoodsName(),
						goods.getCash(), goods.getInfos(), goods.getPic(),
						goods.getNums() });
		closeAll();
		return result;
	}

	/**
	 * 根據Id刪除商品
	 * 
	 * @param id
	 * @return
	 */
	public int del(int id) {
		int result = 0;
		getCon();
		String sql = "delete from goods where goods_id=?";
		result = exeUpdate(sql, new Object[] { id });
		closeAll();
		return result;
	}

	/**
	 * 更新商品資訊
	 * 
	 * @param goods
	 * @return
	 */
	public int update(Goods goods) {
		int result = 0;
		getCon();
		String sql = "update goods set type_id=?,goods_name=?,cash=?,infos=?,pic=?,nums=?  where goods_id=?";
		result = exeUpdate(
				sql,
				new Object[] { goods.getTypeId(), goods.getGoodsName(),
						goods.getCash(), goods.getInfos(), goods.getPic(),
						goods.getNums(), goods.getGoodsId() });

		closeAll();
		return result;
	}

	/**
	 * 根據商品Id獲得單個商品資訊
	 * 
	 * @param id
	 * @return
	 */
	public Goods getById(int id) {
		Goods goods = null;

		getCon();
		String sql = "select * from goods where goods_id=?";
		rs = exeQuery(sql, new Object[] { id });
		try {
			if (rs.next()) {
				goods = new Goods();
				goods.setCash(rs.getDouble("cash"));
				goods.setGoodsId(rs.getInt("goods_id"));
				goods.setGoodsName(rs.getString("goods_name"));
				goods.setInfos(rs.getString("infos"));
				goods.setNums(rs.getInt("nums"));
				goods.setPic(rs.getString("pic"));
				goods.setTypeId(rs.getInt("type_id"));
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			closeAll();
		}
		return goods;
	}

	/**
	 * 根據商品型別分頁顯示商品資訊列表
	 * 
	 * @param typeId
	 *            商品類別ID
	 * @param page
	 *            分頁資訊
	 * @return
	 */
	public List<Goods> getByType(int typeId, Page page) {
		List<Goods> goodses = new ArrayList<Goods>();
		getCon();
		try {
			String sqlcount = "select count(*) from goods where type_id=?";
			rs = exeQuery(sqlcount, new Object[] { typeId });
			if (rs.next()) {
				page.setItmeCount(rs.getInt(1));
			}

			String sql = "select * from(select t.*,rownum rn from(select * from goods where type_id=? order by goods_id desc) t where  rownum<=?) where rn>? ";
			rs = exeQuery(
					sql,
					new Object[] { typeId, page.getItemEnd(),
							page.getItemStart() });

			while (rs.next()) {
				Goods goods = new Goods();
				goods.setCash(rs.getDouble("cash"));
				goods.setGoodsId(rs.getInt("goods_id"));
				goods.setGoodsName(rs.getString("goods_name"));
				goods.setInfos(rs.getString("infos"));
				goods.setNums(rs.getInt("nums"));
				goods.setPic(rs.getString("pic"));
				goods.setTypeId(rs.getInt("type_id"));

				goodses.add(goods);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			closeAll();
		}
		return goodses;
	}

}

GoodsTypeDao也是這樣,先設計介面,然後在分別實現就可以了。其他的Dao也是一樣,這裡就不一一的列出來的。