JDBC(Java Data Base Connectivity——java数据库连接)

一、定义
数据库驱动:数据库厂商为了方便开发人员从程序中操作数据库而提供的一套jar包,通过导入这个jar包就可以调用其中的方法操作数据库,这样的jar包就叫做数据库驱动
JDBC:sun定义的一套标准,本质上是一大堆的操作数据库的接口,所有数据库厂商为java设计的数据库驱动都实现过这套接口,这样一来统一了不同数据库驱动的方法,开发人员只需要学习JDBC就会使用任意数据库驱动了。
 
二、使用JDBC连接数据库
方法一:
package com.shelly.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.mysql.jdbc.Driver;

public class Demo1 {

    /**
     * @param args
     * @throws SQLException 
     */
    public static void main(String[] args) throws SQLException {
        // 1.注册数据库驱动
        DriverManager.registerDriver(new Driver());
        // 2.获取数据库连接
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/blog", "root", "root");
        // 3.获取传输器对象
        Statement stat = conn.createStatement();
        // 4.利用传输器传输sql语句到数据库中执行,获取结果集对象
        ResultSet rs = stat.executeQuery("select * from user");
        // 5.遍历结果集获取查询结果
        while(rs.next()){
            String username = rs.getString("username");
            System.out.println(username);
        }
        // 6.关闭资源
        rs.close();
        stat.close();
        conn.close();
    }
}
缺点:
① DriverManager.registerDriver(new Driver());//缺点一:由于mysql的Driver源码本身已经注册过一次,导致了数据库驱动被注册了两次。缺点二:整个程序域mysql数据库驱动绑定增加了耦合性,程序和具体的mysql驱动绑死在一起,在切换数据库时需要改动java代码,不够灵活。
② 关闭资源有问题。若程序抛出异常,资源无法关闭。
③ Statement容易引起sql注入。
 
方法二:
package com.shelly.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Demo1 {
    /**
     * @param args
     */
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try{
            // 1.注册数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2.获取数据库连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/blog", "root", "root");
            // 3.获取传输器对象
            ps = conn.prepareStatement("select * from user where username = ?");
            ps.setString(1, "Sue");
            // 4.获取结果集对象
            rs = ps.executeQuery();
            // 5.遍历结果集获取查询结果
            while(rs.next()){
                String username = rs.getString("username");
                System.out.println(username);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            // 6.关闭资源
            if(rs != null){//防止空指针异常
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally{
                    rs = null;
                }
            }
            if(ps != null){
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally{
                    ps = null;
                }
            }
            if(conn != null){
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }finally{
                    conn = null;
                }
            }
        }
    }
}

优点:

① Class.forName(“com.mysql.jdbc.Driver”);//代替DriverManager,可以查找是否已有注册数据库驱动,所以只会注册一次。关联字符串,可以将字符串放在配置文件中,在切换数据库时就不需要改动java代码了。

② 抛出异常问题解决见程序二。

 ③ PreparedStatement是Statement的孩子,不同的是,PreparedStatement使用预编译机制,在创建PreparedStatement对象时就需要将sql语句传入,传入的过程中参数要用?替代,这个过程回导致传入的sql被进行预编译,然后再调用PreparedStatement的setXXX将参数设置上去,由于sql语句已经经过了预编译,再传入特殊值也不会起作用了。PreparedStatement使用了预编译机制,sql语句在执行的过程中效率比Statement要高。
Tip:
数据库驱动写法:
Oracle写法:oracle.jdbc.driver.OracleDriver
SqlServer:com.microsoft.sqlserver.jdbc.SQLServerDriver
MySql:com.mysql.jdbc.Driver
 
 
数据库URL:URL用于标识数据库的位置,程序员通过URL地址告诉JDBC程序连接哪个数据库。
常用数据库URL地址的写法:
Oracle写法:jdbc:oracle:thin:@localhost:1521:sid
SqlServer:jdbc:microsoft:sqlserver://localhost:1433; DatabaseName=sid
MySql:jdbc:mysql://localhost:3306/sid
Mysql的url地址的简写形式: jdbc:mysql:///sid
常用属性:useUnicode=true&characterEncoding=UTF-8

Sql注入:由于jdbc程序在执行的过程中sql语句在拼装时使用了由页面传入参数,如果用户恶意传入一些sql中的特殊关键字,会导致sql语句意义发生变化,这种攻击方式就叫做sql注入,参考用户注册登录案例。

 
 
原文地址:https://www.cnblogs.com/shelly0307/p/10392824.html