简易JDBC框架实现过程详解
1准备
- JDBC基本知识
- JDBC元数据知识
- 反射基本知识
2:两个问题
业务背景:系统中所有实体对象都涉及到基本的CRUD操作。所有实体的CUD操作代码基本相同,仅仅是发送给数据库的sql语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的sql语句。
实体的R操作,除sql语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,因此可定义一个query方法,除以参数形式接收变化的sql语句外,可以使用策略模式由query方法的调用者决定如何把ResultSet中的数据映射到实体对象中。
3:JDBC封装updatequery方法
publicclassJdbcNewUtils{ privateJdbcNewUtils(){} /** *这里可以使用properties进行替换 */ privatestaticfinalStringUSER="root"; privatestaticfinalStringPWD="root"; privatestaticfinalStringURL="jdbc:mysql://127.0.0.1:3306/day?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&generateSimpleParameterMetadata=true"; privatestaticfinalStringDRIVER="com.mysql.jdbc.Driver"; static{ try{ Class.forName(DRIVER); }catch(ClassNotFoundExceptione){ e.printStackTrace(); } } publicstaticConnectiongetConnection()throwsSQLException{ Connectionconnection=DriverManager.getConnection(URL,USER,PWD); returnconnection; } /** *CUD返回影响数目 *@paramsql *@paramargs *@returnint */ publicstaticintupdate(Stringsql,Object[]args){ PreparedStatementps=null; Connectionconn=null; try{ conn=getConnection(); ps=conn.prepareStatement(sql); for(inti=1;i<=args.length;i++){ ps.setObject(i,args[i-1]); } returnps.executeUpdate(); }catch(SQLExceptione){ e.printStackTrace(); }finally{ close(conn,ps); } return0; } /** *查询结果封装Bean *@paramsql *@paramargs *@paramrsh *@returnObject */ publicstaticObjectquery(Stringsql,Object[]args,ResultSetHandlerrsh){ PreparedStatementps=null; Connectionconn=null; try{ conn=getConnection(); ps=conn.prepareStatement(sql); for(inti=0;i4:query
每次查询根据查询的参数不同,返回的ResultSet也不同,这个规则我们需要单独编写规则解析器,这里用到了策略设计模式,
将ResultSetHandler定义解决问题的接口,handle为那些需要实现的具体解决的办法
publicinterfaceResultSetHandler{ Objecthandle(ResultSetresultSet); }下面我实现了Beanhandler和BeanListHandler分别是单个的Bean和一个列表的Bean
packagejdbc.simpleframwork; importjava.lang.reflect.Field; importjava.sql.ResultSet; importjava.sql.ResultSetMetaData; importjava.sql.SQLException; publicclassBeanHandlerimplementsResultSetHandler{ privateClass>obj; publicBeanHandler(Class>obj){ this.obj=obj; } @Override publicObjecthandle(ResultSetresultSet){ try{ if(!resultSet.next()){ returnnull; } Objectinstance=obj.newInstance(); ResultSetMetaDatametaData=resultSet.getMetaData(); intcount=metaData.getColumnCount(); for(inti=1;i<=count;i++){ Fieldf=obj.getDeclaredField(metaData.getColumnName(i)); f.setAccessible(true); f.set(instance,resultSet.getObject(i)); } returninstance; }catch(InstantiationException|IllegalAccessExceptione){ e.printStackTrace(); }catch(SQLExceptione){ e.printStackTrace(); }catch(NoSuchFieldExceptione){ e.printStackTrace(); }catch(SecurityExceptione){ e.printStackTrace(); } returnnull; } }packagejdbc.simpleframwork; importjava.lang.reflect.Field; importjava.sql.ResultSet; importjava.sql.ResultSetMetaData; importjava.util.ArrayList; publicclassBeanListHandlerimplementsResultSetHandler{ privateClass>clazz; publicBeanListHandler(Class>clazz){ super(); this.clazz=clazz; } @Override publicObjecthandle(ResultSetresultSet){ try{ ArrayList