跳到正文

【java工具类】SQLHelper超强工具类封装

经过小编的又一番努力,实现了java直接访问数据库的操作,并进行了SQLHelper超强工具类的封装操作,可以实现对数据库的增删改查等操作,此外部分还考虑到了事务、并发查询的影响! SQLHelper超强工具类封装代码如下: package com.news.dao; import java.io.*; import java.sql.*; import java.util.*; /** * @ **/ public class SqlHelper { // 定义需要的变量 private static Connection ct = null; private static Statement sm = null; private static ResultSet rs = null; private static PreparedStatement ps = null; // 解决了SQL注入漏洞 // ;连接数据库的参数 private static String url = ""; private static String username = ""; private static String driver = ""; private static String password = ""; // 读取配置文件需要的参数 private static Properties pp = null; private static FileInputStream fis = null; // 定义JAVAweb项目中读取配置文件需要的InputStream private static InputStream is = null; // 调用存储过程(不考虑存储过程) private static CallableStatement cs = null; public static void main(String args) { ct = getConn(); String sql = "select * from students"; try { ps = ct.prepareStatement(sql); rs = ps.executeQuery(); while (rs.next()) { System.out.println(rs.getInt(1) + " " + rs.getString(2) + " " + rs.getFloat(3) + " " + rs.getFloat(4) + " " + rs.getFloat(5)); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }// 预编译SQL对象 } // 把数据库查询封装成一个函数 public static ArrayList executeQueryFour(String sql, String paras) { ArrayList arrlist = new ArrayList(); for (int i = 0; i < paras.length; i++) { System.out.println("paras =" + paras); // okay!!! } System.out.println("本次要执行的SQL语句为:" + sql); try { // 加载驱动, 得到连接 ct = getConn(); ps = ct.prepareStatement(sql); System.out.println("ps = ct.prepareStatement(sql) ok"); // 给SQL语句的问号赋值 for (int i = 0; i < paras.length; i++) { System.out .println("------------本次赋值问号的SQL执行语句----------------------------------" + sql + "paras" + paras + " paras.length" + paras.length); // paras=100 paras=123456 // System.out.println("ps.setString(i) error"); ps.setString(i + 1, paras); // okay // System.out.println("本次要执行的参数"+paras+"sql"+sql+"paras.length= "+paras.length); } // ps.setString(1, paras); bug1 .error // ps.setString(2, paras); bug2 .error // java.lang.ArrayIndexOutOfBoundsException: 1 System.out.println("给问号赋值过后需要执行的SQL语句" + sql); rs = ps.executeQuery(); // 求出查询结果的列数目 ResultSetMetaData rsmd = rs.getMetaData(); int columnNum = rsmd.getColumnCount(); // 循环的从rs中取出数据, 并且放入到arraylist中去 while (rs.next()) { // 新建一个对象数组(对象数组的大小即列的大小)-----数组中存放了返回的所有结果 Object object = new Object; for (int i = 0; i < object.length; i++) { // 把查询到的所有结果放入到object中去【每一列的结果放入到一个对象中的一个元素】 object = rs.getObject(i + 1); // okay } // 把object放入到arrlist中去 arrlist.add(object); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); System.out.println("本次查询操作失败!!!"); } finally { System.out.println("本次最终执行啥情况查询语句为: " + sql); } return arrlist; } public static CallableStatement getCs() { return cs; } public static Connection getCt() { return ct; } public static ResultSet getRs() { return rs; } public static PreparedStatement getPs() { return ps; } // 加载驱动, 只需要加载一次即可 static { try { // 从dbinfo.propertities中读取配置信息 pp = new Properties(); // fis = new FileInputStream("dbinfo.properties"); // 注意:当我们使用Javaweb的时候, 读取文件要使用类加载器 is = SqlHelper.class.getClassLoader().getResourceAsStream( "dbinfo.properties"); pp.load(is); url = pp.getProperty("url"); username = pp.getProperty("username"); driver = pp.getProperty("driver"); password = pp.getProperty("password"); System.out.println(url + " " + username + " " + driver + " " + password); Class.forName(driver); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (fis != null) { fis.close(); } } catch (Exception e2) { // TODO: handle exception e2.printStackTrace(); } fis = null; } } // 得到连接 public static Connection getConn() { try { ct = DriverManager.getConnection(url, username, password); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return ct; } // 分页问题 public static ResultSet executeQueryTwo(String sql, String paras) { return null; } // 调用存储过程, 有返回值 // sql call procedure() public static CallableStatement callProlTwo(String sql, String inParas, Integer outParas) { try { ct = getConn(); cs = ct.prepareCall(sql); if (inParas != null) { for (int i = 0; i < inParas.length; i++) { cs.setObject(i + 1, inParas); } } // 给outParas参数赋值 if (outParas != null) { for (int i = 0; i < outParas.length; i++) { cs.registerOutParameter(inParas.length + 1 + i, outParas); } } // 执行存储过程 cs.execute(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); throw new RuntimeException(e.getMessage()); } finally { // 资源无需关闭 } return cs; } // 调用存储过程 // sql {call 过程(?, ?, ?)} /* * create or replace procedure pro1(v_in_empno, number, v_in_ename varchar2) * is --定义变量 begin --执行语句 insert into emp (empno, ename) values * (v_in_empno,v_in_ename); end; */ public static void callProl(String sql, String paras) { try { ct = getConn(); cs = ct.prepareCall(sql); // 给问号赋值 if (paras != null) { for (int i = 0; i < paras.length; i++) { cs.setObject(i + 1, paras); } } cs.execute(); System.out.println("存储过程调用成功!!!"); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); throw new RuntimeException(e.getMessage()); } finally { close(rs, cs, ct); } } // 执行一个统一的select(查询操作, 需要手动关闭资源) public static ResultSet executeQuery(String sql, String paras) { // System.out.println("当前SQL执行语句 "+sql); try { ct = getConn(); ps = ct.prepareStatement(sql); // ps.setString(1, paras); // ps.setString(2, paras); if (paras != null) { for (int i = 0; i < paras.length; i++) { // ps.setObject(i+1, paras); ps.setString(i + 1, paras); // System.out.println("paras"+paras); } } rs = ps.executeQuery(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); throw new RuntimeException(e.getMessage()); } return rs; } // 事务可以解决SQL语句同时执行成功, 要么同时执行失败, 避免出现单提交 // 如果有多个update /insert /delete,需要考虑事务 public static void executeUpdateTwo(String sql, String paras) { try { // 获取链接 ct = getConn(); // 此时用户传入的是多个SQL语句 ct.setAutoCommit(false); /* * SQL语句执行格式:(一条SQL语句对应多个参数) sql1 aaa1, bbb1 sql2 aaa2, bbb2 sql3 * aaa3, bbb3 sql4 aaa4, bbb4 */ // 先取出sql语句 for (int i = 0; i < sql.length; i++) { ps = ct.prepareStatement(sql); // paras是对应的第i条SQL语句对应的参数 数组 if (paras != null) { // 开始取出第i条SQL语句对应的参数 for (int j = 0; j < paras.length; j++) { // 取出第i条SQL语句, 把i条SQL语句对应的第j个参数赋值给第j+1个参数 ps.setString(j + 1, paras); } } ps.executeUpdate(); } // int i = 9/0; //系统出现异常, 数据库中的表也不会出现异常 ct.commit(); System.out.println("事务提交成功!!!"); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); // 事务如果提交失败就回滚 try { // 系统出现异常, 回滚 ct.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); System.out.println("回滚失败!!!"); } throw new RuntimeException(e.getMessage()); } finally { close(rs, ps, ct); } } // 数据库的修改 update / delete / insert // sql : update emp set ename = ? where id = ? // paras: {"abc", 23} public static void executeUpdate(String sql, String paras) { // 把参数给?赋值 try { ct = getConn(); ps = ct.prepareStatement(sql); if (paras != null) { // 如果使用for循环增强, 不太好(不知道是第几个问号) for (int i = 0; i < paras.length; i++) { ps.setString(i + 1, paras); } } // 执行SQL语句 // int num = ps.executeUpdate(); 去过用update()更新, 那么执行成功的就不仅是一行数据 ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); // 开发阶段需要打印出异常 // 抛出运行异常(可以给调用该函数的一个选择, 调用者可以处理, 也可以放弃处理) throw new RuntimeException(e.getMessage()); } finally { close(rs, ps, ct); } } // 关闭资源的函数 // 由于prepareStatement是Statement的子接口, 因此在这里我们选择关闭Statement public static void close(ResultSet rs, Statement ps, Connection ct) { try { if (rs != null) { rs.close(); rs = null; } if (ps != null) { ps.close(); ps = null; } if (ct != null) { ct.close(); ct = null; } System.out.println("资源关闭成功"); } catch (Exception e2) { // TODO: handle exception e2.printStackTrace(); } } } 以上就是小编本期提供的Java访问数据库实现的基本操作的封装,读者可以直接复制代码调用即可!注意,转载请注明出处,我爱科技论坛!

评论

填写昵称与邮箱即可评论,无需登录。

推荐阅读

关于我们

最有热度的黑科技社区

高热度网博客是面向全球开发者的技术交流社区,专注于分享黑科技、实用工具、免费资源等技术文章,涉及前端HTML,CSS,Javascript,NodeJS等领域的软件视频教程及资源下载。