JAVA技术分享:jdbc浅析

# 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;
    }
    
```

猜你喜欢

转载自www.cnblogs.com/qfdsj/p/9003400.html