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工具类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
注意:使用类加载器
// 使用类加载器,去读取src底下的资源文件。 InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
JavaWeb开发获取资源,在非servlet类型(如上图中com.marw.util.JDBCUtil)尽量都使用类加载器获取src文件夹下的资源文件。
假如有需求需要获取资源不在src中的话,可能用到的代码
InputStream is = new FileInputStream(path);
参数path:一定要使用绝对路径(带盘符),不要使用相对路径。