在我们常规的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(int i = 0;i
但是尽管这样做了,我们使用起来还是不方便,因为我们需要将“?”所需的参数数据装入到数组中,装入数组的过程很麻烦,试想:假如有100个getxxx()方法,我们在装的时候,需要手动装100个getxxx()方法,所以我们想,这个将getxxx()方法装入数组的过程,能否交给程序做呢?那么答案是肯定的,所以就有了4.0版
4.0 版 :在3.0版的基础上增加了将getxxx()方法通过程序代码的方式自动装入数组的过程,这样就方便了我们的使用。具体的代码操作如下:我们需要传递一条特殊的SQL语句,如:String sql = "insert into car values(null,#{cname},#{color},#{price})";但是这样写jdbc在读取数据库时并不认识,所以就需要SQL处理器经我们传递的特殊SQL语句处理成jdbc认识的SQL语句,通过SQL处理器会得到两个信息,第一个:jdbc认识的SQL语句;第二个:通过在处理的过程中我们从#{key}中得到的key值。
//String sql = "insert into car values(null,#{cname},#{color},#{price})";
//作用:将原SQL语句中的#{}更换成?,并将#{key}中的key保存到SQLInfo对象中
public SQLInfo getSql(String sql){
StringBuilder builder = new StringBuilder();
//用于存储key值
while(true){
//循环,直到没有#{key}组合为止,跳出(break)循环
int k1 = sql.indexOf("#{");
//找到“#{”所对应的索引
int k2 = sql.indexOf("}");
//找到“}”对应的索引
if(k1!=-1 && k2>k1){
//判断“#{”和“}”的索引位置是否获得到了
String key = sql.substring(k1+2,k2);
//通过subString将#{key}中的key截取出来
builder.append(key);
//截取出来后,拼接到事先准备好的builder字符串中
builder.append(",");
//key1于key2之间用逗号隔开
if(k2 得到getxxx方法,从而通过getxxx方法得到对应的属性值
public Object[] getParmaValue(Object parma,String []keys){
Object[] parmaValue = new Object[keys.length];
//将通过getxxx()方法得到的属性值存入数组中
for(int i = 0;i< keys.length;i++){
//keys[0]---->cname
String methodName = "get"+keys[i].substring(0,1).toUpperCase()+keys[i].substring(1);
//get + C + name,通过循环,参考SQLInfo中 key 数组得到,属性对应的getxxx()方法
System.out.println(methodName);
//打印输出获取到getxxx名字
Class clazz = parma.getClass();
//得到Parma类的类映射
try {
Method method = clazz.getMethod(methodName);
//通过反射机制操作Parma中的方法,----->getxxx()方法
Object key = method.invoke(parma);
//执行getxxx()方法
parmaValue[i] = key;
//并将得到的属性值存到事先创建的数组中
} catch (Exception e) {
e.printStackTrace();
}
}
return parmaValue;
//返回含有属性值的数组
}
通过SQL处理器,我们将getXXX()方法通过程序装入到了数组中,接下来我们就可以执行CURD操作了。
public void inserttext(String sql, Car car){
//调用处理器中的SQL语句处理方法
SQLProcessor processor = new SQLProcessor();
//通过处理得到jdbc认识SQL语句和#{key}中的key值
SQLInfo info = processor.getSql(sql);
//通过找到的key值,得到相应的getxxx()方法,并存入数组中
Object[] method = processor.getParmaValue(car,info.getKeys());
//执行sqlSession类中的新增方法
sqlSession session = new sqlSession();
//将处理好的SQL语句和装好的数组交个jdbc,做新增操作
session.insert(info.getSql(),method);
}
页面更新:2024-04-22
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号