做这个小项目少不了与数据库的关联,为了避免多次重复代码,封装一个专门与数据库进行交互的数据库工具类。该类并不是要一步到位的完善好,而是在编码的过程中逐渐发现怎样封装更好更方便去使用而逐步的完善
目前部分代码如下,有需要的时候在进行更新:
DBUtil类进行数据库连接,使用读取文件的方式来确定数据库,而不是在代码中写死,所以
private static Properties dbProps = new Properties();
用这个文件来保存相应数据库的信息,同时写一个静态代码块,在加载这个类的时候加载JDBC并且读取该文件
static { try { InputStream is = DBUtil.class.getResourceAsStream("/dbinfo.properties"); dbProps.load(is); Class.forName(dbProps.getProperty("db.driver")); } catch (Exception e) { e.printStackTrace(); } }
使用数据库最多的就是增删改查,使用到的基本的类:
Connection PreparedStatement ResultSet
增删改的差别在sql语句,所以“增删改”可以写成一个方法,“查”单独写成一个方法
1:获得Connection
public static Connection getCon() { try { return DriverManager.getConnection( dbProps.getProperty("db.connectUrl"), dbProps.getProperty("db.user"), dbProps.getProperty("db.pwd")); }catch(Exception e) { e.printStackTrace(); return null; } }
2:查询全部信息,传入sql语句和一个实体类
利用java的反射技术,实例化一个类,并且从数据库中查询数据并挨个进行赋值,最终添加进一个List里面,但是List里面的元素类型是Object,使用的时候进行强制类型转换即可
/** * 查询全部信息 * @param sql 写明要查询的表即可 * @param cls 传入一个实体类,信息会存进这个实体类中 * @return 返回一个传入实体类的数组 */ public static List<Object> findAll(String sql, Class cls){ Connection con = null; PreparedStatement pstm = null; ResultSet rs = null; List<Object> list = new ArrayList<Object>(); try{ con = getCon(); pstm = con.prepareStatement(sql); ResultSetMetaData rsmd = pstm.getMetaData(); int size = rsmd.getColumnCount(); rs = pstm.executeQuery(); while(rs.next()){ Object obj = cls.newInstance(); for(int i = 0 ; i < size ; i++){ Field f = cls.getDeclaredField(rsmd.getColumnName(i+1)); f.setAccessible(true); f.set(obj, rs.getObject(i+1)); } list.add(obj); } return list; }catch(Exception e){ e.printStackTrace(); return null; }finally{ close(rs, pstm, con); } }
3:更新操作即对数据库的增删改
传入的sql语句和sql语句中占位符所需要的数据的一个数组
在方法中填充成完整的sql语句,然后执行
注:Statement 和 PreparedStatement 不同
Statement使用字符串连接,PreparedStatement可以使用?做占位符,防止SQL注入
public static int executeUpdate(String sql, Object[] params){ Connection con = null; PreparedStatement pstm = null; try{ con = getCon(); pstm = con.prepareStatement(sql); if(params != null && params.length > 0){ for(int i = 0 ; i < params.length ; i++){ pstm.setObject(i+1, params[i]); } } return pstm.executeUpdate(); }catch(Exception e){ e.printStackTrace(); return -1; }finally{ close(null, pstm, con); } }
4:使用完后要进行close操作
public static void close(ResultSet rs, PreparedStatement pstm, Connection con) { try { if(rs!=null) rs.close(); if(pstm!=null) pstm.close(); if(con!=null) con.close(); }catch(Exception e){ e.printStackTrace(); } }
这是目前所主要用到的方法,如有需要还会有添加和优化