简易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;i
4: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