JDBC学习笔记

一、JDBC概述

JDBC:Java Database Connectivity

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

二、JDBC简单操作实例

步骤:

1.创建工程,导入驱动jar包

jar包下载链接:

链接:https://pan.baidu.com/s/17FhumeDaZIePcycpIk6POA?pwd=do82 
提取码:do82

先在根目录下创建一个lib文件夹,再将jar包粘贴进去,点击右键添加为库文件(add as library)。

2.在src下创建Java类编写代码

通过Java操作关系型数据库students的代码如下:

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

public class Test {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1.注册驱动(MySQL5之后的驱动包可以省略此步骤)
        Class.forName("com.mysql.jdbc.Driver");
        //2.获取连接
        String url="jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
        String username="root";
        String password="123456";
        Connection connection = DriverManager.getConnection(url, username, password);
        //3.定义sql
        String sql="update students set sname='柯南' where sid='102299101'";
        //4.获取执行sql的对象
        Statement statement = connection.createStatement();
        //5.执行sql
        int i = statement.executeUpdate(sql);
        //6.显示执行结果(表中被影响的行数)
        System.out.println(i);
        //7.释放资源
        connection.close();
        statement.close();
    }
}

3.执行结果

执行前students表的内容如图所示

 执行结果如下

可以看到控制台出现了警告提示:

Thu Nov 10 09:20:49 CST 2022 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

翻译:

Thu Nov 10 09:20:49 CST 2022 WARN:不建议在没有服务器身份验证的情况下建立SSL连接。根据MySQL 5.5.45+、5.6.26+和5.7.6+的要求,如果不设置显式选项,默认必须建立SSL连接。为了符合现有的不使用SSL的应用程序,verifyServerCertificate属性被设置为'false'。您需要通过设置useSSL=false显式禁用SSL,或者设置useSSL=true并为服务器证书验证提供信任存储区。

解决方案:在url后配置useSSL=fales,禁用安全连接方式。

修改后的url为

jdbc:mysql://127.0.0.1:3306/test?useSSL=false

此时执行后控制台不再出现红色警告 。

执行后表的结果如图所示,可以看到第一行的内容已被更新 。

 三、对JDBC的各种API进行分析

1.Driver接口

  Driver接口由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。如:

  装载MySql驱动:Class.forName("com.mysql.jdbc.Driver");

  装载Oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");

2.Connection接口

  Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定义的数据库Connection连接上。

  连接MySql数据库:Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");

  连接Oracle数据库:Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password");

  连接SqlServer数据库:Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port; DatabaseName=database", "user", "password");

  常用方法:

    • createStatement():创建向数据库发送sql的statement对象。
    • prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
    • prepareCall(sql):创建执行存储过程的callableStatement对象。
    • setAutoCommit(boolean autoCommit):设置事务是否自动提交。
    • commit() :在链接上提交事务。
    • rollback() :在此链接上回滚事务。

3.Statement接口

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

  三种Statement类:

    • Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
    • PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。
    • CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。

  常用Statement方法:

    • execute(String sql):运行语句,返回是否有结果集
    • executeQuery(String sql):运行select语句,返回ResultSet结果集。
    • executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数。
    • addBatch(String sql) :把多条sql语句放到一个批处理中。
    • executeBatch():向数据库发送一批sql语句执行。

4.ResultSet接口

  ResultSet提供检索不同类型字段的方法,常用的有:

    • getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。
    • getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。
    • getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。
    • getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
    • getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。

  ResultSet还提供了对结果集进行滚动的方法:

    • next():移动到下一行
    • Previous():移动到前一行
    • absolute(int row):移动到指定行
    • beforeFirst():移动resultSet的最前面。
    • afterLast() :移动到resultSet的最后面。

使用后依次关闭对象及连接:ResultSet → Statement → Connection

四、JDBC事务管理

先了解MySQL事务管理(默认自动提交事务):

开始事务:BEGIN;

提交事务:COMMIT;

回滚事务:ROLLBACK;

JDBC事务管理的代码实现:

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

public class Test2 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
        String username="root";
        String password="123456";
        Connection connection = DriverManager.getConnection(url, username, password);
        String sql1="update students set sname='安室透' where sid='102299202'";
        String sql2="update students set sname='赤井秀一',smajor='警察' where sid='102299203'";
        Statement statement = connection.createStatement();
        try {
            //开启事务
            connection.setAutoCommit(false); //关闭自动提交事务
            int i = statement.executeUpdate(sql1);
            System.out.println(i);
            int j=3/0;
            int k = statement.executeUpdate(sql2);
            System.out.println(k);
            //提交事务
            connection.commit();
        }catch (Exception e){
            //回滚事务
            connection.rollback();
            e.printStackTrace();
        }
        statement.close();
        connection.close();
    }
}

当代码执行到第21行:j=3/0时,出现异常,程序跳转到回滚事务部分,之前所做的修改也全部撤销,关系表与原来一致。

执行结果如图:

students表未发生变化:

 若删除异常语句,则students表可以被Java代码修改。

执行完成后的students表如图所示

 五、用JDBC进行表的查询

 用JDBC进行表查询,查询结果会保存到ResultSet里,因此要想读出其中的查询结果需要对ResultSet进行遍历:

boolean next():

1.判断当前行是否为有效行

2.将光标从当前位置向后移动一行

×××get×××(参数):

1.×××表示数据类型

2.参数表示列的名称

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class Test3 {
    public static void main(String[] args) throws Exception{
        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
        String username="root";
        String password="123456";
        Connection connection = DriverManager.getConnection(url,username,password);
        String sql="select * from students";
        Statement statement = connection.createStatement();
        //执行查询语句后返回ResultSet对象
        ResultSet resultSet = statement.executeQuery(sql);
        //创建集合
        List<Student> list=new ArrayList<Student>();
        //遍历resultSet
        while (resultSet.next()){
            Student student=new Student();
            //获取数据
            int sid=resultSet.getInt("sid");
            String sname=resultSet.getString("sname");
            String smajor=resultSet.getString("smajor");
            int sclass=resultSet.getInt("sclass");
            String sgender=resultSet.getString("sgender");
            Date sbirthday=resultSet.getDate("sbirthday");
            String school=resultSet.getString("school");
            //给student赋值
            student.setSid(sid);
            student.setSname(sname);
            student.setSmajor(smajor);
            student.setSclass(sclass);
            student.setSgender(sgender);
            student.setSbirthday(sbirthday);
            student.setSchool(school);
            //存入集合
            list.add(student);
        }
        //输出结果
        System.out.println(list);
        resultSet.close();
        statement.close();
        connection.close();
    }
}

 执行结果如图所示

六、PreparedStatement解决SQL注入问题

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

SQL注入原理:字符串拼接

select * from user where username = 'abc' and password = ''or '1' = '1'

从上面的语句可以看出不管用户名abc和密码是否满足,or后面的等式恒成立,最终的结果为true,因此可以正常访问数据库,而PreparedStatement可以解决这个漏洞。

PreparedStatement:预编译SQL并执行;预防SQL注入问题

实现代码如下

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class Test4 {
    public static void main(String[] args) throws Exception{
        Class.forName("com.mysql.jdbc.Driver");
        String url="jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
        String username="root";
        String password="123456";
        Connection connection = DriverManager.getConnection(url,username,password);
        //定义sql语句,语句中的参数用?占位符替代
        String sql="select * from students where sid = ? and sname = ?";
        //获取preparedstatement对象
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //设置?的值
        preparedStatement.setInt(1,102299101);
        preparedStatement.setString(2,"柯南");
        //创建集合
        List<Student> list=new ArrayList<Student>();
        //执行sql
        ResultSet resultSet = preparedStatement.executeQuery();
        //查看结果
        while (resultSet.next()){
            Student student=new Student();
            //获取数据
            int sid=resultSet.getInt("sid");
            String sname=resultSet.getString("sname");
            String smajor=resultSet.getString("smajor");
            int sclass=resultSet.getInt("sclass");
            String sgender=resultSet.getString("sgender");
            Date sbirthday=resultSet.getDate("sbirthday");
            String school=resultSet.getString("school");
            //给student赋值
            student.setSid(sid);
            student.setSname(sname);
            student.setSmajor(smajor);
            student.setSclass(sclass);
            student.setSgender(sgender);
            student.setSbirthday(sbirthday);
            student.setSchool(school);
            //存入集合
            list.add(student);
        }
        System.out.println(list);
        //释放资源
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}

执行结果如下

可以发现与Statement不同的是,PreparedStatement中定义sql语句时,sql中的参数值用?占位符替代,在执行之前用 PreparedStatement的set×××(?的位置编号,?的值)给?赋值。

 PreparedStatement解决SQL注入的原理是将SQL中参数的特殊字符进行转译。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、概述: JDBC从物理结构上说就是Java语言访问数据库的一套接口集合。从本质上来说就是调用者(程序员)和实现者(数据库厂商)之间的协议。JDBC的实现由数据库厂商以驱动程序的形式提供。JDBC API 使得开发人员可以使用纯Java的方式来连接数据库,并进行操作。 ODBC:基于C语言的数据库访问接口。 JDBC也就是Java版的ODBC。 JDBC的特性:高度的一致性、简单性(常用的接口只有4、5个)。 1.在JDBC中包括了两个包:java.sql和javax.sql。 ① java.sql 基本功能。这个包中的类和接口主要针对基本的数据库编程服务,如生成连接、执行语句以及准备语句和运行批处理查询等。同时也有一些高级的处理,比如批处理更新、事务隔离和可滚动结果集等。 ② javax.sql 扩展功能。它主要为数据库方面的高级操作提供了接口和类。如为连接管理、分布式事务和旧有的连接提供了更好的抽象,它引入了容器管理的连接池、分布式事务和行集等。 注:除了标出的Class,其它均为接口。 API 说明 java.sql.Connection 与特定数据库的连接(会话)。能够通过getMetaData方法获得数据库提供的信息、所支持的SQL语法、存储过程和此连接的功能等信息。代表了数据库java.sql.Driver 每个驱动程序类必需实现的接口,同时,每个数据库驱动程序都应该提供一个实现Driver接口的类。 java.sql.DriverManager (Class) 管理一组JDBC驱动程序的基本服务。作为初始化的一部分,此接口会尝试加载在”jdbc.drivers”系统属性中引用的驱动程序。只是一个辅助类,是工具。 java.sql.Statement 用于执行静态SQL语句并返回其生成结果的对象。 java.sql.PreparedStatement 继承Statement接口,表示预编译的SQL语句的对象,SQL语句被预编译并且存储在PreparedStatement对象中。然后可以使用此对象高效地多次执行该语句。 java.sql.CallableStatement 用来访问数据库中的存储过程。它提供了一些方法来指定语句所使用的输入/输出参数。 java.sql.ResultSet 指的是查询返回的数据库结果集。 java.sql.ResultSetMetaData 可用于获取关于ResultSet对象中列的类型和属性信息的对象。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值