zoukankan      html  css  js  c++  java
  • JavaWeb学习之JDBC

    一、JDBC:JAVA Database Connectivity (java 数据库连接)

    SUN公司提供的数据库访问规则、规范。

    由于数据库种类较多,sun公司就提供了一种规范,让数据库提供商去实现底层的访问规则。 java程序只要使用sun公司提供的jdbc驱动即可。

    二、使用JDBC的基本步骤

    Ⅰ、下载并解压JDBC驱动

      ①、Sql Server 

        下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=11774

          第一步:

           

           第二步:

            

          第三步:

                 

      ②、mySql  下载地址:https://dev.mysql.com/downloads/connector/j/5.1.html

      ③、Oracle  安装Oracle时就会有对应的JDBC(通常路径:apporacleproduct12.2.0dbhome_1jdbclib)

    Ⅱ、导入JDBC的jar包

      根据解压文件中找到 jre8(为什么选jre8,因为我eclipse对应的jdk8)文件夹下的JDBC的jar包复制到工程中

         

     Ⅲ、注册驱动

    DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());

    ***注意:二次注册(在jdk4.0以后DriverManager已注册驱动了,所以注册驱动可以不用做了

    DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver);
    
    //查看SQLServerDriver类里面有静态代码块(静态代码块 ---> 类加载了(new),就执行)内有以下方法
    java.sql.DriverManager.registerDriver(new SQLServerDriver());
    //所以使用DriverManager.registerDriver()方法注册驱动,会二次注册
    
    
    //避免二次注册,使用以下方法
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");    

    Ⅳ、建立连接

    String connectionUrl = "jdbc:sqlserver://localhost:1433;" + "databaseName=数据库名;";// integratedSecurity=true;window认证
    Connection connection = DriverManager.getConnection(connectionUrl, "用户名", "密码");

      建立连接除了以上的方式还有以下的方法,这个方法SQLServerDriver独有的  

            SQLServerDataSource ds = new SQLServerDataSource();
    //        ds.setIntegratedSecurity(true);
            ds.setServerName("localhost");
            ds.setPortNumber(1433);
            ds.setDatabaseName("ImageServiceDB");
            ds.setUser("sa");
            ds.setPassword("AAA@111");
            connection = ds.getConnection();

    Ⅴ、创建Statement

    Statement st = connection.createStatement();
    //执行sql
    String sql="Select * from ImageServerInfo";
    ResultSet rs = st.executeQuery(sql);// 执行查询,返回查询结果
    //int intResult=st.executeUpdate(sql); // 执行增删改,返回受影响行数

    ***注意:Statement安全问题

      Statement执行 ,其实是拼接sql语句的,这样有可能会出现sql文注入安全问题

         String sql = "select * from t_user where username='"+ username  +"' and password='"+ password +"'";
    
            UserDao dao = new UserDaoImpl();
            dao.login("admin", "100234khsdf88' or '1=1");
        
            SELECT * FROM t_user WHERE username='admin' AND PASSWORD='100234khsdf88' or '1=1' 

      为了避免上述安全问题可以使用PrepareStatement,此对象在执行sql时会先对sql语句进行语法检查。在sql语句里面使用 ? 占位符来替代后续要传递进来的变量。

        String sql = "insert into t_user values(null , ? , ?)";
        ps = conn.prepareStatement(sql);
                 
        //给占位符赋值 从左到右数过来,1 代表第一个问号, 永远你是1开始。
        ps.setString(1, userName);
        ps.setString(2, password);

      补充:CallableStatement对象用于执行存储过程

        CallableStatement cstmt = con.prepareCall("{call dbo.uspGetEmployeeManagers(?)}");
        cstmt.setInt(1, 50);

    Ⅵ、遍历结果集

    while (rs.next()) {
        System.out.println(rs.getInt("ServerId"));
        System.out.println(rs.getString("ServerName"));
    }

    Ⅶ、释放资源

    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException sqlEx) {
        }
        rs = null;
    }
    
    ... ...

     三、JDBC工具类

     1 public class JDBCUtil {
     2     private static String driverClass;
     3     private static String url;
     4     private static String name;
     5     private static String password;
     6     static {
     7     try {
     8         // 1. 创建一个属性配置对象
     9         Properties properties = new Properties();
    10         // 使用类加载器,去读取src底下的资源文件。
    11         InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
    12         // 导入输入流。
    13         properties.load(is);
    14         // 读取属性
    15         driverClass = properties.getProperty("driverClass");
    16         url = properties.getProperty("url");
    17         name = properties.getProperty("name");
    18         password = properties.getProperty("password");
    19 
    20     } catch (Exception e) {
    21         e.printStackTrace();
    22     }
    23     }
    24 
    25     public static Connection getConnection() {
    26     Connection connection = null;
    27     try {
    28         //直接建立连接,不需要注册jdbc驱动
    29         connection = DriverManager.getConnection(url, name, password);
    30     } catch (SQLException e) {
    31 
    32         e.printStackTrace();
    33     }
    34     return connection;
    35     }
    36     
    37     public static void release(Connection conn, Statement st, ResultSet rs) {
    38     closeResultSet(rs);
    39     closeStatement(st);
    40     closeConnection(conn);
    41     }
    42     private static void closeResultSet(ResultSet rs) {
    43     if (rs != null) {
    44         try {
    45         rs.close();
    46         } catch (SQLException e) {
    47 
    48         e.printStackTrace();
    49         }
    50         rs = null;
    51     }
    52     }
    53     private static void closeStatement(Statement st) {
    54     if (st != null) {
    55         try {
    56         st.close();
    57         } catch (SQLException e) {
    58 
    59         e.printStackTrace();
    60         }
    61         st = null;
    62     }
    63     }
    64     private static void closeConnection(Connection conn) {
    65     if (conn != null) {
    66         try {
    67         conn.close();
    68         } catch (SQLException e) {
    69 
    70         e.printStackTrace();
    71         }
    72         conn = null;
    73     }
    74     }
    75 }
    View Code

    注意:使用类加载器

    // 使用类加载器,去读取src底下的资源文件。
    InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");

      

    JavaWeb开发获取资源,在非servlet类型(如上图中com.marw.util.JDBCUtil)尽量都使用类加载器获取src文件夹下的资源文件。

    假如有需求需要获取资源不在src中的话,可能用到的代码

    InputStream is = new FileInputStream(path);

    参数path:一定要使用绝对路径(带盘符),不要使用相对路径。 

  • 相关阅读:
    1105 Spiral Matrix (25分)(蛇形填数)
    1104 Sum of Number Segments (20分)(long double)
    1026 Table Tennis (30分)(模拟)
    1091 Acute Stroke (30分)(bfs,连通块个数统计)
    1095 Cars on Campus (30分)(排序)
    1098 Insertion or Heap Sort (25分)(堆排序和插入排序)
    堆以及堆排序详解
    1089 Insert or Merge (25分)
    1088 Rational Arithmetic (20分)(模拟)
    1086 Tree Traversals Again (25分)(树的重构与遍历)
  • 原文地址:https://www.cnblogs.com/WarBlog/p/12553537.html
Copyright © 2011-2022 走看看