JAVA学习笔记(十三)

JDBC

1.概述

  JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。是Java访问数据库的标准规范

  JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

  JDBC需要连接驱动,驱动是两个设备要进行通信,满足一定通信数据格式,数据格式由设备提供商规定,设备提供商为设备提供驱动软件,通过软件可以与该设备进行通信。

2.原理

  JDBC是接口,驱动是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!每个数据库厂商都需要提供自己的驱动,用来连接自己公司的数据库,也就是说驱动一般都由数据库生成厂商提供。

3.JDBC开发步骤

  1.注册驱动.

    告知JVM使用的是哪一个数据库的驱动

  2.获得连接.

    使用JDBC中的类,完成对MySQL数据库的连接

  3.获得语句执行平台

    通过连接对象获取对SQL语句的执行者对象

  4.执行sql语句

    使用执行者对象,向数据库执行SQL语句

    获取到数据库的执行后的结果

  5.处理结果

  6.释放资源.

    调用一堆close()方法

  3.1导入驱动jar包

  创建lib目录,用于存放当前项目需要的所有jar包,选择jar包,右键执行build path / Add to Build Path

  3.2JDBC开发步骤代码

package com.oracle.demo1;

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


public class demo01 {

    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        // 1.注册驱动(反射的概念)
        //DriverManager.registerDriver(new Driver());
        Class.forName("com.mysql.jdbc.Driver");
        //2.获得连接
        //url格式url="jdbc:mysql://主机:端口号/数据库名";
        String url="jdbc:mysql://localhost:3306/demo_jdbc";
        String username="root";
        String password="123456";
        Connection conn=DriverManager.getConnection(url, username, password);
        //3.获得语句执行平台
        Statement sta=conn.createStatement();
        //4.执行SQL语句
        //String sql="INSERT INTO sort(sname,sprice,syear) VALUES ('中央空调',2000,10)";
        String sql="update sort set sprice=33 where sid=2";
        int row=sta.executeUpdate(sql);
        //5.处理结果集
        System.out.println(row);
        //6.释放资源(先开的后关)
        sta.close();
        conn.close();
    }
}

  3.3SQL注入问题

  假设有登录SQL语句如下

SELECT * FROM 用户表 WHERE NAME = 用户输入的用户名 AND PASSWORD = 用户输的密码;

  此时,用户输入正确的用户名和密码,查询到了信息用户可以登录。但是当输入的帐号为XXX

密码为'XXX' OR 'a'='a'时,真正执行的代码变成了

SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’  OR ’a’=’a’;

  此时,用户不需要输入正确的用户名和密码也能登录成功。这便是SQL的注入问题。

  为了解决这一问题,我们使用PreparedStatement来反注入。

  3.4JDBC工具类

  以后涉及数据库的增删改查操作,都会用到获得数据库连接操作。为了实现代码的重复利用,我们可以封装工具类JDBCUtil,用来提供获取连接对象的方法。代码如下

package com.oracle.demo2;

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

public class Dbutil {
    private Dbutil() {}
    static Connection conn;
    static {
        try{
            Class.forName("com.mysql.jdbc.Driver");
            String url="jdbc:mysql://localhost:3306/demo_jdbc";
            Scanner sc=new Scanner(System.in);
            String username="root";
            String password="123456";
            conn=DriverManager.getConnection(url,username,password);
            }catch(Exception ex){
                throw new RuntimeException(ex+"数据库连接失败");
            }
    }
    public static Connection getConn() {
        return conn;
    }
    public static void close(ResultSet rs,Statement sta,Connection conn){
        if(rs!=null) {
            try {
                rs.close();
            }catch(SQLException ex) {}
        }
        if(sta!=null) {
            try {
                sta.close();
            }catch(SQLException ex) {}
        }if(conn!=null) {
            try {
                conn.close();
            }catch(SQLException ex) {}
        }
    }
    public static void close(Statement sta,Connection conn){
        if(sta!=null) {
            try {
                sta.close();
            }catch(SQLException ex) {}
        }if(conn!=null) {
            try {
                conn.close();
            }catch(SQLException ex) {}
        }
    }
}

 

posted @ 2018-04-16 17:04  445412434  阅读(129)  评论(0编辑  收藏  举报