一种通用的DAO访问方法
2016-07-21 17:16
465 查看
在SpringMVC开发过程中各个层级需要编写大量重复代码,解决方法有三:其一、粘贴复制,似乎不少人这么干;其二,通过代码生成工具,设置变量替换大量文件;其三,构建通用方法实现代码复用。写者疲于复制,没有采用第一种,没有现成好的模板没有采用第二种,于是,通过第三种方法构建通用访问方式。
考虑之后,决定通过以下方式实现访问通用性:
通过工具类完成参数与语句对照转化;
通过底层接口控制实体调用方法;
通过抽象类实现基础操作;
根据业务不断进行底层封装与抽象。
按照抽象接口通过抽象类完成共性操作
操作中按照不同方式进行组合的工具类
在实现时,仅需要提供数据库中table的名称即可
在实体层可根据自己业务需要构建代码即可,需要注意实现toJSONString方法完成到Json的转换过程。
要点考虑
通用方法必须考虑的几点:通用到何种程度,通用到哪个级别如何控制相应层次,如何解决不同实体的差异访问以及如何进行通用代码的差异访问(此问题主要是后期功能查询的要求)。考虑之后,决定通过以下方式实现访问通用性:
通过工具类完成参数与语句对照转化;
通过底层接口控制实体调用方法;
通过抽象类实现基础操作;
根据业务不断进行底层封装与抽象。
代码实现
初步定义的抽象接口,为抽象类提供约束,参数传递使用FastJson的JSONObject对象package cn.cnic.datapub.general; import java.util.List; import com.alibaba.fastjson.JSONObject; public interface IGeneralDAO<T> { public T findById(Object id); public List<T> findByParams(JSONObject json); public List<T> findAll(); public boolean add(T model); public boolean delete(T model); public boolean deleteById(Object id); public boolean modify(T model); public boolean modifyById(Object id,T model); public int count(); }
按照抽象接口通过抽象类完成共性操作
package cn.cnic.datapub.general; import java.lang.reflect.ParameterizedType; import java.util.List; import javax.annotation.Resource; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import cn.cnic.datapub.util.ParamTransfer; import com.alibaba.fastjson.JSONObject; public abstract class AbstractDAO<T> implements IGeneralDAO<T> { @Resource JdbcTemplate jdbcTemplate; private String tablename; public T findByIdTest(Object id) { T t = null; if(id!=null) { String sql = "select * from "+getTablename()+" where id=?"; t = this.jdbcTemplate.queryForObject(sql,new Object[]{id}, new BeanPropertyRowMapper<T>(getTClass())); } return t; } @Override public T findById(Object id) { T t = null; if(id!=null) { String sql = "select * from "+getTablename()+" where id=?"; t = this.jdbcTemplate.queryForObject(sql,new Object[]{id}, new BeanPropertyRowMapper<T>(getTClass())); } return t; } @Override public List<T> findByParams(JSONObject json) { Object[] params = ParamTransfer.paramsAnalyseSQL(json); if(params[0]!=null&¶ms[1]!=null) { String sql = " select * from "+getTablename()+" where "+params[0]; return this.jdbcTemplate.query(sql,(Object[])params[1],new BeanPropertyRowMapper<T>(getTClass())); } else { return findAll(); } } @Override public boolean add(T model) { if(model!=null) { JSONObject jmodel = JSONObject.parseObject(model.toString()); Object[] params = ParamTransfer.paramsAnalyseAddSQLWithoutNull(jmodel); if(params[0]!=null&¶ms[1]!=null) { int count = ((Object[])params[1]).length; StringBuilder paramsb = new StringBuilder(); for(int i=0;i<count-1;i++) { paramsb.append("?,"); } paramsb.append("?"); String sql = "insert into "+getTablename()+"("+params[0]+") values("+paramsb+")"; int result = this.jdbcTemplate.update(sql,(Object[])params[1]); if(result>=1) { return true; } } } return false; } @Override public boolean delete(T model) { if(model!=null) { JSONObject jmodel = JSONObject.parseObject(model.toString()); return deleteById(jmodel.get("id")); } else { return false; } } @Override public boolean deleteById(Object id) { if(id!=null) { String sql = "delete from "+getTablename()+" where id=?"; int num = this.jdbcTemplate.update(sql,new Object[]{id}); if(num>0)return true; else return false; } else { return false; } } @Override public boolean modify(T model) { if(model!=null) { JSONObject jmodel = JSONObject.parseObject(model.toString()); Object[] params = ParamTransfer.paramsAnalyseUpdateSQL(jmodel); if(params[0]!=null&¶ms[1]!=null) { String sql = "update "+getTablename()+" set "+params[0]+" where id=?"; int num = this.jdbcTemplate.update(sql,(Object[])params[1]); if(num>0)return true; } } return false; } @Override public boolean modifyById(Object id, T model) { if(id!=null) { JSONObject jmodel = JSONObject.parseObject(model.toString()); Object[] params = ParamTransfer.paramsAnalyseUpdateSQLWithId(jmodel,id); String sql = "update "+getTablename()+" set "+params[0]+" where id=?"; int num = this.jdbcTemplate.update(sql,(Object[])params[1]); if(num>0)return true; else return false; } else { return false; } } @Override public List<T> findAll() { String sql = " select * from "+getTablename()+" "; return this.jdbcTemplate.query(sql,new Object[]{},new BeanPropertyRowMapper<T>(getTClass())); } @Override public int count() { String sql = " select count(*) from "+getTablename()+" "; return this.jdbcTemplate.queryForObject(sql,new Object[]{},Integer.class); } @SuppressWarnings("unchecked") public Class<T> getTClass() { Class<T> tClass = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]; return tClass; } public String getTablename() { return tablename; } public void setTablename(String tablename) { this.tablename = tablename; } }
操作中按照不同方式进行组合的工具类
package cn.cnic.datapub.util; import java.util.ArrayList; import java.util.List; import com.alibaba.fastjson.JSONObject; public class ParamTransfer { public static Object[] paramsAnalyseSQL(JSONObject params) { if(params!=null) { List<String> names = new ArrayList<String>(); List<Object> values = new ArrayList<Object>(); for(String key:params.keySet()) { names.add(key); values.add(params.get(key)); } StringBuilder sb = new StringBuilder(); for(int i=0;i<names.size()-1;i++) { sb.append(names.get(i)+"=? and "); } sb.append(names.get(names.size()-1)+"=? "); return new Object[]{sb.toString(),values.toArray()}; } else { return new Object[]{null,null}; } } public static Object[] paramsAnalyseAddSQL(JSONObject params) { if(params!=null) { List<String> names = new ArrayList<String>(); List<Object> values = new ArrayList<Object>(); for(String key:params.keySet()) { if(!key.equals("id")) { names.add(key); values.add(params.get(key)); } } StringBuilder sb = new StringBuilder(); for(int i=0;i<names.size()-1;i++) { sb.append(names.get(i)+", "); } sb.append(names.get(names.size()-1)+" "); return new Object[]{sb.toString(),values.toArray()}; } else { return new Object[]{null,null}; } } public static Object[] paramsAnalyseAddSQLWithoutNull(JSONObject params) { if(params!=null) { List<String> names = new ArrayList<String>(); List<Object> values = new ArrayList<Object>(); for(String key:params.keySet()) { Object value = params.get(key); if(value!=null&&!value.toString().equals("")&&!key.equals("id")) { names.add(key); values.add(params.get(key)); } } StringBuilder sb = new StringBuilder(); for(int i=0;i<names.size()-1;i++) { sb.append(names.get(i)+", "); } sb.append(names.get(names.size()-1)+" "); System.out.println(params); System.out.println(names); System.out.println(values); return new Object[]{sb.toString(),values.toArray()}; } else { return new Object[]{null,null}; } } public static Object[] paramsAnalyseUpdateSQL(JSONObject params) { if(params!=null) { List<String> names = new ArrayList<String>(); List<Object> values = new ArrayList<Object>(); Object id = null; for(String key:params.keySet()) { if(!key.equals("id")) { names.add(key); values.add(params.get(key)); } else { id=params.get("id"); } } StringBuilder sb = new StringBuilder(); for(int i=0;i<names.size()-1;i++) { sb.append(names.get(i)+"=?, "); } sb.append(names.get(names.size()-1)+"=? "); values.add(id); return new Object[]{sb.toString(),values.toArray()}; } else { return new Object[]{null,null}; } } public static Object[] paramsAnalyseUpdateSQLWithId(JSONObject params,Object id) { if(params!=null) { List<String> names = new ArrayList<String>(); List<Object> values = new ArrayList<Object>(); for(String key:params.keySet()) { names.add(key); values.add(params.get(key)); } StringBuilder sb = new StringBuilder(); for(int i=0;i<names.size()-1;i++) { sb.append(names.get(i)+"=?, "); } sb.append(names.get(names.size()-1)+"=? "); values.add(id); return new Object[]{sb.toString(),values.toArray()}; } else { return new Object[]{null,null}; } } }
在实现时,仅需要提供数据库中table的名称即可
package cn.cnic.datapub.job.manager; import javax.annotation.Resource; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import cn.cnic.datapub.general.AbstractDAO; @Repository(value="parseDataDAO") public class ParseDataDAO extends AbstractDAO<ParseDataM> { @Resource JdbcTemplate jdbcTemplate; public ParseDataDAO() { setTablename("job_sub_parse"); } }
在实体层可根据自己业务需要构建代码即可,需要注意实现toJSONString方法完成到Json的转换过程。
相关文章推荐
- 计算机考试相关证书 (一)
- 利用EditText的RightDrawable切换密码显示
- c++学习笔记(十):C++类和对象
- Leetcode: N Queen I & II
- OPEN窗口特性
- 第七讲:内存虚拟化
- byte数组转16进制 输出到文件
- iOS中 最新微信支付/最全的微信支付教程详解
- python字典的get函数和iteritems函数
- BootStrap 媒体对象
- DotSpatial如何加载GeoServer、谷歌 、百度、腾讯的WMS地图
- 在CentOS系统中把PHP 5.3.x更新到PHP 5.4.x
- cf#363div2
- spark使用KryoRegistrator java代码示例
- 中断分层
- SMS常见缩写
- 学习之前
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 12: ordinal not in range(128)问题解决
- 收藏网址
- HDU4039(map应用)