在我们常规的jdbc操作中,代码冗余问题非常严重,所以我们就想将jdbc六部曲的操作进行封装处理,这样可以我们的操作更方便、简捷。 演示新增操作:假设我们有一个关于Car信息的数据表,表中有汽车id、汽车名称、汽车颜色、汽车价格,我们此时需要做一个新增操作,我们自己通过Scanner输入要存储的信息,将这些信息写入到数据库中,而问题来了,我们自己手动输入的信息要保存在哪里呢,数组?不行,存是好存但是不方便取用,存了是为了在将数据写入数据库时取用;集合?不行,依然不好取用,domain实体对象,这个可以,我们在存值时,通过有参构造方法将我们手动输入的值存到属性中,在做数据库写入时,由于属性是私有的,所以我们通过getXXX()方法取到属性值。 1。0版:引入依赖、加载驱动、创建连接、创建命令行对象、执行SQL、各种关闭。缺点:每一次做CURD操作,都要重新写一遍六部曲操作,而每一次的六部曲操作中,只有SQL语句不同,于是就有了2。0版 2。0版:将SQL语句作为参数传递给CURD操作方法,这样每一次新的操作只需要更改SQL语句即可,但是依然存在很大的问题,1。0版和2。0版都存在SQL注入问题,非常的不安全,所以就有了3。0版。 3。0版:通过采用预处理方式解决SQL注入问题,通过传递参数数组为预处理中的?赋值,操作如下,Parma数组中装有参数数据,通过pstst。setObject()方法为?赋值。for(inti0;iparma。length;i){通过for循环遍历为?赋值pstst。setObject(i1,parma〔i〕);}与问号对应的值来自于我们事先手动装好的数组中,如下Object〔〕parmanewObject〔〕{car。getCanme(),car。getColor(),car。getPrice()}; 但是尽管这样做了,我们使用起来还是不方便,因为我们需要将?所需的参数数据装入到数组中,装入数组的过程很麻烦,试想:假如有100个getxxx()方法,我们在装的时候,需要手动装100个getxxx()方法,所以我们想,这个将getxxx()方法装入数组的过程,能否交给程序做呢?那么答案是肯定的,所以就有了4。0版 4。0版:在3。0版的基础上增加了将getxxx()方法通过程序代码的方式自动装入数组的过程,这样就方便了我们的使用。具体的代码操作如下:我们需要传递一条特殊的SQL语句,如:Stringsqlinsertintocarvalues(null,{cname},{color},{price});但是这样写jdbc在读取数据库时并不认识,所以就需要SQL处理器经我们传递的特殊SQL语句处理成jdbc认识的SQL语句,通过SQL处理器会得到两个信息,第一个:jdbc认识的SQL语句;第二个:通过在处理的过程中我们从{key}中得到的key值。Stringsqlinsertintocarvalues(null,{cname},{color},{price});作用:将原SQL语句中的{}更换成?,并将{key}中的key保存到SQLInfo对象中publicSQLInfogetSql(Stringsql){StringBuilderbuildernewStringBuilder();用于存储key值while(true){循环,直到没有{key}组合为止,跳出(break)循环intk1sql。indexOf({);找到{所对应的索引intk2sql。indexOf(});找到}对应的索引if(k1!1k2k1){判断{和}的索引位置是否获得到了Stringkeysql。substring(k12,k2);通过subString将{key}中的key截取出来builder。append(key);截取出来后,拼接到事先准备好的builder字符串中builder。append(,);key1于key2之间用逗号隔开if(k2sql。length()1){判断还有没有下一对{},如果有,则:sqlsql。substring(0,k1)?sql。substring(k21);将key值取出后,把{}替换成?continue;}else{如果没有,则:sqlsql。substring(0,k1)?;break;}}else{若没有{}组合后,则让循环终止break;}}returnnewSQLInfo(sql,builder。toString()。split(,));将处理好的SQL语句和在处理过程中得到的key值存入domain对象(SQLInfo)中}方法二,通过参数数组得到getxxx方法,从而通过getxxx方法得到对应的属性值publicObject〔〕getParmaValue(Objectparma,String〔〕keys){Object〔〕parmaValuenewObject〔keys。length〕;将通过getxxx()方法得到的属性值存入数组中for(inti0;ikeys。length;i){keys〔0〕cnameStringmethodNamegetkeys〔i〕。substring(0,1)。toUpperCase()keys〔i〕。substring(1);getCname,通过循环,参考SQLInfo中key数组得到,属性对应的getxxx()方法System。out。println(methodName);打印输出获取到getxxx名字Classclazzparma。getClass();得到Parma类的类映射try{Methodmethodclazz。getMethod(methodName);通过反射机制操作Parma中的方法,getxxx()方法Objectkeymethod。invoke(parma);执行getxxx()方法parmaValue〔i〕key;并将得到的属性值存到事先创建的数组中}catch(Exceptione){e。printStackTrace();}}returnparmaValue;返回含有属性值的数组} 通过SQL处理器,我们将getXXX()方法通过程序装入到了数组中,接下来我们就可以执行CURD操作了。publicvoidinserttext(Stringsql,Carcar){调用处理器中的SQL语句处理方法SQLProcessorprocessornewSQLProcessor();通过处理得到jdbc认识SQL语句和{key}中的key值SQLInfoinfoprocessor。getSql(sql);通过找到的key值,得到相应的getxxx()方法,并存入数组中Object〔〕methodprocessor。getParmaValue(car,info。getKeys());执行sqlSession类中的新增方法sqlSessionsessionnewsqlSession();将处理好的SQL语句和装好的数组交个jdbc,做新增操作session。insert(info。getSql(),method);}