DButil工具类的定义

定义一个工具类,类中实现连接方法,释放资源方法,查询方法,修改方法。

interface IRowMapper{void rowMapper(ResultSet rs);
}
public class DButil {static Connection con =null;static Statement sta =null;static String sql =null;static ResultSet result = null;public static Connection getConnection() {...}public static boolean upDate(String sql) {...}public static void sel(IRowMapper rowMapper,String sql) {...}private static void close(Statement statement,Connection connection) {...}private static void close(ResultSet result,Statement statement,Connection connection) {...}
}

1、连接方法

public static Connection getConnection() {try {Class.forName("com.mysql.jdbc.Driver");return DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "");    } catch (Exception e) {e.printStackTrace();}return null;}

此方法返回一个Connection型数据使用时可以直接Connection con = DButil.getConnection();来获取连接 。
2、释放资源

private static void close(Statement statement,Connection connection) {try {if (statement!=null) {statement.close();}} catch (SQLException e) {e.printStackTrace();}try {if (connection!=null) {connection.close();}} catch (SQLException e) {e.printStackTrace();}}private static void close(ResultSet result,Statement statement,Connection connection) {try {if (result!=null) {result.close();}} catch (SQLException e) {e.printStackTrace();}close(statement,connection);}

此方法在完成查询或者修改操作后,根据所使用的资源情况进行调用不同的资源释放方法。
3、查询

public static void sel(IRowMapper rowMapper,String sql) {try {con = getConnection();sta = con.createStatement();result = sta.executeQuery(sql);rowMapper.rowMapper(result);} catch (Exception e) {e.printStackTrace();}finally {close(result, sta, con);}}

此查询方法同样使用了命令模式,方法参数列表中的IRowMapper为接口,使用该方法时需要创建该接口实现类,在实现类的rowMapper()方法中实现查询。
4、修改

public static boolean upDate(String sql) {con = getConnection();    try {sta = con.createStatement();return sta.executeUpdate(sql)>0;} catch (SQLException e) {e.printStackTrace();}finally {close(result, sta, con);}return false;}

修改方法返回boolean型数据,在使用该方法时,传入sql语句,直接判断upDate(sql)是否为真,为真则修改成功。

DButil工具类的使用

1、查询

public class Test {public static void main(String[] args){String sql = "select * from user_info";class RowMapper implements IRowMapper{@Overridepublic void rowMapper(ResultSet res) {try {while (res.next()) {String student_id = res.getString("id");String userName = res.getString("user_name");String password = res.getString("password");System.out.println(student_id+" ,"+userName+" ,"+password);}} catch (SQLException e) {e.printStackTrace();}}        }IRowMapper rowMapper = new RowMapper();DBUtil.select(sql, rowMapper);}
}

执行结果:

但是查询方法在实现登录时会出现问题,如下

public class Login {public static void main(String[] args){Scanner sc = new Scanner(System.in);System.out.println("请输入用户名:");String userName= sc.nextLine();System.out.println("请输入密码:");String password = sc.nextLine();String sql = "select * from user_info where user_name='"+userName+"' and password='"+password+"'";class RowMapper implements IRowMapper{@Overridepublic void rowMapper(ResultSet res) {try {if (res.next()) {String userName = res.getString("user_name");System.out.println(userName+"登录成功");return;}} catch (SQLException e) {e.printStackTrace();}System.out.println("账号密码错误");}      }IRowMapper rowMapper = new RowMapper();DButil.sel(rowMapper, sql);}
}

执行用户登录结果如下:



前两种情况没什么问题,但最后一种情况登录成功显然出现问题,数据库表中显然没有用户名:123
密码:1’ or ‘1’='1 的信息,这种情况就是SQL注入,此时实际上传入的sql语句已经变为:
select * from user_info where user_name=‘123’ and password=‘1’ or ‘1’=‘1’,显然成立。
解决这个问题要重载查询工具的代码,如下:

public static boolean upDate(String sql,Object...arrays) {con = getConnection();PreparedStatement preparedStatement =null;try {preparedStatement = con.prepareStatement(sql);for (int i = 1; i <=arrays.length; i++) {preparedStatement.setObject(i, array[i-1]);//根据传入参数个数进行逐次拼接。}return preparedStatement.executeUpdate()>0;//此时executeUpdate()不用传入sql,因为sql语句已经执行。}catch(SQLException e) {e.printStackTrace();}finally {close(result, preparedStatement, con);}return false;}

在重载该方法时使用了PreparedStatement类,继承于Statement。

public class Login {public static void main(String[] args){Scanner sc = new Scanner(System.in);System.out.println("请输入用户名:");String userName= sc.nextLine();System.out.println("请输入密码:");String password = sc.nextLine();String sql = "select * from user_info where user_name =? and password =?";class RowMapper implements IRowMapper{@Overridepublic void rowMapper(ResultSet res) {try {if (res.next()) {String userName = res.getString("user_name");System.out.println(sql);System.out.println(userName+"登录成功");return;}} catch (SQLException e) {e.printStackTrace();}System.out.println("账号密码错误");}      }IRowMapper rowMapper = new RowMapper();DButil.sel(rowMapper, sql,userName,password);//此处调用重载的sel方法}
}

再次进行SQL注入:

防止SQL注入成功!
2、修改
简单测试下修改中的删除:

public class Update {public static void main(String[] args) {String sql = "delete from user_info";if (DBUtil.update(sql)) {System.out.println("YSE");}else {System.out.println("NO");}}
}

执行结果:YES
为了防止SQL注入导致不受控制的修改表中信息,所以也将upDate()方法进行了重载,重载后如下:

//重载upDate
public static boolean upDate(String sql,Object...arrays) {con = getConnection();PreparedStatement preparedStatement =null;try {preparedStatement = con.prepareStatement(sql);for (int i = 1; i <=arrays.length; i++) {preparedStatement.setObject(i, array[i-1]);}return preparedStatement.executeUpdate()>0;}catch(SQLException e) {e.printStackTrace();}finally {close(result, preparedStatement, con);}return false;
}

调用重载update()的方法如下

public class Test {public static void main(String[] args){Scanner sc = new Scanner(System.in);System.out.println("请输入用户名:");String userName= sc.nextLine();System.out.println("请输入密码:");String password = sc.nextLine();String sql = "UPDATE user_info SET password = ? WHERE user_name = ? ";if (DButil.upDate(sql,password,userName)) {System.out.println("设置密码成功");}else {System.out.println("设置密码失败");}}
}

该代码演示了用户设置密码的过程,只为了测试SQL注入,实际过程并不这样设置密码。

简单实现DButil工具类相关推荐

  1. 小汤学编程之JDBC番外篇——DBUtil工具类

    一.编写 在学完dbutils框架和DataSource连接池后,我们已经可以较轻松的查询和操作数据库了,但是每次进行查询和操作时,都需要配置数据库连接相关信息.获取连接池.等一系列重复的操作,故我们 ...

  2. wsm-lucene 一个简单的Lucene工具类

    代码地址: https://gitee.com/shaojiepeng/wsm-lucene wsm-lucene 一个简单的Lucene工具类,通过注释的方式来配置构建索引的字段.提供新建索引.查找 ...

  3. 使用Python 封装一个简单的Mysql工具类

    pymysql操作mysql,虽然简单,但每次都要链接数据库,获取游标,关闭游标,关闭链接.这些操作无技术含量,还要重复编写!!想一想不如封装一个DBUtil,来提高开发效率. 要编写工具类首先要把公 ...

  4. 一个简单的数据库工具类

    为什么80%的码农都做不了架构师?>>>    接上面一片博文,自己弄了一个简单的数据库操作工具类: /** 创建日期 2014-6-5** TODO 要更改此生成的文件的模板,请转 ...

  5. java简单密码校验工具类及弱密码说明

    1.连续性弱密码校验 描述:密码连续性校验是指123456,654321,abcdefg,gfedcba等数字和字母顺序是连续的字符称之为连续性弱密码. 校验方式:PassWordUtil.java通 ...

  6. php 一个简单正则表达式,PHP中正则表达式回顾(3)--编写一个简单的正则表达式工具类...

    跟着视频的讲解,也亲手敲了这么一个正则表达式的类,感觉很不错,真是温故而知新,本来想把注释写的逼格高一点的,今天晚了有点累,先简单的写一下,有时间了再完善完善. class regexTool{ // ...

  7. java redis缓存工具类_util: 对日常工作中常见的工具类进行打包: 1、数据库:DBUtil工具类 2、Redis缓存:JedisUtil工具类...

    /** * 功能:使用原始SQL查询单条记录 * 返回每条记录封装到Map */ public static void demo1_1() { DBUtil db = new DBUtil(); tr ...

  8. Android 自定义Camera相机(封装工具类贼简单)

    背景 目前公司的项目都是,针对生物认证来进行一些验证之类的功能,比方说,交互式活体检测,人脸1v1(对比),人脸1vN(搜索).用系统自带的相机?当然是不够用了,不够用那就自定义啦,就像是前几天七夕, ...

  9. Unity 工具类 之 WWW/UnityWebRequest 下载压缩文件(zip),解压到本地且加载使用解压数据的简单案例(内也含压缩文件例子)

    Unity 工具类 之 WWW/UnityWebRequest 网络下载压缩文件(zip),解压到本地,且加载使用解压数据的简单案例(内也含压缩文件例子) 目录 Unity 工具类 之 WWW/Uni ...

  10. java代码实现id_使用java代码实现简单的ID自增的工具类

    在一些简单的业务中可能需要一些ID.这些ID是使用java代码实现的并不是通过数据库的自增实现的.下面是我写的一个简单的ID工具类,在使用的过程中你需要将最后一次的编号保存下来,你可以建一张表来维护这 ...

最新文章

  1. 华东师范大学2019年高等代数考研试题
  2. 解决非浏览器客户端请求nginx无法命中缓存的问题
  3. python软件桌面图标_python制作一个桌面便签软件
  4. python日期判断星座_python实现根据月份和日期得到星座的方法
  5. Dynamic Web TWAIN扫描识别工具改变缓冲区图像大小
  6. Tomcat5.5 配置mysql数据库连接池
  7. win10 uwp unix timestamp 时间戳 转 DateTime
  8. 微机化远动系统与计算机网络,远动技术教案_第3章_微机监控系统数据通信网络结构及原理.pdf...
  9. java怎么设置404界面_如何使用Spring MVC显示自定义的404 Not Found页面
  10. [转]ABAP动态取得数据
  11. CDQ解决一些三维偏序的问题
  12. c语言 万年历问题,【数组函数面试题】面试问题:万年历的C语言… - 看准网
  13. html5坦克游戏ppt说明,HTML5制作的坦克游戏
  14. WTL 自绘控件库 (CQsComboBox)
  15. Lambda表达式和方法引用综合案例(获取年龄最大的两个用户的 姓)
  16. matlab 自定义对象,面向对象: MATLAB 的自定义类 [MATLAB]
  17. 车牌摇号 程序设计题
  18. 向图档插入外部DWG图片 auto CAD .NET二次开发
  19. 医学图像分割 unet实现(一)
  20. 逻辑覆盖测试用例设计

热门文章

  1. jsplumb流程图demo
  2. 趋势科技防毒墙-网络版(OfficeScan)客户端管理工具
  3. oracle12c下载安装
  4. 在android系统中制作系统签名jks
  5. vray5.1 for sketchup 安装教程
  6. ESP32 LVGL8.1 ——Roller 滚动 (Roller 24)
  7. 联众打码写滑动_自己写了一个答题的软件现在分享一下(在分享一下联众打码源码调用) _ 综合讨论 - 按键精灵论坛...
  8. VS2008下easyMule-VeryCD源代码的编译
  9. linux机顶盒线刷工具,机顶盒刷机包通用版|PhoenixSuitpacket一键刷机工具 V1.10 官方最新版 下载_当下软件园_软件下载...
  10. QT6安装教程(兼容QT5、QT4)