JDBC概念原理和连接数据库以及工具类的书写

来源:互联网 发布:网络视频版权 编辑:程序博客网 时间:2024/06/06 02:22

1.JDBC概念(Java Data Base Connectivity)

就是java数据库连接,用于执行SQL语句的Java API.可以为多种关系数据库提供统一访问,由java语言编写的类和接口组成.是java访问数据的标准规范.实现接口的类在驱动程序中.
JDBC连接需要连接驱动, mysql-connector-java就是连接数据库和java的,两者进行通信必须使用.

2.JDBC原理

JDBC是接口,驱动就是接口的实现,没有驱动将无法完成数据库连接,从而不能操作数据库!

这里写图片描述

3.JDBC操作数据库的步骤

1.注册驱动
告知JVM使用的是哪一个数据库的驱动
推荐使用的代码:Class.forName(“com.mysql.jdbc.Driver”);
DriverManager.registerDriver(new com.mysql.jdbc.Driver());//不推荐使用
存在两方面不足1.硬编码,后期不易于程序扩展和维护2.驱动被注册两次。
2.获得连接
使用JDBC中的类,完成对MySQL数据库的连接
3.获得语句执行平台
通过连接对象获取SQL语句的执行者对象
4.执行SQL语句
使用执行者对象,向数据库执行SQL语句
获取到数据库执行后的结果
5.处理结果
6.释放资源:其实调用一堆的close方法.
执行insert语句获取结果集

代码示例://1.注册驱动 反射技术,将驱动类加入到内容        // 使用java.sql.DriverManager类静态方法 registerDriver(Driver driver)        // Diver是一个接口,参数传递,MySQL驱动程序中的实现类        //DriverManager.registerDriver(new Driver());        //驱动类源代码,注册2次驱动程序        Class.forName("com.mysql.jdbc.Driver");        //2.获得数据库连接  DriverManager类中静态方法        //static Connection getConnection(String url, String user, String password)          //返回值是Connection接口的实现类,在mysql驱动程序        //url: 数据库地址  jdbc:mysql://连接主机IP:端口号//数据库名字        String url = "jdbc:mysql://localhost:3306/mybase";        String username="root";        String password="123";        Connection con = DriverManager.getConnection(url, username, password);        //3.获得语句执行平台, 通过数据库连接对象,获取到SQL语句的执行者对象        // con对象调用方法   Statement createStatement() 获取Statement对象,将SQL语句发送到数据库        // 返回值是 Statement接口的实现类对象,,在mysql驱动程序中        Statement stat = con.createStatement();        //  4.执行sql语句        // 通过执行者对象调用方法执行SQL语句,获取结果        // int executeUpdate(String sql)  执行数据库中的SQL语句,因为他的返回值是int类型,所以只能使用 insert delete update三种操作方式.        // 返回值int,操作成功返回操作了多少行数据        int row = stat.executeUpdate                ("INSERT INTO sort(sname,sprice,sdesc) VALUES('汽车用品',50000,'疯狂涨价')");        System.out.println(row);        //6.释放资源  一堆close()        stat.close();        con.close();

4.JDBC开发步骤:

导入jar包
1.手动创建lib目录
2.添加jar包
3.右键build path - Add to Build Path
怎么查看JDBC的原码
找到com.mysql.jdbc包中的Driver.class文件,打开之后添加驱动文件的src文件夹即可

执行select语句获取结果

5.处理结果集(执行insert、update、delete无需处理)

ResultSet实际上就是一张二维的表格,我们可以调用其boolean next()方法指向某行记录,当第一次调用next()方法时,便指向第一行记录的位置,这时就可以使用ResultSet提供的getXXX(int col)方法(与索引从0开始不同,列是从1开始)来获取指定列的数据:
rs.next();//指向第一行
rs.getInt(1);//获取第一行第一列的数据
常用方法:
Object getObject(int index) / Object getObject(String name) 获得任意对象
String getString(int index) / Object getObject(String name) 获得字符串
int getInt(int index) / Object getObject(String name) 获得整型
double getDouble(int index) / Object getObject(String name) 获得双精度浮点型

查询之后对结果集的处理

//4.执行sql语句        String sql = "SELECT *FROM sort";        ResultSet exe = sta.executeQuery(sql);        //5.处理结果集        while(exe.next()) {            System.out.println(exe.getInt("sid")+"   "+exe.getString("sname")+"   "                    +exe.getDouble("sprice")+"   "+exe.getString("sdesc"));        }

6.SQL的注入攻击(登陆案例)

数据库当中先建一张users表,然后在表中添加两组数据,然后再执行查询操作.
CREATE TABLE users (
uid INT PRIMARY KEY AUTO_INCREMENT,
uname VARCHAR(300),
upass VARCHAR(300)
);
– 添加两条数据
INSERT INTO users(uname,upass) VALUES(‘a’,’1’),(‘b’,’2’);
– 查询用户的账号和密码

SELECT *FROM users WHERE uname=’a’ AND upass=’1’
OR 1=1;

//注册驱动        Class.forName("com.mysql.jdbc.Driver");        //连接数据库        String url = "jdbc:mysql://127.0.0.1:3306/mybase";        String user = "root";        String password = "123";        Connection connection = DriverManager.getConnection(url, user, password);        //获得语句执行平台        Statement statement = connection.createStatement();        //执行Sql语句        Scanner sc = new Scanner(System.in);        System.out.println("请分别输入用户名和密码");        String s1 = sc.nextLine();        String s2 = sc.nextLine();        String sql = "SELECT *FROM users WHERE uname='"+s1+"' AND upass='"+s2+"'";        System.out.println(sql);        ResultSet exe = statement.executeQuery(sql);        //处理结果集        while(exe.next()) {            System.out.println(exe.getString("uname")+"   "+exe.getString("upass"));        }        exe.close();        statement.close();        connection.close();

在登陆的时候分别输入用户名和密码,在密码后边加上’or’1=1,表示这条查询语句后边又多了一条 OR 1=1的代码(为true),也就是查询操作的结果一定为真,所以无论输入的是什么结果当中会拿到用户表中的所有数据

7.登陆攻击的解决方法:

    PreparedStatement prepare = connection.prepareStatement(sql);    prepare.setObject(1, s1);    prepare.setObject(2, s2);    ResultSet exe = prepare.executeQuery();

使用PrepareStatement接口,实现数据表的更新操作
String sql = “UPDATE sort SET sname=?,sprice=? WHERE sid=?”;
PreparedStatement prepare = connection.prepareStatement(sql);
prepare.setObject(1, “汽车”);
prepare.setObject(2,59999);
prepare.setObject(3, 7);
prepare.executeUpdate();

使用PrepareStatement接口实现数据表的查询操作.

JDBC工具类的书写当中
Con = DriverManger.getCOnnection(url,user,password);为什么会让强转?
导包的时候应该导java.sql.Connection;这个包
package com.JDBCUtils;
//JDBC的工具类
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/*
* JDBC的工具类,主要实现数据库的连接
*/
public class JDBCUtils {
// 私有构造方法
private JDBCUtils() {
}

// 创建Connection属性(静态,私有)private static Connection con;private static String url;private static String user;private static String password;// 静态代码块主要用于加载数据库连接的一些内容static {    // 需要进行异常处理    try {        Class.forName("com.mysql.jdbc.Driver");        // 获得连接        url = "jdbc:mysql://127.0.0.1:3306/mybase";        user = "root";        password = "123";        con = DriverManager.getConnection(url, user, password);    } catch (Exception ex) {          //让用户看的        throw new RuntimeException("数据库连接失败");    }}// 连接数据库的方法(静态,返回类类型为Connection)public static Connection getConnection() {    return con;}// 关闭资源(两个方法重载,参数的数量不同)public static void close(Connection con, Statement sta, ResultSet rs) {    // 使用IO流当中关闭流的方法    if (rs != null) {        try {            rs.close();        } catch (SQLException e) {            e.printStackTrace();        }    }    if (con != null) {        try {            con.close();        } catch (SQLException e) {            e.printStackTrace();        }    }    if (sta != null) {        try {            sta.close();        } catch (SQLException e) {            e.printStackTrace();        }    }}public static void close(Connection con, Statement sta) {    // 使用IO流当中关闭流的方法    if (con != null) {        try {            con.close();        } catch (SQLException e) {            e.printStackTrace();        }    }    if (sta != null) {        try {            sta.close();        } catch (SQLException e) {            e.printStackTrace();        }    }}

}

//测试JDBC工具类
public static void main(String[] args) throws SQLException {
//连接数据库
Connection con = JDBCUtils.getConnection();
//获得数据库执行平台
Statement sta = con.createStatement();
String sql = “select *from sort”;
ResultSet exe = sta.executeQuery(sql);
while(exe.next()) {
System.out.println(exe.getInt(“sid”)+exe.getString(“sname”)
+exe.getDouble(“sprice”)+exe.getString(“sdesc”));
}
//关闭资源
JDBCUtils.close(con, sta, exe);
}

静态变量、静态代码块、成员变量、构造函数的初始化顺序是??

先初始化父类的静态代码—>初始化子类的静态代码–>初始化父类的非静态代码—>初始化父类构造函数—>初始化子类非静态代码—>初始化子类构造函数

8.properties配置文件概述

开发中获得连接的4个参数(驱动、URL、用户名、密码)通常都存在配置文件中,方便后期维护,程序如果需要更换数据库,只需要修改配置文件即可。
可变的内容(数据库的类型, 连接主机ip,数据库的名字).
放置位置:放在src下边,就是源码的文件夹下
文件名字:随意,扩展名为properties
文件内容:格式为key=value

2.创建配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/mybase
user=root
password=123

3.加载配置文件
//使用类的加载器
InputStream in = PropertiesDemo.class.getClassLoader().getResourceAsStream(“database.properties”);
System.out.println(in);
Properties pro = new Properties();
pro.load(in);
System.out.println(pro);

4.通过配置文件连接数据库
//获取集合中的键值对(通过键获取值)
String driver = pro.getProperty(“driver”);
String url = pro.getProperty(“url”);
String user = pro.getProperty(“user”);
String password = pro.getProperty(“password”);
Class.forName(driver);//这行代码不写也可以执行吗??
Connection con = DriverManager.getConnection(url,user,password);

    System.out.println(con);

9.读取配置文件的工具类

读取配置文件,获取连接,就只执行一次,应该放在静态代码块中.
配置文件的工具类
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

import com.jdbc.PropertiesDemo;

//编写一个工具类,通过配置文件获取数据库的连接
public class JDBCProperties {

private static Connection con;private static String driver;private static String url;private static String user;private static String password;static {    try {        // 使用类的加载器        InputStream in = PropertiesDemo.class.getClassLoader()                .getResourceAsStream("database.properties");        Properties pro = new Properties();        pro.load(in);        // 获取集合中的键值对(通过键获取值)        driver = pro.getProperty("driver");        url = pro.getProperty("url");        user = pro.getProperty("user");        password = pro.getProperty("password");        Class.forName(driver);        //这里不能再加Connection,如果加了就和静态成员变量的con不是同一个变量了.        con = DriverManager.getConnection(url, user, password);    } catch (Exception ex) {        throw new RuntimeException("数据库连接失败");    }}public static Connection getConnection() {    return con;//返回的到的是静态的成员变量的con}

}
测试配置文件工具类
如果输出con的的实现类的话就证明测试类没有问题,连接数据库成功
Connection con = JDBCProperties.getConnection();
System.out.println(con);

原创粉丝点击