各位用户为了找寻关于详解JDBC数据库链接及相关方法的封装的资料费劲了很多周折。这里教程网为您整理了关于详解JDBC数据库链接及相关方法的封装的相关资料,仅供查阅,以下为您介绍关于详解JDBC数据库链接及相关方法的封装的详细内容

详解JDBC数据库链接及相关方法的封装

 使用的是MySQL数据库,首先导入驱动类,然后根据数据库URL和用户名密码获得数据的链接。由于使用的是MySQL数据库,它的URL一般为,jdbc:mysql://主机地址:端口号/库名。

  下面是封装的具体类,用到了泛型和反射,不过还存在些问题,就是对使用的泛型对象有些限制,只能用于泛型类对象属性名与数据库表中列名相同的对象,而且初始化对象的方法必须为set+属性名的方法。本来想通过返回值类型,参数列表来确定该属性初始化方法的,然而可能是目前学到的还是太少,只学了三周,所以并没有实现,感觉这个方法还是很low,以后还要继续完善。本来看到网上有用beanUtils包,利用map将查询的一列存起来,直接转化成该对象的,但是就是想试试新学到的反射。而且最后的垃圾回收器并不能如同C++的析构函数一样,所以关闭数据库链接的地方也需要改善。

实现代码:

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 public class Consql {  private static Consql consql=null;//单例设计模式  private Connection conn=null;//数据库链接  private final String url;//数据库url  private final String username;//数据库用户名  private final String password;//数据库密码  //驱动类的加载  static{//以静态代码块的形式加载驱动类,静态代码块只在类加载的时候执行一次   try {    Class.forName("com.mysql.jdbc.Driver");   } catch (ClassNotFoundException e) {    e.printStackTrace();   }  }  //构造函数  private Consql(String url,String username,String password) throws SQLException{   this.url = url;   this.username = username;   this.password = password;   open();//创建连接  }  private Connection open() throws SQLException  {   try {//驱动器获取数据库链接    conn=DriverManager.getConnection(url, username, password);   } catch (SQLException e) {    // TODO Auto-generated catch block    //e.printStackTrace();    throw e;      return conn;   }  /**   * 带限制条件查找   * @param sql 带占位符?的sql语句   * @param t 返回相关类型对象的类(T.class)   * @param params 替换占位符的数据,为动态数组   * @return ArrayList<T>   * @throws SQLException   */  public <T> ArrayList<T> select(String sql,Class<T> t,Object...params) throws SQLException  {//获取T类所有public方法   Method[] declaredMethods = t.getDeclaredMethods();   //创建一个盛放该类型对象集合   ArrayList<T> arrayList=new ArrayList<>();   try (PreparedStatement pStatement=conn.prepareStatement(sql);)   {      for(int i=0;i<params.length;i++)    {     pStatement.setObject(i+1, params[i]);    }      try(ResultSet rSet=pStatement.executeQuery();)    {     ResultSetMetaData rData=rSet.getMetaData();     //获取查询到结果表的列数     int columnCount = rData.getColumnCount();        while (rSet.next()) {      T a=t.newInstance();//创建泛型类实例      for(int i=0;i<columnCount;i++)      {//获得方数组里的set方法,这里造成了局限性,只能数据库表列名与对象名一致,且只能是set方法       String aString="set"+rData.getColumnName(i+1);       for (Method method : declaredMethods) {        if(method.getParameterCount()==1&&method.getReturnType().toString().equals("void")&&method.getName().equalsIgnoreCase(aString))        {//这里存在问题,前两个判断条件基本没用,主要是最初不想用上面拼串的方式来判断是不是调用该参数的方法         method.setAccessible(true);         //利用反射调用该方法         method.invoke(a, rSet.getObject(i+1));         break;        }       }      }      arrayList.add(a);     }    } catch (InstantiationException e) {     // TODO Auto-generated catch block     e.printStackTrace();    } catch (IllegalAccessException e) {     // TODO Auto-generated catch block     e.printStackTrace();    } catch (IllegalArgumentException e) {     // TODO Auto-generated catch block     e.printStackTrace();    } catch (InvocationTargetException e) {     // TODO Auto-generated catch block     e.printStackTrace();    }   } catch (SQLException e) {    // TODO Auto-generated catch block    throw e;   }   return arrayList;   }  /**   * 数据插入   * @param sql 带占位符?的sql语句   * @param params 替换占位符的数据,动态数组   * @throws SQLException   */  public void insert(String sql,Object...params) throws SQLException  {   try(PreparedStatement pStatement=conn.prepareStatement(sql);) {        for(int i=0;i<params.length;i++)    {     pStatement.setObject(i+1, params[i]);    }    pStatement.executeUpdate();   } catch (SQLException e) {    // TODO Auto-generated catch block    throw e;   }  }  /**   * 数据更新   * @param sql 带占位符?的sql语句   * @param params 替换占位符的数据,动态数组   * @throws SQLException   */  public void update(String sql,Object...params) throws SQLException  {   try(PreparedStatement pStatement=conn.prepareStatement(sql);) {        for(int i=0;i<params.length;i++)    {     pStatement.setObject(i+1, params[i]);    }    pStatement.executeUpdate();   } catch (SQLException e) {    // TODO Auto-generated catch block    throw e;   }  }  /**   * 带限制条件删除   * @param sql 带占位符?的sql语句   * @param params 替换占位符的数据,动态数组   * @throws SQLException   */  public void delete(String sql,Object...params) throws SQLException  {   try(PreparedStatement pStatement=conn.prepareStatement(sql);) {        for(int i=0;i<params.length;i++)    {     pStatement.setObject(i+1, params[i]);    }    pStatement.executeUpdate();   } catch (SQLException e) {    // TODO Auto-generated catch block    throw e;   }  }  /**   * 删除全部,不带有限制   * @param sql   * @throws SQLException   */  public void deleteall(String sql) throws SQLException  {   try(PreparedStatement pStatement=conn.prepareStatement(sql);) {         pStatement.executeUpdate();   } catch (SQLException e) {    // TODO Auto-generated catch block    throw e;   }  }  /**   * 无限制条件查找   * @param sql   * @param t 泛型类T.class   * @return ArrayList<T>   * @throws SQLException   */  public <T> ArrayList<T> select(String sql,Class<T> t) throws SQLException  {   Method[] declaredMethods = t.getDeclaredMethods();   ArrayList<T> arrayList=new ArrayList<>();   try (PreparedStatement pStatement=conn.prepareStatement(sql);)   {         try(ResultSet rSet=pStatement.executeQuery();)    {     ResultSetMetaData rData=rSet.getMetaData();     int columnCount = rData.getColumnCount();        while (rSet.next()) {      T a=t.newInstance();      for(int i=0;i<columnCount;i++)      {       String aString="set"+rData.getColumnName(i+1);       for (Method method : declaredMethods) {        if(method.getName().equalsIgnoreCase(aString))        {         method.setAccessible(true);         method.invoke(a, rSet.getObject(i+1));         break;        }       }      }      arrayList.add(a);     }    } catch (InstantiationException e) {     // TODO Auto-generated catch block     e.printStackTrace();    } catch (IllegalAccessException e) {     // TODO Auto-generated catch block     e.printStackTrace();    } catch (IllegalArgumentException e) {     // TODO Auto-generated catch block     e.printStackTrace();    } catch (InvocationTargetException e) {     // TODO Auto-generated catch block     e.printStackTrace();    }   } catch (SQLException e) {    // TODO Auto-generated catch block    throw e;   }   return arrayList;  }  /**   * 返回表中数据行数   * @param tableName 数据库表名   * @return 行数   * @throws SQLException   */  public int count(String tableName) throws SQLException  {   String sql="select count(*) from "+tableName;   try(PreparedStatement pStatement=conn.prepareStatement(sql);     ResultSet rsSet=pStatement.executeQuery(); )       if(rsSet.next())    {     return rsSet.getInt(1);    }     } catch (SQLException e) {    // TODO Auto-generated catch block    throw e;   }   return 0;  }  /**   * 判断数据是否存在   * @param sql 带占位符?的sql语句   * @param params 替换占位符的数据,动态数组   * @return boolean   * @throws SQLException   */  public boolean isExist(String sql,Object...params) throws SQLException     try(PreparedStatement pStatement=conn.prepareStatement(sql);)   {    for(int i=0;i<params.length;i++)    {     pStatement.setObject(i+1, params[i]);    }    try(ResultSet rsSet=pStatement.executeQuery();) {     if(rsSet.next())     {      return true;     }    } finally {         }   } catch (SQLException e) {    // TODO Auto-generated catch block    throw e;   }   return false  }  /**   * 创建实例   * @param url 数据库url   * @param username 用户名   * @param password 密码   * @return consql对象   * @throws SQLException   */  public static Consql getnewInstance(String url,String username,String password) throws SQLException  {   if(consql==null)    consql=new Consql(url, username, password);   return consql;   }  //垃圾回收,貌似并不能达到析构函数的效果  protected void finalize() throws Throwable  {   if(conn!=null)   {    conn.close();    }   super.finalize();  } }

以上就是详解JDBC数据库链接及相关方法的封装的实例详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

原文链接:http://www.cnblogs.com/PersistWp/p/7398111.html