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(通常路径:app\oracle\product\12.2.0\dbhome_1\jdbc\lib)

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

posted @ 2020-03-23 17:28  一杯水M  阅读(337)  评论(0编辑  收藏  举报