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也是一樣,這裡就不一一的列出來的。