JDBC学习记录

2017-11-23 15:16:54

    1.什么是JDBC

    JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是Java语言来操作数据库.原来我们操作数据库是在控制台使用Sql语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句.

    2.JDBC的原理

  •     早期SUN公司是想编写一套可以连接所有数据库的API,但是当他们刚刚开始的时候就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了.后来SUN开始与数据库厂商们讨论,最终得出的结论就是,由SUN提供一套访问数据库的规范(就是一组接口),并且提供数据库的协议标准,然后数据库厂商会按照SUM的规范提供一套访问自己公司的数据库服务器的API.SUN提供的规范名为JDBC,而各个厂商提供的,遵循了JDBC远东的,可以访问自己数据库的API被称之为驱动.

    下载地址:

    https://dev.mysql.com/downloads/file/?id=470333


    3.获取连接

    DriverManager.getConnection(url,username,password)

    其中username和password是登陆数据库的用户名和密码

    url相对复杂一点,它是用来找到要连接数库主库的"网址",就好比你要浏览器中查找百度时,也需要提供一个url,下面是mysql的url:

    jdbc:mysql://localhost:3306/数据库的名字

    JDBC规定url的格式由三部分组成,每个部分中间使用冒号分隔.

    第一部分是jdbc,这是固定的.

    第二部分是数据库名称,那么连接mysql数据库,第二部分当然是mysql了.

    第三部分是由数据库厂商规定的,我们需要了解每个数据库厂商的要求,mysql的第三部分分别由数据库服务器的IP地址(localhost),端口号(3306),以及DATABASE名称组成.

    接下来我们把下载的mysql-connector-java-5.1.42-bin.jar放入根目录下的web->WEB-INF>lib下

    右键lib,找到Add as library,点击后我们就可以使用mysql驱动了

    下面是一个简单的mysql连接代码

package net.zixue.jdbc;

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Jdbc
{
    public static void main(String[] args) throws SQLException, ClassNotFoundException {

        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://localhost:3306/jsp";
        Connection connection = DriverManager.getConnection(url,"root","123456");

        connection.close();
    }
}

    Statement最为重要的方法是:

        init executeUpdate(String sql):执行更新操作,即执行insert,update,delete语句

        ResultSet ExecuteQuery(String sql):执行查询操作,执行查询操作会返回ResultSet,即结果集

    ResultSet之获取列数据

    可以通过next()方法使ResultSet的游标向下移动,当游标移动到你需要的行时,就需要来获取该行的数据了,ResultSet提供了一系列的获取列数据的方法

        String getString(int columnIndex):获取指定列的String类型数据

        int getInt(int columnIndex):获取指定列的int类型数据.

        double getDouble(int columnIndex) :获取指定列的double类型数据

        boolean getBoolean(int columnIndex):获取指定列的boolean类型数据;

        Object getObject(int columnIndex):获取指定列的Object类型的数据.        


    上面方法中,参数columnIndex表示列的索引,列索引从1开始,而不是0,这第一点与数组不同.如果你清楚当前列的数据类型,那么可以使用getInt()之类的方法来获取,如果你不清楚列的类型,那么你应该使用getObject()方法来获取.

    ResultSet还提供了一套通过列名称来获取列数据的方法:

        String getString(String columnName):获取名称为columnName的列的String数据. 

        int getInt(String columnName);获取名称为columnName的列的int数据

        double getDouble(String columnName)获取名称为columnName的列的double数据

        Object getObject(String columnName)获取名称为columnName的列的object数据.

    下面是一个查询的操作

package net.zixue.jdbc;

import java.sql.*;

public class query {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");

        String url = "jdbc:mysql://localhost:3306/zhihu";
        Connection connection = DriverManager.getConnection(url,"root","123456");

        Statement statement = connection.createStatement();
        String sql = "select * from users";
        ResultSet resultSet = statement.executeQuery(sql);
        while (resultSet.next())
        {
            String name = resultSet.getString("name");
            String email = resultSet.getString("email");
            System.out.println("名字:" + name + "邮箱地址:" + email);
        }
        resultSet.close();
        statement.close();
        connection.close();
    }
}

    运行结果如图:

    1.png


    预防SQL注入

    什么是SQL注入

    在需要用户进行输入的地方,例如登陆,恶意人员输入的是SQL语句的片段,最终输入的SQL片段与我们代码中定的SQL语句合成一个完整的SQL语句!例如用户在登陆时输入的用户名和密码都是为SQL语句的片段!

    防止SQL注入

    可以使用PreparedStatement.

    在使用Connection创建PreparedStatement对象时需要给出一个SQL模板,所以SQL模板就是有"?"的SQL语句,其中"?"就是参数

    在得到PreparedStatement对象后,调用它的setXXX()方法为"?"赋值,这样就可以得到把模板变成一条完整的SQL语句,然后再调用PreparedStatement对象的executeQuery获取ResultSet对象.

    注意PreparedStatement对象独有的executeQuery()方法是没有参数的,而Statement的executeQuery是需要参数(SQL语句)的.因为在创建PreparedStatement对象时已经让它与一条SQL模板绑定在一起了,所以在调用它的executeQuery()和executeUpdate()方法时就不再需要参数了.

    PreparedStatement最大的好处就是在于重复使用同一模板,给予其不同的参数来重复的使用它.这才是真正高效率的原因.

    所以,建议大家在今后的开发中,无论什么情况,都云需要PreparedStatement,而不是使用Statement.