带你实现简易的JDBC封装

在我们常规的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

标签:赋值   数组   不方便   语句   简易   处理器   索引   属性   参数   过程   操作   数据库   方法   数据   汽车   科技   信息

1 2 3 4 5

上滑加载更多 ↓
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top