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