# jdbc浅析
# 一、jdbc概念
所谓的jdbc,实际是来自于 java database conectivity的缩写,顾名思义是用于实现在java程序中连接数据库,以至于可以对数据库进行操作。实际上,jdbc是java程序与数据库进行通信的一种规范。这种规范(接口)定义在java.sql包下。其四大核心对象:
- DriverManager: 用于加载数据库驱动
- Connection:用于连接数据库的
- Statement: 用于执行sql语句的
- ResultSet:用于封装从数据库返回的结果集的
# 二、jdbc初体验
```java
//1.注册驱动
Class.forName("com.mysql.jdbc.Driver");
//2.获得一个连接对象
String url= "jdbc:mysql:///db_day07?user=root&password=123";
Connection connection = DriverManager.getConnection(url);
//3.获得执行sql语句的statement对象
Statement stmt = connection.createStatement();
//4.执行sql语句
String sql = "select * from user";
//5.获得结果集对象ResultSet,其中封装着来自于数据库的所有数据
ResultSet rs = stmt.executeQuery(sql);
//6.解析结果集
while(rs.next()){
System.out.println(rs.getInt(1)+";"+rs.getString(2)+";"+rs.getInt(3)+";"+rs.getString(4));
}
//7.释放资源
rs.close();
stmt.close();
connection.close();
```
## 数据库驱动的作用:
数据库驱动是已经实现了jdbc规范的一个类集。其中封装了实现了jdbc规范的所有的类。
对于mysql的驱动来说,获得的Connection对象,该对象就能连接mysql数据库,同理,oracle驱动获得的连接对象,就能连接oracle数据库。
# 三、四大核心对象的详解
## 1.DriverManager:加载驱动
注册驱动的方式有两种:
1)DriverManager.registerDriver(new com.mysql.jdbc.Driver());
这种方式不合适,因为驱动会随着com.mysql.jdbc.Driver类的加载而被注册,此时相当于注册了两次
2)Class.forName("com.mysql.jdbc.Driver"); 这种方式直接加载com.mysql.jdbc.Driver类,加载类时Driver类的静态代码块就会注册驱动。因此,注册驱动就用这种方式
## 2.Connection:连接数据库的
什么样的数据库的驱动,获得的连接对象就是连接什么样的数据库,比如mysql数据库的驱动,获得的连接对象就是用于连接mysql数据库的。
获得Connection对象的方式:
- 方式一:
```java
String url = "jdbc:mysql://localhost:3306/db_day07";
String user = "root";
String password = "123";
Connection conn = DriverManager.getConnection(url, user, password);
```
- 方式二:将用户名和密码存入到Properties属性集对象(map)中
```java
Properties pro = new Properties();
pro.setProperty("user", "root");
pro.setProperty("password", "123");
Connection conn = DriverManager.getConnection(url, pro);
```
- 方式三:将用户名和密码作为url的参数
```java
String url= "jdbc:mysql:///db_day07?user=root&password=123";
Connection conn = DriverManager.getConnection(url);
```
## 3.Statement对象:用于执行sql语句的对象
获得的方式:
Connection对象的createStatement();
执行sql语句的方法:
- 方法一: executeQuery(String sql): 返回值是一个ResultSet对象,该对象中封装着查询的结果。
对于查询的sql语句来说,使用此方法。因为查询的sql(select)会产生结果集。
- 方法二:executeUpdate(String sql): 返回值是一个int ,表示受影响的行数。
对于,不会产生结果的sql语句(insert、update、delete),使用这个方法,该方法的返回值是受影响的行数。
## 4.ResultSet对象:用于封装结果集的
如果statement对象执行executeQuery方法产生了结果,那么该结果集就被封装进ResultSet对象中。
需要掌握的几个方法:
- next():第一次调用之前,光标指向第一行之前,第一次调用,指在第一行,第二次调用指在第二行。next方法的返回值,如果该行有数据,则返回true,否则返回false.
- getInt(int columnindex):通过列的索引找到该列的数据,注意,索引从1开始
- getInt(String columnname):通过列的名字找到该列的数据。
- getString()、getObject()...
# 四、完善JDBC代码
## 封装JDBCUtil工具类,通过工具类来获得Connection对象
```java
private static String driver = null;
private static String url = null;
private static String user = null;
private static String password = null;
static{
//静态代码块是随着类的加载而被加载,且只加载一次。
Properties p = new Properties();
try {
p.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("dbinfo.properties"));
driver = p.getProperty("driver");
url = p.getProperty("url");
user = p.getProperty("user");
password = p.getProperty("password");
Class.forName(driver);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException, ClassNotFoundException{
return DriverManager.getConnection(url,user,password);
}
```
# 五、案例:完成登录验证
登录验证的实现
```java
public User findUser(String username, String password) {
User user = null;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
//从工具类中获得一个Connection对象
conn = JDBCUtil.getConnection();
stmt = conn.createStatement();
//select * from user where username=‘zhangsan‘ and password=‘123456‘
String sql = "select * from user where username=‘"+username
+"‘ and password=‘"+password+"‘";
rs = stmt.executeQuery(sql);
if(rs.next()){
//如果用户名和密码正确,那么就能获得一条记录,于是解析该记录并封装进User对象中
user = new User();
user.setUid(rs.getString(1));
user.setUsername(rs.getString(2));
user.setPassword(rs.getString(3));
}
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
//释放资源
JDBCUtil.releaseResource(conn, stmt, rs);
}
return user;
}
```
原文地址:https://www.cnblogs.com/qfdsj/p/9003400.html