JDBC概念及API详解

目录

一、JDBC概念

JDBC本质:

JDBC好处:

二、JDBC快速入门步骤

三、JDBC API详解

DriverManger(驱动管理类)

Connection(数据库连接对象)

Statement(执行SQL语句)

ResultSet(结果集对象)

PreparedStatement(预编译SQL语句的对象)


一、JDBC概念

JDBC就是使用Java语言操作关系型数据库的一套API

全称:(Java DataBase Connectivity) Java数据库连接

JDBC本质:

官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口

各个数据库厂商去实现这套接口,提供数据库驱动jar包

我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

JDBC好处:

各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发

可随时替代底层数据库,访问数据库的Java代码基本不变

二、JDBC快速入门步骤

0、创建工程,导入驱动jar包

1、注册驱动

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

2、获取连接

Connection conn = DriverManager.getConnection(url, username, password);

3、定义SQL语句

String sql = "SQL语句";

4、获取执行SQL对象

Statement stat = conn.createStatement();

5、执行SQL

stat.executeUpdate(sql);

 6、处理返回结果

7、释放资源

代码示例:

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

/**
 * JDBC快速入门
 */
public class JDBCDemo1he2 {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
            //1、注册驱动
            Class.forName("com.mysql.jdbc.Driver");

            //2、获取连接:如果连接的是本机mysql并且端口是默认的3306,可以简化书写
            String url = "jdbc:mysql:///db1?useUnicode=true&characterEncoding=utf8";
            String username = "root";
            String password = "199884lj";
            Connection conn = DriverManager.getConnection(url, username, password);

            //3、定义sql
            String sql = "update stu set math = 90 where age = 55";

            //4、获取执行sql的对象
            Statement stat = conn.createStatement();

            //5、执行sql
            int count = stat.executeUpdate(sql);//受影响的行数

            //6、处理结束
            System.out.println(count);

            //7、释放资源
            stat.close();
            conn.close();
    }
}

三、JDBC API详解

DriverManger(驱动管理类)

管理JDBC驱动程序的基本服务。

作用:1、注册驱动        2、获取数据库连接

一、注册驱动

有此Driver文件可自动读取文件在,自动注册驱动

 二、获取数据库连接

static Connaction         getConnaction (String usl,String user,String password)

 参数

1、url:连接路径

语法:jdbc:mysql://地址(域名):端口号/数据库名称?参数键值对1&参数键值对2...

示例:jdbc:mysql://127.0.0.1:3306/db1

细节:

如果连接的是本机mysql服务器,并且mysql服务默认端口是3306,则usl可以简写为:jdbc:mysql:///数据库名称?参数键值对

2、user:用户名

3、password:密码

Connection(数据库连接对象)

与特定数据库连接(会话)。执行SQL语句并在连接的上下文中返回结果。

作用:1、获取执行SQL的对象        2、管理事务

1、获取执行SQL对象

普通执行SQL对象

Statement createStatement()

预编译SQL的执行SQL对象:防止SQL注入

PreparedStatement prepareStatement(sql)

执行存储过程的对象

CallableStatement prepareCall(sql)

2、事务管理

MySQL事务管理

开启事务:BEGIN;/START  TRANSACTION;

提交事务:COMMIT;

回滚事务:ROLLBACK;

MySQL默认自动提交事务

JDBC事务管理:Connection接口中定义了3个对应的方法

开启事务:setAutoCommit(boolean autoCommit):true为自动提交事务;false为手动提交事务,即为开启事务

提交事务:commit()

回滚事务:rollback()

代码示例

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

/**
 * JDBC API 详解:Connection
 */
public class JDBCDemo3_Connection {

    public static void main(String[] args) throws Exception {
        //1、注册驱动,在mysql的jar包下添加java.sql.Driver这个文件即可以省去手动注册驱动
//            Class.forName("com.mysql.jdbc.Driver");

        //2、获取连接:如果连接的是本机mysql并且端口是默认的3306,可以简化书写
        String url = "jdbc:mysql:///db1?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "xxxxxxxx";
        Connection conn = DriverManager.getConnection(url, username, password);

        //3、定义sql
        String sql1 = "update stu set math = 300 where id = 1";
        String sql2 = "update stu set math = 300 where id = 2";
        //4、获取执行sql的对象
        Statement stat = conn.createStatement();

        try {
            //开启事务
            conn.setAutoCommit(false);
            //5、执行sql
            int count1 = stat.executeUpdate(sql1);//受影响的行数

            //6、处理结束
            System.out.println(count1);

            //5、执行sql
            int count2 = stat.executeUpdate(sql2);//受影响的行数

            //6、处理结束
            System.out.println(count2);

            //提交事务
            conn.commit();
        } catch (Exception e) {
            //回滚事务
            conn.rollback();
            e.printStackTrace();
        }

        //7、释放资源
        stat.close();
        conn.close();
    }
}

执行结果:

 Statement(执行SQL语句)

用于执行静态SQL语句并返回其生成的结果的对象。

作用:执行SQL语句

int executeUpdate(sql):执行DML、DDL语句

返回值:1、DML语句影响的行数 2、DDL语句执行后,执行成功也可能返回0

ResultSet executeQuery(sql):执行DQL语句

返回值:ResultSet结果集对象

代码示例:


import org.junit.Test;

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

/**
 * JDBC API 详解:Statement
 */
public class JDBCDemo4_Statement {
    /**
     * 执行DML语句
     *
     * @throws Exception
     */
    @Test
    public void testDML() throws Exception {
        //1、注册驱动,在mysql的jar包下添加java.sql.Driver这个文件即可以省去手动注册驱动
//            Class.forName("com.mysql.jdbc.Driver");

        //2、获取连接:如果连接的是本机mysql并且端口是默认的3306,可以简化书写
        String url = "jdbc:mysql:///db1?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "xxxxxxx";
        Connection conn = DriverManager.getConnection(url, username, password);

        //3、定义sql
        String sql = "update stu set math = 90 where id=1";

        //4、获取执行sql的对象
        Statement stat = conn.createStatement();

        //5、执行sql
        int count = stat.executeUpdate(sql);//执行完DML语句,受影响的行数

        //6、处理结束
        //System.out.println(count);
        if (count > 0) {
            System.out.println("修改成功");
        } else {
            System.out.println("修改失败");
        }

        //7、释放资源
        stat.close();
        conn.close();

    }

    /**
     * 执行DDL语句
     * @throws Exception
     */
    @Test
    public void testDDDL() throws Exception {
        //1、注册驱动,在mysql的jar包下添加java.sql.Driver这个文件即可以省去手动注册驱动
//            Class.forName("com.mysql.jdbc.Driver");

        //2、获取连接:如果连接的是本机mysql并且端口是默认的3306,可以简化书写
        String url = "jdbc:mysql:///db1?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "xxxxxxxx";
        Connection conn = DriverManager.getConnection(url, username, password);

        //3、定义sql
        String sql = "drop database db2";

        //4、获取执行sql的对象
        Statement stat = conn.createStatement();

        //5、执行sql
        int count = stat.executeUpdate(sql);//执行完DDL语句,可能是0
   
        //6、释放资源
        stat.close();
        conn.close();

    }
}

运行结果:

 ResultSet(结果集对象)

ResultSet作用:

1、封装了DQL查询语句的结果

ResultSet  stmt.executeQuery(sql):执行DQL语句,返回ResultSet对象

获取查询结果

boolean next():1、将光标从当前位置向前移动一行 2、判断当前行是否为有效行

返回值:

1、true:有效行,当前行有数据

2、false:无效行,当前行没有数据

xxx  getXxx(参数):获取数据

xxx:数据类型;如:int getInt(参数);String getString(参数)

参数

int:列的编号,从1开始

String:列的名称

 代码示例:

import com.itheima.pojo.Account;
import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * JDBC API 详解:Result
 */
public class JDBCDemo5_ResultSet {
    /**
     * 执行DQl语句
     * @throws Exception
     */
    @Test
    public void testResultSet() throws Exception {
        //1、注册驱动,在mysql的jar包下添加java.sql.Driver这个文件即可以省去手动注册驱动
//            Class.forName("com.mysql.jdbc.Driver");

        //2、获取连接:如果连接的是本机mysql并且端口是默认的3306,可以简化书写
        String url = "jdbc:mysql:///db1?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "xxxxxxx";
        Connection conn = DriverManager.getConnection(url, username, password);

        //3、定义sql
        String sql = "select * from stu";

        //4、获取statement对象
        Statement stmt = conn.createStatement();

        //5、执行sql
        ResultSet rs = stmt.executeQuery(sql);

        //处理结果,遍历rs中的所有数值
        //6.1 光标向下移动一行,并且判断当前行是否有数据
//        while(rs.next()){
//            //6.2 获取数据 getXxx()
//            int id = rs.getInt(1);
//            String name = rs.getString(2);
//
//            System.out.println(id);
//            System.out.println(name);
//
//            System.out.println("---------------");
//        }

        while(rs.next()){
            //6.2 获取数据 getXxx()
            int id = rs.getInt("id");
            String name = rs.getString("name");

            System.out.println(id);
            System.out.println(name);

            System.out.println("---------------");
        }


        //7、释放资源
        rs.close();
        stmt.close();
        conn.close();

    }

    /**
     * 查看account账户表数据,封装为Account对象中,并且存储到ArrayList集合中
     * 1、定义实体类Account
     * 2、查询数据,封装到Account对象中
     * 3、将Account对象存入ArrayList集合中
     *
     *
     * @throws Exception
     */
    @Test
    public void testResultSet2() throws Exception {
        //1、注册驱动,在mysql的jar包下添加java.sql.Driver这个文件即可以省去手动注册驱动
//            Class.forName("com.mysql.jdbc.Driver");

        //2、获取连接:如果连接的是本机mysql并且端口是默认的3306,可以简化书写
        String url = "jdbc:mysql:///db1?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "xxxxxx";
        Connection conn = DriverManager.getConnection(url, username, password);

        //3、定义sql
        String sql = "select * from account";

        //4、获取statement对象
        Statement stmt = conn.createStatement();

        //5、执行sql
        ResultSet rs = stmt.executeQuery(sql);

        //创建集合
        List<Account> list = new ArrayList<>();

        while(rs.next()){
            Account account = new Account();

            //6.2 获取数据 getXxx()
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int money = rs.getInt("money");

            //赋值
            account.setId(id);
            account.setName(name);
            account.setMoney(money);

            //存入集合
            list.add(account);
        }

        System.out.println(list);

        //7、释放资源
        rs.close();
        stmt.close();
        conn.close();

    }
}

运行结果:

PreparedStatement(预编译SQL语句的对象)

作用:预编译SQL语句并执行,预防SQL注入问题

SQL注入

SQL注入是通过操作输入来修改事先定义号的SQL语句,用以达到执行代码对服务器进行攻击的方法。

SQL注入演示:

import com.itheima.pojo.Account;
import org.junit.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * 用户登录
 */
public class JDBCDemo6_UserLogin {


    @Test
    public void testResultSet() throws Exception {

        //2、获取连接:如果连接的是本机mysql并且端口是默认的3306,可以简化书写
        String url = "jdbc:mysql:///db1?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "199884lj";
        Connection conn = DriverManager.getConnection(url, username, password);

        //接收用户输入 用户名和密码
        String name = "zhangsan";
        String pwd = "2";

        String sql = "select * from tb_user where username = '" + name + "' and password = '" + pwd + "'";

        //获取stmt对象
        Statement stmt = conn.createStatement();

        //执行sql
        ResultSet rs = stmt.executeQuery(sql);

        //判断登录是否成功
        if (rs.next()) {
            System.out.println("登录成功");
        } else {
            System.out.println("登录失败");
        }


        //7、释放资源
        rs.close();
        stmt.close();
        conn.close();

    }

    /**
     * 演示SQL注入
     * @throws Exception
     */

    @Test
    public void testLogin_Inject() throws Exception {

        //2、获取连接:如果连接的是本机mysql并且端口是默认的3306,可以简化书写
        String url = "jdbc:mysql:///db1?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "199884lj";
        Connection conn = DriverManager.getConnection(url, username, password);

        //接收用户输入 用户名和密码
        String name = "sdbabasdga";
        String pwd = "'or'1'='1";

        String sql = "select * from tb_user where username = '" + name + "' and password = '" + pwd + "'";

        System.out.println(sql);
        //获取stmt对象
        Statement stmt = conn.createStatement();

        //执行sql
        ResultSet rs = stmt.executeQuery(sql);

        //判断登录是否成功
        if (rs.next()) {
            System.out.println("登录成功");
        } else {
            System.out.println("登录失败");
        }


        //7、释放资源
        rs.close();
        stmt.close();
        conn.close();

    }
}

运行结果:

sql注入语句

select * from tb_user where username 'sdbabasdga' and password = ' ' or '1' = '1'

 

1、获取PreparedStatement对象

//SQL语句中的参数值,使用?占位符替代

String sql = "select * from tb_user where username = ? and password = ?";

//通过Connection对象获取,并传入对应的sql语句

PreparedStatement pstmt = conn.prepareStatement(sql);

2、设置参数值

PreparedStatement对象:setXxx(参数1,参数2):给?赋值

Xxx:数据类型:如setInt(参数1,参数2)

参数:

参数1:?的位置编号,从1开始

参数2:?的值

3、执行SQL

executeUpdate();/executeQuery();:不需要再传递sql

PreparedStatement好处:

1、预编译SQL,性能更高

2、防止SQL注入:将敏感字符进行转义

①PreparedStatement 预编译功能开启:useServerPrepStmts=true

②配置MySQL执行日志(重启mysql服务后生效)

log-output=FILE
general-log=1
general_log_file="D://mysql.log"
slow-query-log=1
slow_query_log_file="D://mysql_slow.log"
long_query_time=2

PrepareStatement原理:

1、在获取PreparedStatement对象时,将sql语句发送给mysql服务检查,编译(这些步骤很耗时)

2、执行时就不用再进行这些步骤,速度更快

3、如果sql模板一样,则只需要进行一次检查、编译

代码示例:

import org.junit.Test;

import java.sql.*;

/**
 * API详解 PreparedStatement
 */
public class JDBCDemo7_PreparedStatement {


    @Test
    public void testPreparedStatement() throws Exception {

        //2、获取连接:如果连接的是本机mysql并且端口是默认的3306,可以简化书写
        String url = "jdbc:mysql:///db1?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "xxxxxxxx";
        Connection conn = DriverManager.getConnection(url, username, password);

        //接收用户输入 用户名和密码
        String name = "zhangsan";
        String pwd = "123";

        //定义sql
        String sql = "select * from tb_user where username = ? and password = ?";

        //获取stmt对象
        PreparedStatement pstmt = conn.prepareStatement(sql);

        //设置?的值
        pstmt.setString(1,name);
        pstmt.setString(2,pwd);

        //执行sql
        ResultSet rs = pstmt.executeQuery();

        //判断登录是否成功
        if (rs.next()) {
            System.out.println("登录成功");
        } else {
            System.out.println("登录失败");
        }


        //7、释放资源
        rs.close();
        pstmt.close();
        conn.close();

    }

    /**
     * PreparedStatement原理
     * @throws Exception
     */
    @Test
    public void testPreparedStatement2() throws Exception {

        //2、获取连接:如果连接的是本机mysql并且端口是默认的3306,可以简化书写
        String url = "jdbc:mysql:///db1?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "xxxxxxx";
        Connection conn = DriverManager.getConnection(url, username, password);

        //接收用户输入 用户名和密码
        String name = "zhangsan";
        String pwd = "'or'1'='1";

        //定义sql
        String sql = "select * from tb_user where username = ? and password = ?";

        //获取stmt对象
        PreparedStatement pstmt = conn.prepareStatement(sql);


        //设置?的值
        pstmt.setString(1,name);
        pstmt.setString(2,pwd);

        ResultSet rs = null;

        //执行sql
        rs = pstmt.executeQuery();

        //设置?的值
        pstmt.setString(1,"aaa");
        pstmt.setString(2,"bbb");

        //执行sql
        rs = pstmt.executeQuery();

        //判断登录是否成功
        if (rs.next()) {
            System.out.println("登录成功");
        } else {
            System.out.println("登录失败");
        }


        //7、释放资源
        rs.close();
        pstmt.close();
        conn.close();

    }


}

运行结果:

 

  • 10
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
PostgreSQL JDBC API 是用于连接和操作 PostgreSQL 数据库的一种 Java APIJDBCJava Database Connectivity)是 Java 提供的一种用于访问关系型数据库的标准接口,在许多 Java 应用程序中广泛使用。 通过 PostgreSQL JDBC API开发人员可以通过编写 Java 代码来连接到 PostgreSQL 数据库,并执行各种数据库操作,如查询、插入、更新和删除数据。 使用 PostgreSQL JDBC API 的第一步是获取数据库的连接。通过指定数据库的 URL、用户名和密码,可以使用 DriverManager 类来获取与数据库的连接。一旦连接成功,就可以创建 Statement 对象,用于执行 SQL 查询和更新语句。 PostgreSQL JDBC API 支持多种查询方式。可以使用 Statement 对象执行简单的 SQL 查询语句,也可以使用 PreparedStatement 对象执行参数化的查询语句,以提高查询效率和安全性。此外,还可以使用 CallableStatement 对象执行存储过程和函数。 在查询数据时,可以使用 ResultSet 对象来获取查询结果。ResultSet 对象是一个指向查询结果的游标,可以用于逐行迭代结果集,获取每行的数据。 除了查询,PostgreSQL JDBC API 还支持更新数据库。可以使用 Statement 或 PreparedStatement 对象来执行 INSERT、UPDATE 和 DELETE 操作,以修改数据库中的数据。 此外,PostgreSQL JDBC API 还提供了一些高级功能,如事务处理、连接池和元数据访问。通过使用这些功能,开发人员可以更好地管理数据库连接、处理并发操作,并获得关于数据库结构和元数据的信息。 总之,PostgreSQL JDBC API 提供了一种方便灵活的方式来连接和操作 PostgreSQL 数据库,使开发人员能够轻松地在 Java 应用程序中集成 PostgreSQL 数据库

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏志121

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值