目录

JDBC的简单使用

向JDBC注入攻击

防止注入攻击

自建JDBC工具类

自建工具类优化--使用配置文件

使用数据库连接池优化工具类

JDBC的简单使用

  1. package Test;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.Driver;
  5. import java.sql.DriverManager;
  6. import java.sql.DriverPropertyInfo;
  7. import java.sql.ResultSet;
  8. import java.sql.SQLException;
  9. import java.sql.Statement;
  10.  
  11. /*JDBCsun公司提供的一套标准数据库操作规范
  12. * JDBC使用步骤
  13. * 1 注册驱动--告诉JVM使用的是哪一个数据库
  14. * 2 获得连接--使用JDBC中的类完成对MySQL数据库的连接
  15. * 3 获得语句执行平台--通过连接对象获取SQL语句1的执行者对象
  16. * 4 执行sql语句--使用执行者对象向数据库执行SQL语句,并获取执行后的结果
  17. * 5 处理结果
  18. * 6 释放资源
  19. * ----------在使用之前一定要先导入jar包
  20. */
  21.  
  22. public class Main{
  23. public static void main(String[] args) throws ClassNotFoundException, SQLException {
  24. //1 注册驱动,但查看源码发现这样会注册两次
  25. //DriverManager.registerDriver(new Driver());
  26. //使用反射技术注册,在这里类名可能找不到因此抛出类名查不到的异常
  27. Class.forName("com.mysql.jdbc.Driver");
  28.  
  29. //2连接数据库 url:数据库 jdbc:jdbc:mysql://连接主机IP:端口号//数据库名
  30. String url ="jdbc:mysql://localhost:3306/mybase";
  31. String username="root";//用户名
  32. String password="123";//密码
  33. //连接,可能连接不到抛出SQL异常
  34. Connection con =DriverManager.getConnection(url, username,password);
  35.  
  36. //3 获得语句执行平台,通过数据库连接对象获得SQL语句的执行者对象,注意导包为sql的包
  37. Statement stat=con.createStatement();
  38. //查询语句
  39. String sql ="Select * from titles";
  40.  
  41. //4 调用执行者对象方法,执行SQL语句获取结果集
  42. ResultSet rs=stat.executeQuery(sql);
  43. //5 处理结果集
  44. while(rs.next()){
  45. System.out.println(rs.getString("emp_no")+" "+rs.getString("title"));
  46. }
  47.  
  48. //6 释放资源
  49. rs.close();
  50. stat.close();
  51. con.close();
  52. }
  53. }

向JDBC注入攻击

创建数据表

  1. CREATE TABLE users(
  2. username VARCHAR(20),
  3. PASSWORD VARCHAR(10)
  4. );
  5.  
  6. INSERT INTO users VALUES('a',''),('b','');

待注入攻击的代码:

  1. package Test;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.Driver;
  5. import java.sql.DriverManager;
  6. import java.sql.DriverPropertyInfo;
  7. import java.sql.ResultSet;
  8. import java.sql.SQLException;
  9. import java.sql.Statement;
  10. import java.util.Scanner;
  11.  
  12. /*MySQL注入攻击
  13. * 用户登录案例
  14. */
  15.  
  16. public class Main{
  17. public static void main(String[] args) throws ClassNotFoundException, SQLException {
  18. Class.forName("com.mysql.jdbc.Driver");
  19.  
  20. //2连接数据库 url:数据库 jdbc:jdbc:mysql://连接主机IP:端口号//数据库名
  21. String url ="jdbc:mysql://localhost:3306/mybase";
  22. String username="root";//用户名
  23. String password="123";//密码
  24. Connection con =DriverManager.getConnection(url, username,password);
  25. Statement stat=con.createStatement();
  26. //查询语句
  27. Scanner sc=new Scanner(System.in);
  28. String user=sc.next();
  29. String pass=sc.next();
  30. String sql ="Select * from users where username= '"+user+"' and password= '"+pass+"'";
  31.  
  32. //4 调用执行者对象方法,执行SQL语句获取结果集
  33. ResultSet rs=stat.executeQuery(sql);
  34. System.out.println(sql);
  35. //5 处理结果集
  36. while(rs.next()){
  37. System.out.println(rs.getString("username")+" "+rs.getString("password"));
  38. }
  39.  
  40. //6 释放资源
  41. rs.close();
  42. stat.close();
  43. con.close();
  44. }
  45. }

 代码运行结果:

攻击的原理:

利用SQL语句:Select * from users where username= 'a' and password= '1'or'1=1',这样由于最后一个是或运算那么就会显示出来所有的数据,因此在输入时只要想办法凑成这样的形式就可以了。

输入:aa 12'or'1=1  这样便可以完成攻击,即使输入的用户名不对也可以正常登陆。

防止注入攻击

  1. package Test;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.Driver;
  5. import java.sql.DriverManager;
  6. import java.sql.DriverPropertyInfo;
  7. import java.sql.PreparedStatement;
  8. import java.sql.ResultSet;
  9. import java.sql.SQLException;
  10. import java.sql.Statement;
  11. import java.util.Scanner;
  12.  
  13. /*MySQL防止注入攻击--采用statement的子类preparedstatement
  14. * 还可以用占位符实现增删改查等操作
  15. */
  16.  
  17. public class Main{
  18. public static void main(String[] args) throws ClassNotFoundException, SQLException {
  19. Class.forName("com.mysql.jdbc.Driver");
  20.  
  21. //2连接数据库 url:数据库 jdbc:jdbc:mysql://连接主机IP:端口号//数据库名
  22. String url ="jdbc:mysql://localhost:3306/mybase";
  23. String username="root";//用户名
  24. String password="123";//密码
  25. Connection con =DriverManager.getConnection(url, username,password);
  26.  
  27. //查询语句
  28. Scanner sc=new Scanner(System.in);
  29. String user=sc.next();
  30. String pass=sc.next();
  31. //用?占位符代替参数
  32. String sql ="Select * from users where username=? and password= ?";
  33. PreparedStatement pds=con.prepareStatement(sql);
  34. pds.setObject(1, user);
  35. pds.setObject(2, pass);
  36. //4 调用执行者对象方法,执行SQL语句获取结果集
  37. ResultSet rs=pds.executeQuery();
  38. System.out.println(sql);
  39. //5 处理结果集
  40. while(rs.next()){
  41. System.out.println(rs.getString("username")+" "+rs.getString("password"));
  42. }
  43.  
  44. //6 释放资源
  45. rs.close();
  46. pds.close();
  47. con.close();
  48. }
  49. }

自建JDBC工具类

JDBCUtils.class文件

  1. package Test;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import java.sql.Statement;
  8.  
  9. public class JDBCUtils {
  10. private JDBCUtils(){}
  11. private static Connection con;
  12.  
  13. static{
  14. try {
  15. Class.forName("com.mysql.jdbc.Driver");
  16. //2连接数据库 url:数据库 jdbc:jdbc:mysql://连接主机IP:端口号//数据库名
  17. String url ="jdbc:mysql://localhost:3306/mybase";
  18. String username="root";//用户名
  19. String password="123";//密码
  20. con =DriverManager.getConnection(url, username,password);
  21. } catch (Exception e) {
  22. throw new RuntimeException(e+"数据库连接失败!");
  23. }
  24. }
  25. //定义静态方法,返回数据库的连接对象
  26. public static Connection getConnection(){
  27. return con;
  28. }
  29.  
  30. //释放资源
  31. public static void close(Connection con,Statement stat){
  32. if(stat!=null){
  33. try {
  34. stat.close();
  35. } catch (SQLException e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. }
  39. }
  40.  
  41. if(con!=null){
  42. try {
  43. con.close();
  44. } catch (SQLException e) {
  45. // TODO Auto-generated catch block
  46. e.printStackTrace();
  47. }
  48. }
  49. }
  50. //重载,关闭结果集
  51. public static void close(Connection con,Statement stat,ResultSet rs){
  52. //注意释放的顺序
  53. if(rs!=null){
  54. try {
  55. rs.close();
  56. } catch (SQLException e) {
  57. // TODO Auto-generated catch block
  58. e.printStackTrace();
  59. }
  60. }
  61.  
  62. if(stat!=null){
  63. try {
  64. stat.close();
  65. } catch (SQLException e) {
  66. // TODO Auto-generated catch block
  67. e.printStackTrace();
  68. }
  69. }
  70.  
  71. if(con!=null){
  72. try {
  73. con.close();
  74. } catch (SQLException e) {
  75. // TODO Auto-generated catch block
  76. e.printStackTrace();
  77. }
  78. }
  79. }
  80. }

测试代码:

  1. package Test;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import Test.JDBCUtils;
  8.  
  9. public class JDBCTset {
  10. public static void main(String[] args) throws SQLException {
  11. Connection con =JDBCUtils.getConnection();
  12. PreparedStatement pst=con.prepareStatement("SELECT * FROM titles");
  13. ResultSet rs =pst.executeQuery();
  14. while(rs.next()){
  15. System.out.println(rs.getString("title"));
  16. }
  17. //释放资源
  18. JDBCUtils.close(con, pst);
  19. }
  20. }

自建工具类优化--使用配置文件

优化代码

  1. package Test;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5.  
  6. /*在前面的代码中由于数据库用户名,密码直接在静态代码块中,相当于写死了代码,不容易修改
  7. * 因此采用properties配置文件,方便后期维护。配置文件建议放在src下,方便自动拷贝bin目录下
  8. *
  9. */
  10.  
  11. import java.sql.Connection;
  12. import java.sql.DriverManager;
  13. import java.sql.ResultSet;
  14. import java.sql.SQLException;
  15. import java.sql.Statement;
  16. import java.util.Properties;
  17.  
  18. public class JDBCUtils {
  19. private JDBCUtils(){}
  20. private static Connection con;
  21. private static String driverClass;
  22. private static String url;
  23. private static String username;
  24. private static String password;
  25. //放到静态代码块中保证读取配置文件,获取连接只执行一次
  26. static{
  27. try{
  28. readConfig();
  29. //反射
  30. Class.forName(driverClass);
  31. con=DriverManager.getConnection(url,username,password);
  32. }catch(Exception e){
  33. throw new RuntimeException("数据库连接失败!");
  34. }
  35.  
  36. }
  37.  
  38. private static void readConfig() throws IOException{
  39. //通过字节流,使用类加载器读取配置文件的内容
  40. InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("database.properties");
  41. Properties pro = new Properties();
  42. pro.load(in);
  43. driverClass=pro.getProperty("driverClass");
  44. url = pro.getProperty("url");
  45. username=pro.getProperty("username");
  46. password=pro.getProperty("password");
  47. }
  48.  
  49. //定义静态方法,返回数据库的连接对象
  50. public static Connection getConnection(){
  51. return con;
  52. }
  53.  
  54. //释放资源
  55. public static void close(Connection con,Statement stat){
  56. if(stat!=null){
  57. try {
  58. stat.close();
  59. } catch (SQLException e) {
  60. // TODO Auto-generated catch block
  61. e.printStackTrace();
  62. }
  63. }
  64.  
  65. if(con!=null){
  66. try {
  67. con.close();
  68. } catch (SQLException e) {
  69. // TODO Auto-generated catch block
  70. e.printStackTrace();
  71. }
  72. }
  73. }
  74. //重载,关闭结果集
  75. public static void close(Connection con,Statement stat,ResultSet rs){
  76. //注意释放的顺序
  77. if(rs!=null){
  78. try {
  79. rs.close();
  80. } catch (SQLException e) {
  81. // TODO Auto-generated catch block
  82. e.printStackTrace();
  83. }
  84. }
  85.  
  86. if(stat!=null){
  87. try {
  88. stat.close();
  89. } catch (SQLException e) {
  90. // TODO Auto-generated catch block
  91. e.printStackTrace();
  92. }
  93. }
  94.  
  95. if(con!=null){
  96. try {
  97. con.close();
  98. } catch (SQLException e) {
  99. // TODO Auto-generated catch block
  100. e.printStackTrace();
  101. }
  102. }
  103. }
  104. }

测试代码

  1. package Test;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.SQLException;
  7. import Test.JDBCUtils;
  8.  
  9. public class JDBCTset {
  10. public static void main(String[] args) throws SQLException {
  11. Connection con =JDBCUtils.getConnection();
  12. //当能输出数据库连接时边说用工具类正常了
  13. System.out.println(con);
  14. //由于是简单的测试,因此不用释放资源
  15. //JDBCUtils.close(con, pst);
  16. }
  17. }

使用数据库连接池优化工具类

优化代码:

  1. package Test;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.Properties;
  5.  
  6. import javax.sql.DataSource;
  7.  
  8. /*
  9. * JDBC连接池工具类,使用连接池专门负责数据库的连接
  10. * JDBC连接池简化了sql语句中的增删改查操作,方便代码编写
  11. */
  12. import org.apache.commons.dbcp.BasicDataSource;
  13.  
  14. public class JDBCUtils {
  15. private JDBCUtils(){}
  16. private static String driverClass;
  17. private static String url;
  18. private static String username;
  19. private static String password;
  20. private static BasicDataSource datasource =new BasicDataSource();
  21. //放到静态代码块中保证读取配置文件,获取连接只执行一次
  22. static{
  23. try {
  24. readConfig();
  25. //数据库连接配置
  26. datasource.setDriverClassName(driverClass);
  27. datasource.setUrl(url);
  28. datasource.setUsername(username);
  29. datasource.setPassword(password);
  30. //对象连接池中的数量配置,这些配置可以不用配置的
  31. datasource.setInitialSize(10);//初始化的连接数
  32. datasource.setMaxActive(8);//最大连接数
  33. datasource.setMaxIdle(5);//最大空闲数
  34. datasource.setMinIdle(1);//最小空闲数
  35. } catch (IOException e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. }
  39. }
  40.  
  41. private static void readConfig() throws IOException{
  42. //通过字节流,使用类加载器读取配置文件的内容
  43. InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("database.properties");
  44. Properties pro = new Properties();
  45. pro.load(in);
  46. driverClass=pro.getProperty("driverClass");
  47. url = pro.getProperty("url");
  48. username=pro.getProperty("username");
  49. password=pro.getProperty("password");
  50. }
  51.  
  52. //定义静态方法,返回数据库的连接对象
  53. public static DataSource getDataSource(){
  54. return datasource;
  55. }
  56. }

测试代码:

  1. package Test;
  2.  
  3. import java.sql.SQLException;
  4. import java.util.List;
  5.  
  6. import org.apache.commons.dbutils.QueryRunner;
  7. import org.apache.commons.dbutils.handlers.ArrayHandler;
  8. import org.apache.commons.dbutils.handlers.ArrayListHandler;
  9.  
  10. public class JDBCTset {
  11. private static QueryRunner qr=new QueryRunner(JDBCUtils.getDataSource());
  12.  
  13. public static void main(String[] args) throws SQLException {
  14. String sql="select * from titles";
  15. //ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中。这是dbutils所特有的
  16. List<Object[]> list =qr.query(sql, new ArrayListHandler());
  17. for(Object[] objs:list){
  18. for(Object obj:objs)
  19. System.out.print(obj+"\t\t");
  20. System.out.println();
  21. }
  22. }
  23.  
  24. }

0

Java数据库小项目00---基础知识的更多相关文章

  1. Java数据库小项目02--管家婆项目

    目录 项目要求 开发环境搭建 工具类JDBCUtils 创建管家婆数据表 项目分层 MainApp层 MainView层 ZhangWuController层 ZhangWuService层 Zhan ...

  2. Java数据库小项目01--实现用户登录注册

    先实现数据库和数据表,检测正常后再做其他的 CREATE TABLE users( username ) NOT NULL, PASSWORD ) NOT NULL); INSERT INTO use ...

  3. 总结了零基础学习Java编程语言的几个基础知识要点

    很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识.本文总结了零基础学习Java编程语言的几个基础知识要点. 1先了解什么是Java的四个方面   初学者先弄清这 ...

  4. java Reflection(反射)基础知识讲解

    原文链接:小ben马的java Reflection(反射)基础知识讲解 1.获取Class对象的方式 1.1)使用 "Class#forName" public static C ...

  5. Java中实现异常处理的基础知识

    Java中实现异常处理的基础知识 异常 (Exception):发生于程序执行期间,表明出现了一个非法的运行状况.许多JDK中的方法在检测到非法情况时,都会抛出一个异常对象. 例如:数组越界和被0除. ...

  6. JAVA面试题集之基础知识

                           JAVA面试题集之基础知识 基础知识:  1.C 或Java中的异常处理机制的简单原理和应用. 当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就 ...

  7. 【Java面试】1、基础知识篇

    [Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充. 源码分享:https: ...

  8. Java IO(1)基础知识——字节与字符

    正所谓怕什么来什么,这是知名的“墨菲定律”.Java基础涵盖各个方面,敢说Java基础扎实的人不是刚毕业的学生,就是工作N年的程序员.工作N年的程序员甚至也不敢人人都说Java基础扎实,甚至精通,往往 ...

  9. Java 面试知识点解析(一)——基础知识篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

随机推荐

  1. HDU-6170 Two strings

    http://acm.hdu.edu.cn/showproblem.php?pid=6170 . 匹配任意字符,x* 匹配任意长度的 x (x 为任意字符,长度可以为 0 ) 正则表达式 #inclu ...

  2. Python 解leetcode:3. Longest Substring Without Repeating Characters

    题目描述:求一个字符串的不含重复字符的最长连续子串的长度: 思路: 使用一个哈希表保存字符出现的位置: 使用left和right分别表示子串的最左和最右字符的下标: 遍历字符串,如果当前字符在哈希表中 ...

  3. Idea中Smart Tomcat插件启动报NullPointerException问题

    如果你跟我一样用的是Idea Community社区版的话,也一定会遇到用Smart Tomcat插件启动报错的问题: 这个问题网上搜了一圈,大家好像也都遇到过了,不过也都没有找到原因和给出解决方案. ...

  4. 剪花布条 HDU - 2087(kmp,求不重叠匹配个数)

    Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入 ...

  5. 在windows系统下打包linux平台运行的go程序

    在windows系统下打包linux平台运行的go程序 1.先在main.go下打包成.exe可执行程序测试代码是否正确 //cd到main.go目录 go build //打包命令 如果打包成功则表 ...

  6. SpringBoot使用MongoDB异常问题

    一 环境介绍 SpringBoot1.5.13.RELEASE(本地) Spring Data MongoDB Java 8 MongoDB(青云) 二 问题描述 使用Studio3T或者Compas ...

  7. JS 验证字符串是否能转为json格式

    var isJSON=function (str) { if (typeof str == 'string') { try { var obj = JSON.parse(str); if (typeo ...

  8. BMP RGB888转RGB565 +上下翻转+缩放

      典型的BMP图像文件由四部分组成: (1) 位图头文件数据结构,它包含BMP图像文件的类型.文件大小和位图起始位置等信息: typedef struct tagBITMAPFILEHEADER { ...

  9. JavaScript笔记(5)

    1.DOM操作 常用的DOM操作 document.getElementById(id); //返回指定id的元素,通用 document.getElementsByTagName(tagName); ...

  10. SpringCloud多网卡配置(转)

    https://blog.csdn.net/lixiang987654321/article/details/88134324 docker部署过程中遇到如下问题: (1)docker容器创建之后,进 ...