zoukankan      html  css  js  c++  java
  • JDBC入门

    JDBC的概述

    JDBC的全称为:Java DataBase Connectivity(java数据库连接)。

    以前没有jdbc的时候,需要了解每个数据库的具体驱动模式,而现在只要了解sun公司对jdbc的一些规范即可。

    JDBC的入门

    1)搭建开发环境

    在数据库中创建表和数据

    引入数据库驱动包

    将驱动包添加到构建路径当中

    2)编写程序

    使用Junit

    点击@Test那一行前面的错误标识就可以导入JUnit相关jar包,此时demo1方法就可以像主方法一样使用了

    JUnit的详细内容会在稍后介绍

     1 package com.imooc.jdbc.demo1;
     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 import org.junit.Test;
    10 
    11 import com.mysql.jdbc.Driver;
    12 
    13 public class JDBCDemo1 {
    14     
    15 
    16     @Test
    17     /**
    18      * JDBC的入门程序
    19      */
    20     public void demo1(){
    21         
    22         try {
    23             // 1.加载驱动
    24 //            DriverManager.registerDriver(new Driver());// 会导致驱动注册两次。
    25             Class.forName("com.mysql.jdbc.Driver"); 
    26             // 2.获得连接
    27             Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "abc");
    28             // 3.创建执行SQL语句的对象,并且执行SQL
    29             // 3.1创建执行sql的对象
    30             String sql = "select * from user";
    31             Statement stmt = conn.createStatement();
    32             // 3.2执行sql
    33             ResultSet resultSet = stmt.executeQuery(sql);
    34             while(resultSet.next()){
    35                 int uid = resultSet.getInt("uid");
    36                 String username = resultSet.getString("username");
    37                 String password = resultSet.getString("password");
    38                 String name = resultSet.getString("name");
    39                 
    40                 System.out.println(uid+"   "+username+"   "+password+"   "+name);
    41             }
    42             // 4.释放资源
    43             resultSet.close();
    44             stmt.close();
    45             conn.close();
    46         } catch (Exception e) {
    47             e.printStackTrace();
    48         }
    49     }
    50 }
    View Code

     运行程序

     运行结果

    JDBC的API详解

    1)DriverManager

    源码

    2)Connection

    3)Statement

    一、中int表示影响的行数

    4)ResultSet

    next判断是否有下一行数据,如果有next指向下一行,直到没有下一行停止。

    ResultSet光标最初位于结果集第一行的前面,调用next()方法后移到第一行

    当调用next()方法返回值为false时,说明光标位于最后一行之后

    JDBC的资源释放

      JDBC程序运行完后,切记要释放程序在运行过程中,创建的哪些与数据库进行交互的对象,

    这些对象通常是ResultSet,Statement和Connection对象。

      特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、

    正确的关闭,极易导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。

      为了确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。

     1 package com.imooc.jdbc.demo1;
     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 import org.junit.Test;
    10 
    11 import com.mysql.jdbc.Driver;
    12 
    13 public class JDBCDemo1 {
    14     
    15     @Test
    16     /**
    17      * JDBC资源的释放
    18      */
    19     public void demo2(){
    20         Connection conn = null;
    21         Statement stmt = null;
    22         ResultSet rs = null;
    23         try {
    24             // 1.加载驱动
    25 //            DriverManager.registerDriver(new Driver());// 会导致驱动注册两次。
    26             Class.forName("com.mysql.jdbc.Driver"); 
    27             // 2.获得连接
    28             conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbctest", "root", "abc");
    29             // 3.创建执行SQL语句的对象,并且执行SQL
    30             // 3.1创建执行sql的对象
    31             String sql = "select * from user";
    32             stmt = conn.createStatement();
    33             // 3.2执行sql
    34             rs = stmt.executeQuery(sql);
    35             while(rs.next()){
    36                 int uid = rs.getInt("uid");
    37                 String username = rs.getString("username");
    38                 String password = rs.getString("password");
    39                 String name = rs.getString("name");
    40                 
    41                 System.out.println(uid+"   "+username+"   "+password+"   "+name);
    42             }
    43             
    44         } catch (Exception e) {
    45             e.printStackTrace();
    46         }finally{
    47             // 4.释放资源
    48             if (rs != null) {
    49                 try {
    50                     rs.close();
    51                 } catch (SQLException sqlEx) { // ignore 
    52                     
    53                 }
    54 
    55                 rs = null;
    56             }
    57             
    58             if(stmt != null){
    59                 try {
    60                     stmt.close();
    61                 } catch (SQLException e) {
    62                     e.printStackTrace();
    63                 }
    64                 stmt = null;
    65             }
    66             
    67             if(conn != null){
    68                 try {
    69                     conn.close();
    70                 } catch (SQLException e) {
    71                     e.printStackTrace();
    72                 }
    73                 conn = null;// 垃圾回收机制更早回收对象。
    74             }
    75         }
    76     }
    77 
    78     
    79 }
    View Code

    JDBC的CRUD操作

    1)向数据库中保存记录

     1 package com.imooc.jdbc.demo1;
     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 import org.junit.Test;
    10 
    11 public class JDBCDemo2 {
    12     
    13 
    14     @Test
    15     /**
    16      * 保存操作
    17      */
    18     public void demo1(){
    19         Connection conn = null;
    20         Statement stmt = null;
    21         try{
    22             // 注册驱动:
    23             Class.forName("com.mysql.jdbc.Driver");
    24             // 获得连接:
    25             conn = DriverManager.getConnection("jdbc:mysql:///jdbctest", "root", "abc");
    26             // 获得执行SQL语句的对象:
    27             stmt = conn.createStatement();
    28             // 编写SQL:
    29             String sql = "insert into user values (null,'eee','123','张三')";
    30             // 执行SQL:
    31             int i = stmt.executeUpdate(sql);
    32             if(i > 0){
    33                 System.out.println("保存成功!");
    34             }
    35         }catch(Exception e){
    36             e.printStackTrace();
    37         }finally{
    38             // 释放资源:
    39             if(stmt != null){
    40                 try {
    41                     stmt.close();
    42                 } catch (SQLException e) {
    43                     e.printStackTrace();
    44                 }
    45                 stmt = null;
    46             }
    47             if(conn != null){
    48                 try {
    49                     conn.close();
    50                 } catch (SQLException e) {
    51                     e.printStackTrace();
    52                 }
    53                 conn = null;
    54             }
    55         }
    56     }
    57 }
    View Code

    不需要结果集对象

    2)修改数据库中的记录

     1 package com.imooc.jdbc.demo1;
     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 import org.junit.Test;
    10 
    11 public class JDBCDemo2 {
    12     
    13     
    14     @Test
    15     /**
    16      * 修改操作
    17      */
    18     public void demo2(){
    19         Connection conn = null;
    20         Statement stmt = null;
    21         try{
    22             // 注册驱动
    23             Class.forName("com.mysql.jdbc.Driver");
    24             // 获得连接
    25             conn = DriverManager.getConnection("jdbc:mysql:///jdbctest", "root", "abc");
    26             // 创建执行SQL语句的对象:
    27             stmt = conn.createStatement();
    28             // 编写SQL:
    29             String sql = "update user set username = 'qqq',password='456' , name='赵六' where uid = 4";
    30             // 执行SQL:
    31             int i = stmt.executeUpdate(sql);
    32             if(i>0){
    33                 System.out.println("修改成功!");
    34             }
    35         }catch(Exception e){
    36             e.printStackTrace();
    37         }finally{
    38             // 释放资源
    39             if(stmt != null){
    40                 try {
    41                     stmt.close();
    42                 } catch (SQLException e) {
    43                     e.printStackTrace();
    44                 }
    45                 stmt = null;
    46             }
    47             if(conn != null){
    48                 try {
    49                     conn.close();
    50                 } catch (SQLException e) {
    51                     e.printStackTrace();
    52                 }
    53                 conn = null;
    54             }
    55         }
    56     }
    57 
    58 }
    View Code

    不需要结果集对象

    3)删除数据库中的记录

     1 package com.imooc.jdbc.demo1;
     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 import org.junit.Test;
    10 
    11 public class JDBCDemo2 {
    12     
    13     
    14     @Test
    15     /**
    16      * 删除操作
    17      */
    18     public void demo3(){
    19         Connection conn = null;
    20         Statement stmt = null;
    21         try{
    22             // 注册驱动
    23             Class.forName("com.mysql.jdbc.Driver");
    24             // 获得连接
    25             conn = DriverManager.getConnection("jdbc:mysql:///jdbctest", "root", "abc");
    26             // 获得执行SQL语句的对象:
    27             stmt = conn.createStatement();
    28             // 编写SQL:
    29             String sql = "delete from user where uid = 4";
    30             // 执行SQL:
    31             int i = stmt.executeUpdate(sql);
    32             if(i > 0){
    33                 System.out.println("删除成功!");
    34             }
    35         }catch(Exception e){
    36             e.printStackTrace();
    37         }finally{
    38             // 释放资源
    39             if(stmt != null){
    40                 try {
    41                     stmt.close();
    42                 } catch (SQLException e) {
    43                     e.printStackTrace();
    44                 }
    45                 stmt = null;
    46             }
    47             if(conn != null){
    48                 try {
    49                     conn.close();
    50                 } catch (SQLException e) {
    51                     e.printStackTrace();
    52                 }
    53                 conn = null;
    54             }
    55         }
    56     }
    57     
    58 }
    View Code

    不需要结果集对象

    4)查询数据库中的记录

      1 package com.imooc.jdbc.demo1;
      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 import org.junit.Test;
     10 
     11 public class JDBCDemo2 {
     12     @Test
     13     /**
     14      * 查询一条记录
     15      */
     16     public void demo5(){
     17         Connection conn = null;
     18         Statement stmt = null;
     19         ResultSet rs = null;
     20         try{
     21             // 注册驱动
     22             Class.forName("com.mysql.jdbc.Driver");
     23             // 获得连接
     24             conn = DriverManager.getConnection("jdbc:mysql:///jdbctest", "root", "abc");
     25             // 创建执行SQL语句的对象
     26             stmt = conn.createStatement();
     27             // 编写SQL
     28             String sql = "select * from user where uid = 1";
     29             // 执行SQL
     30             rs = stmt.executeQuery(sql);
     31             if(rs.next()){
     32                 System.out.println(rs.getInt("uid")+"   "+rs.getString("username")+"   "+rs.getString("password")+"   "+rs.getString("name"));
     33             }
     34         }catch(Exception e){
     35             e.printStackTrace();
     36         }finally{
     37             // 释放资源
     38             if(rs != null){
     39                 try {
     40                     rs.close();
     41                 } catch (SQLException e) {
     42                     e.printStackTrace();
     43                 }
     44                 rs = null;
     45             }
     46             if(stmt != null){
     47                 try {
     48                     stmt.close();
     49                 } catch (SQLException e) {
     50                     e.printStackTrace();
     51                 }
     52                 stmt = null;
     53             }
     54             if(conn != null){
     55                 try {
     56                     conn.close();
     57                 } catch (SQLException e) {
     58                     e.printStackTrace();
     59                 }
     60                 conn = null;
     61             }            
     62         }
     63     }
     64     
     65     @Test
     66     /**
     67      * 查询所有记录
     68      */
     69     public void demo4(){
     70         Connection conn = null;
     71         Statement stmt = null;
     72         ResultSet rs = null;
     73         try{
     74             // 注册驱动:
     75             Class.forName("com.mysql.jdbc.Driver");
     76             // 获得连接:
     77             conn = DriverManager.getConnection("jdbc:mysql:///jdbctest", "root", "abc");
     78             // 创建执行SQL语句的对象:
     79             stmt = conn.createStatement();
     80             // 编写SQL:
     81             String sql = "select * from user";
     82             // 执行SQL:
     83             rs = stmt.executeQuery(sql);
     84             // 遍历结果集:
     85             while(rs.next()){
     86                 System.out.println(rs.getInt("uid")+"   "+rs.getString("username")+"   "+rs.getString("password")+"    "+rs.getString("name"));
     87             }
     88         }catch(Exception e){
     89             e.printStackTrace();
     90         }finally{
     91             // 释放资源
     92             if(rs != null){
     93                 try {
     94                     rs.close();
     95                 } catch (SQLException e) {
     96                     e.printStackTrace();
     97                 }
     98                 rs = null;
     99             }
    100             if(stmt != null){
    101                 try {
    102                     stmt.close();
    103                 } catch (SQLException e) {
    104                     e.printStackTrace();
    105                 }
    106                 stmt = null;
    107             }
    108             if(conn != null){
    109                 try {
    110                     conn.close();
    111                 } catch (SQLException e) {
    112                     e.printStackTrace();
    113                 }
    114                 conn = null;
    115             }
    116         }
    117     }
    118     
    119 }
    View Code

    查询所有或多条记录

     查询一条记录

    JDBC工具类的抽取

      为了简化JDBC的开发,可以将一些重复的代码进行抽取。

    方式一:

    utils类

     1 package com.imooc.jdbc.utils;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.sql.Connection;
     6 import java.sql.DriverManager;
     7 import java.sql.ResultSet;
     8 import java.sql.SQLException;
     9 import java.sql.Statement;
    10 import java.util.Properties;
    11 
    12 /**
    13  * JDBC的工具类
    14  * @author jt
    15  *
    16  */
    17 public class JDBCUtils {
    18     private static final String driverClass;
    19     private static final String url;
    20     private static final String username;
    21     private static final String password;
    22     
    23     static{
    24         
    25         driverClass = "com.mysql.jdbc.Driver";
    26         url = "jdbc:mysql:///jdbctest";
    27         username = "root";
    28         password = "abc";
    29     }
    30 
    31     /**
    32      * 注册驱动的方法
    33      * @throws ClassNotFoundException 
    34      */
    35     public static void loadDriver() throws ClassNotFoundException{
    36         Class.forName(driverClass);
    37     }
    38     
    39     /**
    40      * 获得连接的方法:
    41      * @throws SQLException 
    42      */
    43     public static Connection getConnection() throws Exception{
    44         loadDriver();
    45         Connection conn = DriverManager.getConnection(url, username, password);
    46         return conn;
    47     }
    48     
    49     /**
    50      * 资源释放
    51      */
    52     public static void release(Statement stmt,Connection conn){
    53         if(stmt != null){
    54             try {
    55                 stmt.close();
    56             } catch (SQLException e) {
    57                 e.printStackTrace();
    58             }
    59             stmt = null;
    60         }
    61         if(conn != null){
    62             try {
    63                 conn.close();
    64             } catch (SQLException e) {
    65                 e.printStackTrace();
    66             }
    67             conn = null;
    68         }
    69     }
    70     
    71     public static void release(ResultSet rs,Statement stmt,Connection conn){
    72         if(rs!= null){
    73             try {
    74                 rs.close();
    75             } catch (SQLException e) {
    76                 e.printStackTrace();
    77             }
    78             rs = null;
    79         }
    80         if(stmt != null){
    81             try {
    82                 stmt.close();
    83             } catch (SQLException e) {
    84                 e.printStackTrace();
    85             }
    86             stmt = null;
    87         }
    88         if(conn != null){
    89             try {
    90                 conn.close();
    91             } catch (SQLException e) {
    92                 e.printStackTrace();
    93             }
    94             conn = null;
    95         }
    96     }
    97 }
    View Code

    测试类

     1 package com.imooc.jdbc.demo3;
     2 
     3 import java.sql.Connection;
     4 import java.sql.PreparedStatement;
     5 import java.sql.ResultSet;
     6 
     7 import org.junit.Test;
     8 
     9 import com.imooc.jdbc.utils.JDBCUtils;
    10 import com.imooc.jdbc.utils.JDBCUtils2;
    11 import com.mchange.v2.c3p0.ComboPooledDataSource;
    12 
    13 /**
    14  * 连接池的测试类
    15  * @author jt
    16  *
    17  */
    18 public class DataSourceDemo1 {
    19     
    20 
    21     @Test
    22     /**
    23      * 手动设置连接池
    24      */
    25     public void demo1(){
    26 
    27         // 获得连接:
    28         Connection conn = null;
    29         PreparedStatement pstmt = null;
    30         ResultSet rs = null;
    31         try{
    32             // 创建连接池:
    33             ComboPooledDataSource dataSource = new ComboPooledDataSource();
    34             // 设置连接池的参数:
    35             dataSource.setDriverClass("com.mysql.jdbc.Driver");
    36             dataSource.setJdbcUrl("jdbc:mysql:///jdbctest");
    37             dataSource.setUser("root");
    38             dataSource.setPassword("abc");
    39             dataSource.setMaxPoolSize(20);
    40             dataSource.setInitialPoolSize(3);
    41             
    42             // 获得连接:
    43             conn = dataSource.getConnection();
    44             // 编写Sql:
    45             String sql = "select * from user";
    46             // 预编译SQL:
    47             pstmt = conn.prepareStatement(sql);
    48             // 设置参数
    49             // 执行SQL:
    50             rs = pstmt.executeQuery();
    51             while(rs.next()){
    52                 System.out.println(rs.getInt("uid")+"   "+rs.getString("username")+"   "+rs.getString("password")+"   "+rs.getString("name"));
    53             }
    54         }catch(Exception e){
    55             e.printStackTrace();
    56         }finally{
    57             JDBCUtils.release(rs, pstmt, conn);
    58         }
    59     }
    60 }
    View Code

    缺点:用户名,数据库连接url等有变化时,需要修改utils的源代码,不方便

    方式二:

    属性文件jdbc.properties

    1 driverClass=com.mysql.jdbc.Driver
    2 url=jdbc:mysql:///jdbctest
    3 username=root
    4 password=abc

    工具类中加载属性文件,对相应的变量进行赋值

      1 package com.imooc.jdbc.utils;
      2 
      3 import java.io.IOException;
      4 import java.io.InputStream;
      5 import java.sql.Connection;
      6 import java.sql.DriverManager;
      7 import java.sql.ResultSet;
      8 import java.sql.SQLException;
      9 import java.sql.Statement;
     10 import java.util.Properties;
     11 
     12 /**
     13  * JDBC的工具类
     14  * @author jt
     15  *
     16  */
     17 public class JDBCUtils {
     18     private static final String driverClass;
     19     private static final String url;
     20     private static final String username;
     21     private static final String password;
     22     
     23     static{
     24         
     25         // 加载属性文件并解析:
     26         Properties props = new Properties();
     27         // 如何获得属性文件的输入流?
     28         // 通常情况下使用类的加载器的方式进行获取:
     29         InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
     30         try {
     31             props.load(is);
     32         } catch (IOException e) {
     33             e.printStackTrace();
     34         }
     35         
     36         driverClass = props.getProperty("driverClass");
     37         url = props.getProperty("url");
     38         username = props.getProperty("username");
     39         password = props.getProperty("password");
     40     }
     41 
     42     /**
     43      * 注册驱动的方法
     44      * @throws ClassNotFoundException 
     45      */
     46     public static void loadDriver() throws ClassNotFoundException{
     47         Class.forName(driverClass);
     48     }
     49     
     50     /**
     51      * 获得连接的方法:
     52      * @throws SQLException 
     53      */
     54     public static Connection getConnection() throws Exception{
     55         loadDriver();
     56         Connection conn = DriverManager.getConnection(url, username, password);
     57         return conn;
     58     }
     59     
     60     /**
     61      * 资源释放
     62      */
     63     public static void release(Statement stmt,Connection conn){
     64         if(stmt != null){
     65             try {
     66                 stmt.close();
     67             } catch (SQLException e) {
     68                 e.printStackTrace();
     69             }
     70             stmt = null;
     71         }
     72         if(conn != null){
     73             try {
     74                 conn.close();
     75             } catch (SQLException e) {
     76                 e.printStackTrace();
     77             }
     78             conn = null;
     79         }
     80     }
     81     
     82     public static void release(ResultSet rs,Statement stmt,Connection conn){
     83         if(rs!= null){
     84             try {
     85                 rs.close();
     86             } catch (SQLException e) {
     87                 e.printStackTrace();
     88             }
     89             rs = null;
     90         }
     91         if(stmt != null){
     92             try {
     93                 stmt.close();
     94             } catch (SQLException e) {
     95                 e.printStackTrace();
     96             }
     97             stmt = null;
     98         }
     99         if(conn != null){
    100             try {
    101                 conn.close();
    102             } catch (SQLException e) {
    103                 e.printStackTrace();
    104             }
    105             conn = null;
    106         }
    107     }
    108 }
    View Code

    测试类

     1 package com.imooc.jdbc.demo3;
     2 
     3 import java.sql.Connection;
     4 import java.sql.PreparedStatement;
     5 import java.sql.ResultSet;
     6 
     7 import org.junit.Test;
     8 
     9 import com.imooc.jdbc.utils.JDBCUtils;
    10 import com.imooc.jdbc.utils.JDBCUtils2;
    11 import com.mchange.v2.c3p0.ComboPooledDataSource;
    12 
    13 /**
    14  * 连接池的测试类
    15  * @author jt
    16  *
    17  */
    18 public class DataSourceDemo1 {
    19     @Test
    20     /**
    21      * 使用配置文件的方式
    22      */
    23     public void demo2(){
    24         Connection conn = null;
    25         PreparedStatement pstmt = null;
    26         ResultSet rs = null;
    27         try{
    28             /*// 获得连接:
    29             ComboPooledDataSource dataSource = new ComboPooledDataSource();*/
    30             // 获得连接:
    31             // conn = dataSource.getConnection();
    32             conn = JDBCUtils2.getConnection();
    33             // 编写Sql:
    34             String sql = "select * from user";
    35             // 预编译SQL:
    36             pstmt = conn.prepareStatement(sql);
    37             // 设置参数
    38             // 执行SQL:
    39             rs = pstmt.executeQuery();
    40             while(rs.next()){
    41                 System.out.println(rs.getInt("uid")+"   "+rs.getString("username")+"   "+rs.getString("password")+"   "+rs.getString("name"));
    42             }
    43         }catch(Exception e){
    44             e.printStackTrace();
    45         }finally{
    46             JDBCUtils2.release(rs, pstmt, conn);
    47         }
    48     }
    49 
    50 }
    View Code

    JDBC的SQL注入漏洞

    演示:

    例如,用户登录界面,已知用户名,不知道密码的情况下,也可以登录到系统中,然后对账号进行一些破坏.

     1 package com.imooc.jdbc.demo2;
     2 
     3 import java.sql.Connection;
     4 import java.sql.PreparedStatement;
     5 import java.sql.ResultSet;
     6 import java.sql.Statement;
     7 
     8 import org.junit.Test;
     9 
    10 import com.imooc.jdbc.utils.JDBCUtils;
    11 
    12 /**
    13  * 演示JDBC的注入的漏洞
    14  * @author jt
    15  *
    16  */
    17 public class JDBCDemo4 {
    18     @Test
    19     /**
    20      * 测试SQL注入漏洞的方法
    21      */
    22     public void demo1(){
    23         boolean flag = JDBCDemo4.login2("aaa' or '1=1", "1fsdsdfsdf");
    24         if(flag == true){
    25             System.out.println("登录成功!");
    26         }else{
    27             System.out.println("登录失败!");
    28         }
    29     }
    30     
    31     /**
    32      * 避免SQL注入漏洞的方法
    33      */
    34     public static boolean login2(String username,String password){
    35         Connection conn = null;
    36         PreparedStatement pstmt = null;
    37         ResultSet rs = null;
    38         boolean flag = false;
    39         try{
    40             // 获得连接:
    41             conn = JDBCUtils.getConnection();
    42             // 编写SQL:
    43             String sql = "select * from user where username = ? and password = ?";
    44             // 预处理SQL:
    45             pstmt = conn.prepareStatement(sql);
    46             // 设置参数:
    47             pstmt.setString(1, username);
    48             pstmt.setString(2, password);
    49             // 执行SQL:
    50             rs = pstmt.executeQuery();
    51             // 判断结果街
    52             if(rs.next()){
    53                 flag = true;
    54             }else{
    55                 flag = false;
    56             }
    57         }catch(Exception e){
    58             e.printStackTrace();
    59         }finally{
    60             JDBCUtils.release(rs, pstmt, conn);
    61         }
    62         return flag;
    63     }
    64     
    65     /**
    66      * 产生SQL注入漏洞的方法
    67      * @param username
    68      * @param password
    69      * @return
    70      */
    71     public static boolean login(String username,String password){
    72         Connection conn = null;
    73         Statement stmt  = null;
    74         ResultSet rs = null;
    75         boolean flag = false;
    76         try{
    77             conn = JDBCUtils.getConnection();
    78             // 创建执行SQL语句的对象:
    79             stmt = conn.createStatement();
    80             // 编写SQL:
    81             String sql = "select * from user where username = '"+username+"' and password = '"+password+"'";
    82             // 执行SQL:
    83             rs = stmt.executeQuery(sql);
    84             // 判断结果集中是否有数据。
    85             if(rs.next()){
    86                 flag = true;
    87             }else{
    88                 flag = false;
    89             }
    90         }catch(Exception e){
    91             e.printStackTrace();
    92         }finally{
    93             JDBCUtils.release(rs, stmt, conn);
    94         }
    95         return flag;
    96     }
    97 }
    View Code

    因为在字符串中写入了sql的关键字

    相当于

    解决:

     1 package com.imooc.jdbc.demo2;
     2 
     3 import java.sql.Connection;
     4 import java.sql.PreparedStatement;
     5 import java.sql.ResultSet;
     6 import java.sql.Statement;
     7 
     8 import org.junit.Test;
     9 
    10 import com.imooc.jdbc.utils.JDBCUtils;
    11 
    12 /**
    13  * 演示JDBC的注入的漏洞
    14  * @author jt
    15  *
    16  */
    17 public class JDBCDemo4 {
    18     @Test
    19     /**
    20      * 测试SQL注入漏洞的方法
    21      */
    22     public void demo1(){
    23         boolean flag = JDBCDemo4.login2("aaa' or '1=1", "1fsdsdfsdf");
    24         if(flag == true){
    25             System.out.println("登录成功!");
    26         }else{
    27             System.out.println("登录失败!");
    28         }
    29     }
    30     
    31     /**
    32      * 避免SQL注入漏洞的方法
    33      */
    34     public static boolean login2(String username,String password){
    35         Connection conn = null;
    36         PreparedStatement pstmt = null;
    37         ResultSet rs = null;
    38         boolean flag = false;
    39         try{
    40             // 获得连接:
    41             conn = JDBCUtils.getConnection();
    42             // 编写SQL:
    43             String sql = "select * from user where username = ? and password = ?";
    44             // 预处理SQL:
    45             pstmt = conn.prepareStatement(sql);
    46             // 设置参数:
    47             pstmt.setString(1, username);
    48             pstmt.setString(2, password);
    49             // 执行SQL:
    50             rs = pstmt.executeQuery();
    51             // 判断结果街
    52             if(rs.next()){
    53                 flag = true;
    54             }else{
    55                 flag = false;
    56             }
    57         }catch(Exception e){
    58             e.printStackTrace();
    59         }finally{
    60             JDBCUtils.release(rs, pstmt, conn);
    61         }
    62         return flag;
    63     }
    64     
    65 }
    View Code

    JDBC中的PreparedStatement

    1)保存数据

     1 package com.imooc.jdbc.demo2;
     2 
     3 import java.sql.Connection;
     4 import java.sql.PreparedStatement;
     5 import java.sql.ResultSet;
     6 
     7 import org.junit.Test;
     8 
     9 import com.imooc.jdbc.utils.JDBCUtils;
    10 
    11 /**
    12  * PreparedStatement的使用
    13  * @author jt
    14  *
    15  */
    16 public class JDBCDemo5 {
    17 
    18     @Test
    19     /**
    20      * 保存数据
    21      */
    22     public void demo1(){
    23         Connection conn = null;
    24         PreparedStatement pstmt = null;
    25         try{
    26             // 获得连接:
    27             conn = JDBCUtils.getConnection();
    28             // 编写SQL:
    29             String sql = "insert into user values (null,?,?,?)";
    30             // 预处理SQL:
    31             pstmt = conn.prepareStatement(sql);
    32             // 设置参数的值:
    33             pstmt.setString(1, "qqq");
    34             pstmt.setString(2, "123");
    35             pstmt.setString(3, "张武");
    36             // 执行SQL:
    37             int num = pstmt.executeUpdate();
    38             if(num > 0){
    39                 System.out.println("保存成功!");
    40             }
    41         }catch(Exception e){
    42             e.printStackTrace();
    43         }finally{
    44             // 释放资源
    45             JDBCUtils.release(pstmt, conn);
    46         }
    47     }
    48 }
    View Code

    2)修改数据

     1 package com.imooc.jdbc.demo2;
     2 
     3 import java.sql.Connection;
     4 import java.sql.PreparedStatement;
     5 import java.sql.ResultSet;
     6 
     7 import org.junit.Test;
     8 
     9 import com.imooc.jdbc.utils.JDBCUtils;
    10 
    11 /**
    12  * PreparedStatement的使用
    13  * @author jt
    14  *
    15  */
    16 public class JDBCDemo5 {
    17     
    18     @Test
    19     /**
    20      * 修改数据
    21      */
    22     public void demo2(){
    23         Connection conn = null;
    24         PreparedStatement pstmt = null;
    25         try{
    26             // 获得连接:
    27             conn = JDBCUtils.getConnection();
    28             // 编写SQL:
    29             String sql = "update user set username = ?,password = ?,name = ? where uid = ?";
    30             // 预编译SQL:
    31             pstmt = conn.prepareStatement(sql);
    32             // 设置参数:
    33             pstmt.setString(1, "www");
    34             pstmt.setString(2, "123456");
    35             pstmt.setString(3, "张六");
    36             pstmt.setInt(4, 6);
    37             // 执行SQL:
    38             int num = pstmt.executeUpdate();
    39             if(num > 0){
    40                 System.out.println("修改成功!");
    41             }
    42         }catch(Exception e){
    43             e.printStackTrace();
    44         }finally{
    45             JDBCUtils.release(pstmt, conn);
    46         }
    47     }
    48 
    49 }
    View Code

    3)删除数据

     1 package com.imooc.jdbc.demo2;
     2 
     3 import java.sql.Connection;
     4 import java.sql.PreparedStatement;
     5 import java.sql.ResultSet;
     6 
     7 import org.junit.Test;
     8 
     9 import com.imooc.jdbc.utils.JDBCUtils;
    10 
    11 /**
    12  * PreparedStatement的使用
    13  * @author jt
    14  *
    15  */
    16 public class JDBCDemo5 {
    17     
    18     @Test
    19     /**
    20      * 删除数据
    21      */
    22     public void demo3(){
    23         Connection conn = null;
    24         PreparedStatement pstmt = null;
    25         try{
    26             // 获得连接:
    27             conn = JDBCUtils.getConnection();
    28             // 编写SQL:
    29             String sql = "delete from user where uid = ?";
    30             // 预编译SQL:
    31             pstmt = conn.prepareStatement(sql);
    32             // 设置参数:
    33             pstmt.setInt(1, 6);
    34             // 执行SQL:
    35             int num = pstmt.executeUpdate();
    36             if(num > 0){
    37                 System.out.println("删除成功!");
    38             }
    39         }catch(Exception e){
    40             e.printStackTrace();
    41         }finally{
    42             JDBCUtils.release(pstmt, conn);
    43         }
    44     }
    45     
    46 }
    View Code

    4)查询数据

     1 package com.imooc.jdbc.demo2;
     2 
     3 import java.sql.Connection;
     4 import java.sql.PreparedStatement;
     5 import java.sql.ResultSet;
     6 
     7 import org.junit.Test;
     8 
     9 import com.imooc.jdbc.utils.JDBCUtils;
    10 
    11 /**
    12  * PreparedStatement的使用
    13  * @author jt
    14  *
    15  */
    16 public class JDBCDemo5 {
    17     @Test
    18     /**
    19      * 查询一条记录
    20      */
    21     public void demo5(){
    22         Connection conn = null;
    23         PreparedStatement pstmt = null;
    24         ResultSet rs = null;
    25         try{
    26             // 获得连接:
    27             conn = JDBCUtils.getConnection();
    28             // 编写SQL:
    29             String sql = "select * from user where uid = ?";
    30             // 预编译SQL:
    31             pstmt = conn.prepareStatement(sql);
    32             // 设置参数:
    33             pstmt.setObject(1, 3);
    34             // 执行SQL:
    35             rs = pstmt.executeQuery();
    36             // 判断结果集:
    37             if(rs.next()){
    38                 System.out.println(rs.getInt("uid")+"  "+rs.getString("username")+"  "+rs.getString("password")+"  "+rs.getString("name"));
    39             }
    40         }catch(Exception e){
    41             e.printStackTrace();
    42         }finally{
    43             JDBCUtils.release(rs, pstmt, conn);
    44         }
    45     }
    46     
    47     @Test
    48     /**
    49      * 查询所有数据
    50      */
    51     public void demo4(){
    52         Connection conn = null;
    53         PreparedStatement pstmt = null;
    54         ResultSet rs = null;
    55         try{
    56             // 获得连接:
    57             conn = JDBCUtils.getConnection();
    58             // 编写SQL:
    59             String sql = "select * from user";
    60             // 预编译SQL:
    61             pstmt = conn.prepareStatement(sql);
    62             // 设置参数
    63             // 执行SQL:
    64             rs = pstmt.executeQuery();
    65             while(rs.next()){
    66                 System.out.println(rs.getInt("uid")+"  "+rs.getString("username")+"  "+rs.getString("password")+"  "+rs.getString("name"));
    67             }
    68         }catch(Exception e){
    69             e.printStackTrace();
    70         }finally{
    71             JDBCUtils.release(rs, pstmt, conn);
    72         }
    73     }
    74     
    75 }
    View Code

    数据库连接池  

     

     

     C3P0连接池的使用

    引入连接池jar包,并添加到构建路径中

    连接池测试类

    1.手动设置连接池

    测试类

     1 package com.imooc.jdbc.demo3;
     2 
     3 import java.sql.Connection;
     4 import java.sql.PreparedStatement;
     5 import java.sql.ResultSet;
     6 
     7 import org.junit.Test;
     8 
     9 import com.imooc.jdbc.utils.JDBCUtils;
    10 import com.imooc.jdbc.utils.JDBCUtils2;
    11 import com.mchange.v2.c3p0.ComboPooledDataSource;
    12 
    13 /**
    14  * 连接池的测试类
    15  * @author jt
    16  *
    17  */
    18 public class DataSourceDemo1 {
    19 
    20     @Test
    21     /**
    22      * 手动设置连接池
    23      */
    24     public void demo1(){
    25 
    26         // 获得连接:
    27         Connection conn = null;
    28         PreparedStatement pstmt = null;
    29         ResultSet rs = null;
    30         try{
    31             // 创建连接池:
    32             ComboPooledDataSource dataSource = new ComboPooledDataSource();
    33             // 设置连接池的参数:
    34             dataSource.setDriverClass("com.mysql.jdbc.Driver");
    35             dataSource.setJdbcUrl("jdbc:mysql:///jdbctest");
    36             dataSource.setUser("root");
    37             dataSource.setPassword("abc");
    38             dataSource.setMaxPoolSize(20);
    39             dataSource.setInitialPoolSize(3);
    40             
    41             // 获得连接:
    42             conn = dataSource.getConnection();
    43             // 编写Sql:
    44             String sql = "select * from user";
    45             // 预编译SQL:
    46             pstmt = conn.prepareStatement(sql);
    47             // 设置参数
    48             // 执行SQL:
    49             rs = pstmt.executeQuery();
    50             while(rs.next()){
    51                 System.out.println(rs.getInt("uid")+"   "+rs.getString("username")+"   "+rs.getString("password")+"   "+rs.getString("name"));
    52             }
    53         }catch(Exception e){
    54             e.printStackTrace();
    55         }finally{
    56             JDBCUtils.release(rs, pstmt, conn);
    57         }
    58     }
    59 }
    View Code

    2. 使用配置文件方式设置连接池

    c3p0-config.xml

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <c3p0-config>
     3 
     4   <default-config>
     5     <property name="driverClass">com.mysql.jdbc.Driver</property>
     6     <property name="jdbcUrl">jdbc:mysql:///jdbctest</property>
     7     <property name="user">root</property>
     8     <property name="password">abc</property>
     9     <property name="initialPoolSize">5</property>
    10     <property name="maxPoolSize">20</property>
    11   </default-config>
    12   
    13 </c3p0-config>
    View Code

    测试类

     1 package com.imooc.jdbc.demo3;
     2 
     3 import java.sql.Connection;
     4 import java.sql.PreparedStatement;
     5 import java.sql.ResultSet;
     6 
     7 import org.junit.Test;
     8 
     9 import com.imooc.jdbc.utils.JDBCUtils;
    10 import com.imooc.jdbc.utils.JDBCUtils2;
    11 import com.mchange.v2.c3p0.ComboPooledDataSource;
    12 
    13 /**
    14  * 连接池的测试类
    15  * @author jt
    16  *
    17  */
    18 public class DataSourceDemo1 {
    19     @Test
    20     /**
    21      * 使用配置文件的方式
    22      */
    23     public void demo2(){
    24         Connection conn = null;
    25         PreparedStatement pstmt = null;
    26         ResultSet rs = null;
    27         try{
    28             /*// 获得连接:
    29             ComboPooledDataSource dataSource = new ComboPooledDataSource();*/
    30             // 获得连接:
    31             // conn = dataSource.getConnection();
    32             conn = JDBCUtils2.getConnection();
    33             // 编写Sql:
    34             String sql = "select * from user";
    35             // 预编译SQL:
    36             pstmt = conn.prepareStatement(sql);
    37             // 设置参数
    38             // 执行SQL:
    39             rs = pstmt.executeQuery();
    40             while(rs.next()){
    41                 System.out.println(rs.getInt("uid")+"   "+rs.getString("username")+"   "+rs.getString("password")+"   "+rs.getString("name"));
    42             }
    43         }catch(Exception e){
    44             e.printStackTrace();
    45         }finally{
    46             JDBCUtils2.release(rs, pstmt, conn);
    47         }
    48     }
    49 
    50 }
    View Code

    工具类

     1 package com.imooc.jdbc.utils;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.sql.Connection;
     6 import java.sql.DriverManager;
     7 import java.sql.ResultSet;
     8 import java.sql.SQLException;
     9 import java.sql.Statement;
    10 import java.util.Properties;
    11 
    12 import com.mchange.v2.c3p0.ComboPooledDataSource;
    13 
    14 /**
    15  * JDBC的工具类
    16  * @author jt
    17  *
    18  */
    19 public class JDBCUtils2 {
    20     private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
    21     
    22     /**
    23      * 获得连接的方法:
    24      * @throws SQLException 
    25      */
    26     public static Connection getConnection() throws Exception{
    27         Connection conn = dataSource.getConnection();
    28         return conn;
    29     }
    30     
    31     /**
    32      * 资源释放
    33      */
    34     public static void release(Statement stmt,Connection conn){
    35         if(stmt != null){
    36             try {
    37                 stmt.close();
    38             } catch (SQLException e) {
    39                 e.printStackTrace();
    40             }
    41             stmt = null;
    42         }
    43         if(conn != null){
    44             try {
    45                 conn.close();
    46             } catch (SQLException e) {
    47                 e.printStackTrace();
    48             }
    49             conn = null;
    50         }
    51     }
    52     
    53     public static void release(ResultSet rs,Statement stmt,Connection conn){
    54         if(rs!= null){
    55             try {
    56                 rs.close();
    57             } catch (SQLException e) {
    58                 e.printStackTrace();
    59             }
    60             rs = null;
    61         }
    62         if(stmt != null){
    63             try {
    64                 stmt.close();
    65             } catch (SQLException e) {
    66                 e.printStackTrace();
    67             }
    68             stmt = null;
    69         }
    70         if(conn != null){
    71             try {
    72                 conn.close();
    73             } catch (SQLException e) {
    74                 e.printStackTrace();
    75             }
    76             conn = null;
    77         }
    78     }
    79 }
    View Code
  • 相关阅读:
    命令
    碎片知识
    驱动问题
    网络基础知识普及
    面向设计大作业——公司餐厅
    面向对象--购物车
    OO之接口-DAO模式代码阅读及应用
    有理数类的定义
    图知识点总结
    Java课程设计总结
  • 原文地址:https://www.cnblogs.com/superjishere/p/12686950.html
Copyright © 2011-2022 走看看