基于 Spring jdbc template 的 简单易用的DAO。取名为SimpleDAO。

SimpleDAO 给予spring jdbc tamplate 的dao 实现。运行于jdk6.0之上。
            在自己开发中觉得试用ibatis,hibernate总是有这里那里不如意的地方。 ibatis实现动态条件查询不方便。hibernate试用起来感觉很笨重,学习曲线陡。 所以在一些小项目中自己总结开发了这一工具包。也就是一 DAO。 试用该DAO能够方便的实现单表的增删查改功能。实现复杂的查询跟新可能将SQL写到独立的文件里面。
以下是本DAO接口
SimpleDAO.java:
  1. package cn.kkp.dao;
  2. import java.util.List;
  3. import cn.kkp.dao.query.BoolExpr;
  4. import cn.kkp.dao.query.Insert;
  5. import cn.kkp.dao.query.Select;
  6. import cn.kkp.dao.query.Update;
  7. public interface SimpleDAO<T>
  8. {
  9.     public int delete(BoolExpr condition);
  10.     public T create(T obj);
  11.     public T create(Insert<T> insert);
  12.     public T create(T obj, String... insertedAttrs);
  13.     public int modify(Update<T> update);
  14.     public int modify(T obj, BoolExpr condition);
  15.     public int modify(T obj, BoolExpr condition, String... updatedAttrs);
  16.     public int modify(String statementId, Object... parameters);
  17.     public T query(Select<T> select);
  18.     public T query(BoolExpr condition);
  19.     public T query(BoolExpr condition, String... selectedAttrs);
  20.     public T query(String statementId, Object... parameters);
  21.     public List<T> queryList();
  22.     public List<T> queryList(Select<T> select);
  23.     public List<T> queryList(BoolExpr condition);
  24.     public List<T> queryList(BoolExpr condition, String... selectedAttrs);
  25.     public List<T> queryList(String statementId, Object... parameters);
  26. }
实现:
  1. package cn.kkp.dao.springjdbc;
  2. import java.sql.ResultSet;
  3. import java.sql.SQLException;
  4. import java.util.ArrayList;
  5. import java.util.Collections;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import org.apache.log4j.Logger;
  10. import org.springframework.dao.DataAccessException;
  11. import org.springframework.jdbc.core.JdbcTemplate;
  12. import org.springframework.jdbc.core.ResultSetExtractor;
  13. import cn.kkp.dao.SimpleDAO;
  14. import cn.kkp.dao.query.BoolExpr;
  15. import cn.kkp.dao.query.Delete;
  16. import cn.kkp.dao.query.Insert;
  17. import cn.kkp.dao.query.MySQLTranslator;
  18. import cn.kkp.dao.query.OQLObject;
  19. import cn.kkp.dao.query.Translator;
  20. import cn.kkp.dao.query.Select;
  21. import cn.kkp.dao.query.Update;
  22. import cn.kkp.dao.query.Where;
  23. import cn.kkp.util.BeanUtil;
  24. import cn.kkp.util.DBUtil;
  25. import cn.kkp.util.FileUtil;
  26. import cn.kkp.util.StringUtil;
  27. public class SimpleDAOImpl<T> extends JdbcTemplate
  28.     implements SimpleDAO<T>
  29. {
  30.     public SimpleDAOImpl() {
  31.         init();
  32.     }
  33.     @SuppressWarnings("unchecked")
  34.     public SimpleDAOImpl(String typeClassName) throws ClassNotFoundException {
  35.         init();
  36.         this.typeClass = (Class<T>) getClass().getClassLoader().loadClass(typeClassName);
  37.     }
  38.     @SuppressWarnings("unchecked")
  39.     public SimpleDAOImpl(Class<T> typeClass){
  40.         init();
  41.         this.typeClass = typeClass;
  42.     }
  43.     
  44.     private void init(){
  45.         logger = Logger.getLogger(SimpleDAOImpl.class);
  46.         sqlCache = new HashMap<String, String>();
  47.     }
  48.     @Override
  49.     public int delete(BoolExpr condition) {
  50.         Delete<T> delete = new Delete<T>(typeClass, new Where(condition));
  51.         return super.update(translator.toSQL(delete.exportOQL()), delete.exportParamters());
  52.     }
  53.     @SuppressWarnings("unchecked")
  54.     @Override
  55.     public List<T> queryList(final Select<T> select) {
  56.         return (List<T>) super.query(translator.toSQL(select.exportOQL()), select.exportParamters(), new ResultSetExtractor() {
  57.             public Object extractData(ResultSet rs) throws SQLException,
  58.                     DataAccessException {
  59.                 String attrs[] = select.getSelectedAttrs();
  60.                 String cols[] = new String[attrs.length];
  61.                 for (int i = 0, len = attrs.length; i < len; i++) {
  62.                     cols[i] = translator.toSQL(attrs[i]);
  63.                 }
  64.                 return SimpleDAOImpl.this.extractData1(rs, typeClass, cols, attrs);
  65.             }
  66.         });
  67.     }
  68.     @SuppressWarnings("unchecked")
  69.     @Override
  70.     public List<T> queryList(BoolExpr condition, String... selectedAttrs) {
  71.         return queryList(new Select<T>(typeClass, new Where(condition), selectedAttrs));
  72.     }
  73.     @Override
  74.     public List<T> queryList() {
  75.         return queryList((BoolExpr)null);
  76.     }
  77.     private List<T> extractData1(ResultSet rs, Class<T> type, String []cols, String [] attrs) throws SQLException {
  78.         List<T> list = new ArrayList<T>();
  79.         for (T ret; rs.next(); list.add(ret)) {
  80.             ret = BeanUtil.newBean(type);
  81.             for (int i = 0; i < cols.length; i++) {
  82.                 String columnName = cols[i];
  83.                 String attrName = attrs != null ? attrs[i] : columnName;
  84.                 Class<?> attrType = BeanUtil.getAttrType(type, attrName);
  85.                 BeanUtil.setAttr(ret, attrName, DBUtil.getValue(rs, columnName, attrType));
  86.             }
  87.         }
  88.         return list;
  89.     }
  90.     public Class<T> getTypeClass() {
  91.         return typeClass;
  92.     }
  93.     public void setTypeClass(Class<T> typeClass) {
  94.         this.typeClass = typeClass;
  95.     }
  96.     @Override
  97.     public T create(T obj) {
  98.         return create(new Insert<T>(obj));
  99.     }
  100.     @Override
  101.     public T create(Insert<T> insert) {
  102.         super.update(translator.toSQL(insert.exportOQL()), insert.exportParamters());
  103.         return insert.getInsertedBean();
  104.     }
  105.     @Override
  106.     public T create(T obj,  String... insertedAttrs) {
  107.         return create(new Insert<T>(obj, insertedAttrs));
  108.     }
  109.     @Override
  110.     public T query(BoolExpr condition) {
  111.         return query(new Select<T>(typeClass, new Where(condition)));
  112.     }
  113.     @Override
  114.     public T query(BoolExpr condition, String... selectedAttrs) {
  115.         List<T> list = queryList(condition, selectedAttrs);
  116.         return list.size() != 0 ? list.get(0) : null;
  117.     }
  118.     @Override
  119.     public T query(Select<T> select) {
  120.         List<T> list = queryList(select);
  121.         return list.size() != 0 ? list.get(0) : null;
  122.     }
  123.     @Override
  124.     public T query(String statmentId, Object... parameters) {
  125.         List<T> reuslt = queryList(statmentId, parameters);
  126.         return reuslt.size() != 0 ? reuslt.get(0) : null;
  127.     }
  128.     
  129.     @Override
  130.     public List<T> queryList(BoolExpr condition) {
  131.         Select<T> select = new Select<T>(typeClass);
  132.         if(condition!=null)
  133.             select.setWhere(new Where(condition));
  134.         return queryList(select);
  135.     }
  136.     @SuppressWarnings("unchecked")
  137.     @Override
  138.     public List<T> queryList(String statmentId, Object... parameters) {
  139.         String sql = getSQL(statmentId);
  140.         Object [] sqlAndParams = expandSQL(sql, parameters);
  141.         return (ArrayList<T>) super.query((String)sqlAndParams[0] , (Object[])sqlAndParams[1], new ResultSetExtractor() {
  142.                 public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
  143.                     String [] columns = DBUtil.getColumnNames(rs);
  144.                     String [] attrs = new String[columns.length];
  145.                     for (int i = 0, len = columns.length; i < len; i++) {
  146.                         attrs[i] = translator.toOQL(columns[i]);
  147.                     }
  148.                     return SimpleDAOImpl.this.extractData1(rs, typeClass, columns, attrs);
  149.                 }
  150.             });
  151.     }
  152.     @Override
  153.     public int modify(Update<T> update) {
  154.         return super.update(translator.toSQL(update.exportOQL()), update.exportParamters());
  155.     }
  156.     @Override
  157.     public int modify(T obj, BoolExpr condition) {
  158.         return this.modify(new Update<T>(obj, new Where(condition)));
  159.     }
  160.     @Override
  161.     public int modify(T obj, BoolExpr condition, String... updatedAttrs) {
  162.         return this.modify(new Update<T>(obj, new Where(condition), updatedAttrs));
  163.     }
  164.     @Override
  165.     public int modify(String statmentId, Object... parameters) {
  166.         String sql = getSQL(statmentId);
  167.         Object [] sqlAndParams = expandSQL(sql, parameters);
  168.         return super.update((String)sqlAndParams[0], (Object[])sqlAndParams[1]);
  169.     }
  170.     private String getSQL(String statementId) {
  171.         String sql = (String) sqlCache.get(statementId);
  172.         if (sql == null) {
  173.             sql = readSQL(statementId);
  174.             sqlCache.put(statementId, sql);
  175.         }
  176.         return sql;
  177.     }
  178.     private String readSQL(String statementId) {
  179.         return  sqlFileDir.startsWith("classpath:")?
  180.                 StringUtil.getText(getClass().getResourceAsStream(sqlFileDir.substring(10)+statementId+".sql")):
  181.                 FileUtil.getTextFromFile(sqlFileDir+statementId+".sql");
  182.     }
  183.     
  184.     /**
  185.      * if paramters contain OQLObject object, the function will expand it
  186.      * @param orignalSQL
  187.      * @param parameters
  188.      * @return
  189.      */
  190.     private Object [] expandSQL(String orignalSQL, Object [] parameters){
  191.         StringBuilder sb = new StringBuilder();
  192.         List<Object> newParams = new ArrayList<Object>();
  193.         int count = 0;
  194.         for(int i=0, len = orignalSQL.length(); i<len; i++){
  195.             char ch = orignalSQL.charAt(i);
  196.             if(ch == '?'){
  197.                 if(parameters[count] instanceof OQLObject){
  198.                     OQLObject oqlObject = (OQLObject)parameters[count++];
  199.                     String expandSQL = translator.toSQL(oqlObject.exportOQL());
  200.                     sb.append(expandSQL);
  201.                     Collections.addAll(newParams, oqlObject.exportParamters());
  202.                     continue;
  203.                 }
  204.                 newParams.add(parameters[count++]);
  205.             }
  206.             sb.append(ch);
  207.         }
  208.         return new Object[]{sb.toString(), newParams.toArray(new Object[newParams.size()])};
  209.     }
  210.     public String getSqlFileDir() {
  211.         return sqlFileDir;
  212.     }
  213.     public void setSqlFileDir(String sqlFileDir) {
  214.         this.sqlFileDir = sqlFileDir;
  215.     }
  216.     public Translator getTranslator() {
  217.         return translator;
  218.     }
  219.     public void setTranslator(Translator translator) {
  220.         this.translator = translator;
  221.     }
  222.     protected Logger logger;
  223.     private Map<String, String> sqlCache;
  224.     private String sqlFileDir;
  225.     private Class<T> typeClass;
  226.     private Translator translator = new MySQLTranslator();
  227. }
使用举例,加粗部分为DAO使用代码:
  1. public class SecurityManagerImpl extends ManagerSupport implements SecurityManager {
  2.     @Override
  3.     public UserDetails loadUserByUsername(String username)
  4.             throws UsernameNotFoundException, DataAccessException {
  5.         SimpleDAO<UserInfor> userDAO = getSimpleDAO(UserInfor.class);
  6.         UserInfor userInfor = userDAO.query(new BoolExpr("username=?", username));
  7.         if (userInfor == null)
  8.             throw new UsernameNotFoundException("User not found");
  9.         SimpleDAO<UserRole> roleDAO = getSimpleDAO(UserRole.class);
  10.         List<UserRole> roles = roleDAO.queryList("get_role_by_username", username);
  11.         UserDetail ud = new UserDetail(userInfor);
  12.         ud.setAuthority(GrantedAuthority.convertFromString(roles.toArray(new String[roles.size()])));
  13.         return ud;
  14.     }
  15. }

在此推荐一下:  饰装修评价推荐查询网 http://www.zhuangxiu007.com
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值