5_MySQL数据库四JDBC(数据库驱动的配置入门)

JDBC (一)

第一大块 JDBC概述

一、JDBC概述

  • a.概念:Java DataBase Connectivity Java数据库连接,Java语言操作数据库
  • b.JDBK本质:其实是官方(sun公司)定义的一套操作所有关系型数据的规则,即接口。

各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用
这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

  • c.快速入门:学会如何导入JDBC的jar包,也就是安装驱动。
  • d.简单介绍一下JDBC需要使用的对象

DriverManager对象:驱动管理对象
Connection:数据库连接对象
Statement:执行sql对象(使用静态的SQL)
ResultSet:结果集对象
PreparedStatemet:执行sql的对象(预编译的SQL)

第二大块 详解各个对象

一、DriverManager类 java.sql.DriverManager

  • a.功能:1.注册驱动 2.获取数据连接
  • b.方法:

static void registerDriver(Driver driver) 注册给定的驱动程序 实现通过 Class.forName(“com.mysql.jdbc.Driver”);因为这样注册驱动比较方便,直接在穿件类对象时执行静态代码块注册驱动
Connection getConnection(String url,String user,String password); 获取数据库连接
注意:url 指定连接的路径 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称 其实种数据库使用用的url语法是不一样的
如果连接的是本机的mysql服务器,并且默认端口是3306,则url可以写为jdbc:mysql:///数据库名称
说明:这里其实在参数url中已经是包含了一个数据库的精确的位置信息了,有数据库种类、数据库所在主机的IP地址、数据库的端口号、你要适用的数据库
接着的两个参数其实就是用户的信息了,一个注册了的用户可以连接这个数据库。

二、Connection接口 java.sql.Connection

  • a.功能:1.获取sql对象 2.管理事务
  • b.方法:

Statement creteStatement()
PreparedStatement prepareStatement(String sql)
void setAutoCommit(boolean autoCommit) false就是开启事务
void commit()
void rollback()

三、Statement接口

  • a.功能
  • b.方法:

boolean execute(String sql) :可以执行任意的sql 了解
int executeUpdate(String sql) :执行DML(insert、update、delete)语句、DDL(create,alter、drop)语句
返回值:影响的行数,可以通过这个影响的行数判断DML语句是否执行成功 返回值>0的则执行成功,反之,则失败。
ResultSet executeQuery(String sql) :执行DQL(select)语句
返回值:结果集对象

四、ResultSet接口

  • a.功能:
  • b.方法:
  • boolean next(): 游标向下移动一行,判断当前行是否是最后一行末尾(是否有数据),如果是,则返回false,如果不是则返回true
  • getXxx(参数):获取数据
  • Xxx:代表数据类型 如: int getInt() , String getString()
  • 参数:
  1. int:代表列的编号,从1开始 如: getString(1)
  2. String:代表列名称。 如: getDouble(“balance”)

第三大块 创建自己的工具类JDBCUtil

一、示例展示:实现了数据库安装驱动,建立与数据库连接,数据库资源释放的操作

/*
由于每次对mysql进行操作时都会对一部分繁琐的代码进行操作
    所以特地创建这个工具类,方便了对数据操作
      1.安装驱动
      2.建立和数据库的连接 DriverManager
      3.关闭相关资源  Statement Connection ResultSet
 */
public class JDBCUtil {
    //配置文件的内容,一是数据库连接字段;二是驱动安装字段;
    public static String url,user,password;
    public static String driver;

    static {
        try {
            //第一步获取配置文件信息
            Properties pro = new Properties();
            ClassLoader classLoader = JDBCUtil.class.getClassLoader();
            //这里需自己新建配置文件,后缀是.properties
            URL res = classLoader.getResource("JDBCpeizhi.properties");
            String path = res.getPath();
            System.out.println(path);
            pro.load(new FileReader(path));
            url = pro.getProperty("url");
            user = pro.getProperty("user");
            password = pro.getProperty("password");
            driver = pro.getProperty("driver");
            //第二步:安装驱动
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
//获取数据库连接,由配置文件决定
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, user, password);
    }
//关闭数据库相关资源,有一个是方法的重载
    public static void close(Statement stm, Connection con) {
        if (stm != null) {
            try {
                stm.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    public static void close(Statement stm, Connection con, ResultSet rs) {
        if (stm != null) {
            try {
                stm.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

三、示例说明解释

  • a.说明创建一个工具类的要点

1.创建的成员基本都是静态的,方便直接调用
2.静态代码块是一个很好的选择

  • b.在JDBC工具类中用到的额外方法(参考示例中的实际使用)

1.ClssLoader getClassLoader() 获取类加载器
2.URL getResource(String name) 参数:文件名,需要添加后缀 获取文件链接
3.String getPath() 获取完整路径
3.void load(FileReader reader) 读取配置文件信息到Peoperties集合中
4.Sting getProperties(Sting name) 参数:配合文件中的键 key 返回相应的值

  • c.配置文件的方法与步骤说明

注意点:配置文件通常不传递绝对路径,绝对路径不方便代码的移植。
步骤:1.获取Properties集合 2.通过当前所在类的类对象获取类加载器 3.获取配置文件路径
4.将配置文件中的数据读取到Properties集合中 5.通过集合获取对应的数据
Properties pro = new Properties();
ClassLoader classLoader = JDBCUtil.class.getClassLoader();
URL res = classLoader.getResource(“JDBCpeizhi.properties”);
String path = res.getPath(); //获取绝对路径
pro.load(new FileReader(path));
url = pro.getProperty(“url”);

第四大块 PrepareStatement接口

一、用PreparedStatement接口解决SQL出现的问题(注入问题)

  • a.SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的拼接。会造成安全性问题
  1. 输入用户随便,输入密码:a’ or ‘a’ = 'a
  2. sql:select * from user where username = ‘fhdsjkf’ and password = ‘a’ or ‘a’ = ‘a’
  • b.设置通配符 ? 的参数 参数1是?的位置 || 参数2是需要对?设置的值

void setXxx(int station,参数2)

  • c.执行DQL的方法同时获取ResultSet对象

ResultSet executeQuery()
说明:执行sql查询操作时,接受返回结果,不需要传递sql语句 //也就是在创建ResultSet对象时不需要进行传递参数,而Statement对象创建时需要在方法中传递参数;这是因为在创建prepareStatement对象时已经将SQL语句传递进来了

方法总结:按照使用的各个对象来说明了

说明:这里其实是有这么一个逻辑,1.安装驱动

2.与数据库建立连接(此时已经连接到了数据中对应的表中)
3.获取数据库执行对象
4.获取数据库结果集对象

一、DriverManager

  • a.注册驱动

Class.forName(“com.mysql.jdbc.Driver”); static void registerDriver(Driver driver)

  • b. 获取Connection对象(数据库连接对象)

Connection getConnection(String url,String user,String password);

二、Connection

  • a.获取sql对象(这里注意一下两个sql对象的获取方式的特点)

Statement createStatement()
PrepareStatement prepareStatement(String sql)

  • b.事务管理方法

void setAutoCommit(boolean autoCommit)
void commit()
void rollback()

三、Statement

  • a.执行DML、DDL的方法

int executeUpdate(String sql)

  • b.执行DQL的方法同时获取ResultSet对象,但是查看结果需要通过ResultSet对象

ResultSet executeQuery(String sql)

四、PrepareStatement

  • a.设置通配符 ? 的参数 参数1是?的位置 || 参数2是需要对?设置的值

void setXxx(int station,参数2)

  • b.执行DQL的方法同时获取ResultSet对象,虽然说这个通过PrepareStatement的方法创建ResultSet对象不需要传递参数,但是在创建PrepareStatement对象时传递的参数决定了是否可以调用这个无参方法。

ResultSet executeQuery()

  • c.执行DML、DDL的方法

int executeUpdate()

五、Result

  • a.移动游标:游标从表头行开始

boolean next()

  • b.获取数据

T getXxx(多种参数)

说的通熟一点,我对这些方法的认识就是

选择一个数据库并且登录这个数据库,选这一张表,两种sql对象对表进行增删改,之后sql对象把增删改之后的表传递给查询对象ResultSet来查询表中记录。

补充知识点:

1.静态SQL:类似于Statement对象穿的sql语句时的动作,字符串在java程序中事先拼接好在传递到数据库中去执行,会引发很多问题。

2.预编译SQL:类似于PrepareStatement对象,字符串没有拼接好之前就把字符串传递到MySQL数据库中,之后再传递参数。

3.占位符?这边要说明一下,占位符只能用来替代参数。

发布了21 篇原创文章 · 获赞 9 · 访问量 1488

猜你喜欢

转载自blog.csdn.net/qq_43230007/article/details/104155881