• 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:一定要使用绝对路径(带盘符),不要使用相对路径。 

  • 相关阅读:
    [转载]初学C#之list
    List<>过滤重复的简单方法
    C# List<> 删除
    C# 生成随机字符串
    C#正则表达式之字符替换
    c#中怎么删除一个非空目录
    treeview 点击时选中节点
    教程链接
    iOS 允许后台任务吗?
    Git Add,Git别名等
  • 原文地址:https://www.cnblogs.com/WarBlog/p/12553537.html
Copyright © 2020-2023  润新知