最近闲暇时萌发写一写dao的封装的例子,就将以前写的整理一下。
public class BaseDao<T> { Connection conn; PreparedStatement st; ResultSet rs; JdbcUtil jdbcUtil = new JdbcUtil(); int result = 0; private Class<T> persistentClass; @SuppressWarnings("unchecked") public BaseDaoUtil(){ conn = jdbcUtil.getConnection(); ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass(); persistentClass = (Class<T>) type.getActualTypeArguments()[0]; } /** * 保存 * @param entity * @return */ public int save(T entity) throws Exception{ String sql = "INSERT INTO "+ entity.getClass().getSimpleName().toLowerCase() +" ("; List<Method> list = this.matchPojoMethods(entity,"get"); Iterator<Method> iter = list.iterator(); Object obj[] = new Object[list.size()]; int i = 0; //拼接字段顺序 insert into table name(id,name,email, while(iter.hasNext()) { Method method = iter.next(); sql += method.getName().substring(3).toLowerCase() + ","; if (method.getReturnType().getSimpleName().indexOf("Date") !=-1) { SimpleDateFormat sbf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); obj[i] = sbf.format(method.invoke(entity, new Object[]{})); }else { obj[i] = method.invoke(entity, new Object[]{}); } i++; } //去掉最后一个,符号insert insert into table name(id,name,email) values( sql = sql.substring(0, sql.lastIndexOf(",")) + ") values("; //拼装预编译SQL语句insert insert into table name(id,name,email) values(?,?,?, for(int j = 0; j < list.size(); j++) { sql += "?,"; } //去掉SQL语句最后一个,符号insert insert into table name(id,name,email) values(?,?,?); sql = sql.substring(0, sql.lastIndexOf(",")) + ")"; //到此SQL语句拼接完成,打印SQL语句 System.out.println(sql); try { st = conn.prepareStatement(sql); for (int j = 0; j < obj.length; j++) { st.setObject(j+1, obj[j]); } result = st.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } jdbcUtil.getClose(rs, st, conn); return result; } /** * 删除 * @param object * @return * @throws SQLException */ public int deleteId(Object object) throws Exception{ String sql = "delete from "+ persistentClass.getSimpleName().toLowerCase() +" where "; //通过子类的构造函数,获得参数化类型的具体类型.比如BaseDAO<T>也就是获得T的具体类型 T entity = persistentClass.newInstance(); //存放Pojo(或被操作表)主键的方法对象 Method idMethod = null; List<Method> list = this.matchPojoMethods(entity, "set"); Iterator<Method> iter = list.iterator(); //过滤取得Method对象 while(iter.hasNext()) { Method tempMethod = iter.next(); if(tempMethod.getName().indexOf("Id") != -1 && tempMethod.getName().substring(3).length() == 2) { idMethod = tempMethod; } else if((entity.getClass().getSimpleName() + "Id").equalsIgnoreCase(tempMethod.getName().substring(3))){ idMethod = tempMethod; } } //第一个字母转为小写 sql += idMethod.getName().substring(3,4).toLowerCase()+idMethod.getName().substring(4) + " = ?"; System.out.println(sql); st = conn.prepareStatement(sql); //判断id的类型 if(object instanceof Integer) { st.setInt(1, (Integer)object); } else if(object instanceof String){ st.setString(1, (String)object); } result = st.executeUpdate(); jdbcUtil.getClose(rs, st, conn); return result; } /** * 修改 * @param entity * @return * @throws Exception */ public int update(T entity) throws Exception{ String sql = "update "+ entity.getClass().getSimpleName().toLowerCase() +" set "; List<Method> list = this.matchPojoMethods(entity, "get"); //装载参数 Object obj[] = new Object[list.size()]; int i = 0; //临时Method对象,负责迭代时装method对象. Method tempMethod = null; //由于修改时不需要修改ID,所以按顺序加参数则应该把Id移到最后. Method idMethod = null; Iterator<Method> iter = list.iterator(); while(iter.hasNext()) { tempMethod = iter.next(); //如果方法名中带有ID字符串并且长度为2,则视为ID. if(tempMethod.getName().lastIndexOf("Id") != -1 && tempMethod.getName().substring(3).length() == 2) { obj[list.size()-1] = tempMethod.invoke(entity, new Object[]{}); //把ID字段的对象存放到一个变量中,然后在集合中删掉. idMethod = tempMethod; iter.remove(); //如果方法名去掉set/get字符串以后与pojo + "id"想符合(大小写不敏感),则视为ID } else if((entity.getClass().getSimpleName() + "Id").equalsIgnoreCase(tempMethod.getName().substring(3))) { obj[list.size()-1] = tempMethod.invoke(entity, new Object[]{}); idMethod = tempMethod; iter.remove(); } } //把迭代指针移到第一位 iter = list.iterator(); while(iter.hasNext()) { tempMethod = iter.next(); sql += tempMethod.getName().substring(3).toLowerCase() + "= ?,"; obj[i] = tempMethod.invoke(entity, new Object[]{}); i++; } //去掉最后一个,符号 sql = sql.substring(0,sql.lastIndexOf(",")); //添加条件 sql += " where " + idMethod.getName().substring(3).toLowerCase() + " = ?"; //SQL拼接完成,打印SQL语句 System.out.println(sql); st = conn.prepareStatement(sql); for (int j = 0; j < obj.length; j++) { st.setObject(j+1, obj[j]); } result = st.executeUpdate(); jdbcUtil.getClose(rs, st, conn); return result; } public T findById(Object object) throws Exception{ String sql = "select * from "+ persistentClass.getSimpleName().toLowerCase() +" where "; //通过子类的构造函数,获得参数化类型的具体类型.比如BaseDAO<T>也就是获得T的具体类型 T entity = persistentClass.newInstance(); //存放Pojo(或被操作表)主键的方法对象 Method idMethod = null; List<Method> list = this.matchPojoMethods(entity, "set"); Iterator<Method> iter = list.iterator(); //过滤取得Method对象 while(iter.hasNext()) { Method tempMethod = iter.next(); if(tempMethod.getName().indexOf("Id") != -1 && tempMethod.getName().substring(3).length() == 2) { idMethod = tempMethod; } else if((entity.getClass().getSimpleName() + "Id").equalsIgnoreCase(tempMethod.getName().substring(3))){ idMethod = tempMethod; } } //第一个字母转为小写 sql += idMethod.getName().substring(3,4).toLowerCase()+idMethod.getName().substring(4) + " = ?"; System.out.println(sql); st = conn.prepareStatement(sql); //判断id的类型 if(object instanceof Integer) { st.setInt(1, (Integer)object); } else if(object instanceof String){ st.setString(1, (String)object); } rs = st.executeQuery(); //把指针指向迭代器第一行 iter = list.iterator(); //封装 while(rs.next()) { while(iter.hasNext()) { Method method = iter.next(); if(method.getParameterTypes()[0].getSimpleName().indexOf("String") != -1) { //由于list集合中,method对象取出的方法顺序与数据库字段顺序不一致(比如:list的第一个方法是setDate,而数据库按顺序取的是"123"值) //所以数据库字段采用名字对应的方式取. this.setString(method, entity, rs.getString(method.getName().substring(3).toLowerCase())); } else if(method.getParameterTypes()[0].getSimpleName().indexOf("Date") != -1){ this.setDate(method, entity, rs.getDate(method.getName().substring(3).toLowerCase())); }else { this.setInt(method, entity, rs.getInt(method.getName().substring(3).toLowerCase())); } } } jdbcUtil.getClose(rs, st, conn); return entity; } /** * 过滤当前Pojo类所有带传入字符串的Method对象,返回List集合. */ private List<Method> matchPojoMethods(T entity,String methodName) { //获得当前Pojo所有方法对象 Method[] methods = entity.getClass().getDeclaredMethods(); //List容器存放所有带get字符串的Method对象 List<Method> list = new ArrayList<Method>(); //过滤当前Pojo类所有带get字符串的Method对象,存入List容器 for(int index = 0; index < methods.length; index++) { if(methods[index].getName().indexOf(methodName) != -1) { list.add(methods[index]); } } return list; } /** * 参数类型为String时,为entity字段设置参数,对应set */ public String setString(Method method, T entity, String arg) throws Exception{ return (String)method.invoke(entity, new Object[]{arg}); } /** * 参数类型为Date时,为entity字段设置参数,对应set */ public Date setDate(Method method, T entity, Date arg) throws Exception{ return (Date)method.invoke(entity, new Object[]{arg}); } /** * 参数类型为Integer或int时,为entity字段设置参数,对应set */ public Integer setInt(Method method, T entity, Integer arg) throws Exception{ return (Integer)method.invoke(entity, new Object[]{arg}); } }
以上这篇基于JDBC封装的BaseDao(实例代码)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
本文向大家介绍php mysql 封装类实例代码,包括了php mysql 封装类实例代码的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,具体代码如下所示: 以上所述是小编给大家介绍的php mysql 封装类实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对呐喊教程网站的支持!
本文向大家介绍php基于单例模式封装mysql类完整实例,包括了php基于单例模式封装mysql类完整实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php基于单例模式封装mysql类。分享给大家供大家参考,具体如下: 类: 测试: 更多关于PHP相关内容感兴趣的读者可查看本站专题:《php+mysql数据库操作入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《
本文向大家介绍php基于PDO实现功能强大的MYSQL封装类实例,包括了php基于PDO实现功能强大的MYSQL封装类实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php基于PDO实现功能强大的MYSQL封装类。分享给大家供大家参考,具体如下: 更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP基于pdo操作数据库技巧总结》、《php+Oracle数据库程序设计技巧总结》、《
本文向大家介绍vue中axios请求的封装实例代码,包括了vue中axios请求的封装实例代码的使用技巧和注意事项,需要的朋友参考一下 axios Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中, 也是vue官方推荐使用的http库;封装axios,一方面为了以后维护方便,另一方面也可以对请求进行自定义处理 安装 封装 我把axios请求封装在htt
设置Redis链接信息 修改Config.php的User config,加入以下信息 "REDIS"=>array( "HOST"=>'ip', "PORT"=>port, "AUTH"=>'password' ) Redis class namespace AppVendorDb; use ConfConfig; class
本文向大家介绍基于python3 类的属性、方法、封装、继承实例讲解,包括了基于python3 类的属性、方法、封装、继承实例讲解的使用技巧和注意事项,需要的朋友参考一下 Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。 对象可以包含任意数量和类型的数据。 python类与c++类相似,