当前位置:网站首页>JDBC看这篇就够了

JDBC看这篇就够了

2022-07-06 09:23:00 想要进大厂

文章目录


前言

学了Mysql数据库后,花了两天时间学习了一下JDBC的使用,这里整理了一下笔者对jdbc的理解(注:本文所有代码针对Mysql数据库进行编码)


提示:以下是本篇文章正文内容,下面案例可供参考

一、JDBC是什么?

JDBC是SUN公司制定的一套接口,接口都有调用者和实现者,面向接口调用、面向接口写实现类、这都属于面向接口编程。

二、JDBC原理图

JDBC API是一系列的接口,它统一和规范了应用程序与数据库的连接,执行SQL语句,并得到返回结果等各类操作,相关类和接口在java.sql和javax.sql包中

三、JDBC的使用步骤

JDBC导入mysql驱动文件

(1) 在Mysql官网下载相应的驱动jar包,根据自己使用的mysql版本选择合适的版本进行下载,如果是Mac本,选择tar.gz文件下载,如果是win系统,选择zip文件下载,最后进行解压即可

(2)在IEDA中导入驱动文件

然后选择 

这样就完成了对Mysql数据库驱动文件进行导入

四、JDBC编码步骤

1.注册驱动,获取连接

创建数据库连接的方式有五种,我简单的介绍一下

Driver接口的方法:

Connectionconnect(String url, Properties info)

尝试使数据库连接到给定的URL

返回的connect对象就是连接数据的对象

第一种方式:

public void connect01() throws SQLException {

        //注册驱动
        Driver driver = new Driver();
        //jdbc:mysql://是规定好的协议,localhost:3306代表本机 和监听的端口,xyx_db02表示连接到xyx_db02这张表
        String url = "jdbc:mysql://localhost:3306/xyx_db02";
        //将 用户名 和 密码 放入到 Properties 对象中
        Properties properties = new Properties();
        properties.setProperty("user","root"); //用户 ,properties(key,value) key是规定好的 "user"
        properties.setProperty("password","123"); //密码
        Connection connect = driver.connect(url, properties); //返回一个连接
        System.out.println(connect);
    }

第二种方式:通过java的反射机制加载Driver类

public void connect02() throws Exception {
       //使用反射加载Driver类 ,动态加载,更加的灵活,减少依赖性
        Class<?> cls = Class.forName("com.mysql.jdbc.Driver");
       Driver driver = (Driver) cls.newInstance();
        String url = "jdbc:mysql://localhost:3306/xyx_db02";
        //将 用户名 和 密码 放入到 Properties 对象中
        Properties properties = new Properties();
        properties.setProperty("user","root"); //用户 ,properties(key,value) key是规定好的 "user"
        properties.setProperty("password","123"); //密码
        Connection connect = driver.connect(url, properties); //返回一个连接
        System.out.println("方式二"+connect);

    }

第三种方式:通过 DriverManager类的registerDriver方法传入driver对象完成对数据库的连接

static ConnectiongetConnection(String url, String user, String password)

尝试建立与给定数据库URL的连接

public void connect03() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {

       //使用反射加载Driver
        Class<?> aClass = Class.forName("com.mysql.jdbc.Driver");
       Driver driver = (Driver) aClass.newInstance();

       //创建url 和 user 和password
        String url = "jdbc:mysql://localhost:3306/xyx_db02";
        String user = "root";
        String password = "xuyuxuan0724";

        DriverManager.registerDriver(driver); //注册Driver驱动

        Connection connection = DriverManager.getConnection(url, user, password);

        System.out.println("第三种方式= " + connection);
    }

第四种方式:Class.forName()方法,自动完成注册驱动

public  void  connect4() throws ClassNotFoundException, SQLException {
       //com.mysql.jdbc.Driver

       //使用反射加载Driver类
        Class.forName("com.mysql.jdbc.Driver");

        //创建url 和 user 和password
        String url = "jdbc:mysql://localhost:3306/xyx_db02";
        String user = "root";
        String password = "xuyuxuan0724";
        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println("第四种方式 = " +connection);
    }

这里两点需要说明:

1.Mysql驱动5.1.6之后可以无需Class.forName("com.mysql.jdbc.Driver");

2.从jdk1.5使用了jdbc4,不再需要显示调用Class.forName()注册驱动,而是自动调用驱动jar包下META-INF\services\java.sql.Driver文本中的类名称去注册

第五种方式:写入配置文件,让mysql连接更灵活,减少代码冗余

 

 public void connect05() throws IOException, ClassNotFoundException, SQLException {

       //通过Properties对象获取相关配置文件的信息
        Properties properties = new Properties();
        properties.load( new FileInputStream("src//mysql.Properties"));
        //获取相关的值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");
        Class.forName(driver);

        Connection connection = DriverManager.getConnection(url, user, password);
        System.out.println("方式五 " +connection);
    }

DriverManager不调用registerDriver()方法传入driver是为什么?

是因为在类加载的时候,Driver类底层的static代码块中已经调用了该方法,是自动注册驱动

这里附上Driver类的底层源码:

public class Driver extends NonRegisteringDriver implements java.sql.Driver{
    
    static {
        try{
            java.sql.DriverManager.registerDriver(new Driver());
        } catch(SQLException E) {
            throw new RuntomeExceptione("Can't register driver!");
        }
    }

好了,相信小伙伴看到这里,对JDBC连接数据库的方式有了一个大概的认识,这里我们进入下一个步骤

2.组织SQL语句

        String sql = "Update  actor set name = '周星驰' ";
        //用于操作 sql语句
        Statement statement = connect.createStatement(); //
        int rows = statement.executeUpdate(sql); //如果是 dml语句 返回的就是影响的行数
        System.out.println(rows >0 ?"成功":"失败"); // 1

代码测试过,返回的是成功;

这里有一个问题,Statement类在开发中是不允许使用的,因为它存在一个SQL注入问题,我们来看一个典型的SQL注入问题:

如果我们使用select语句,这里会判断where后面的sql语句,我们原本想要查询的数据 name ='tom',pwd='123',而上图的sql语句就相当于写了个万能条件语句,name='1' 或者 pwd = ' 或者'1=1',这里显然是可以查询出我们想要的数据的,据说在2000年左右,因为sql注入问题让很多企业损失惨重,后面这个问题才被解决

这里我们介绍一下Statement类

Statement类

基本介绍:

1.用于执行静态Sql语句并返回其生成结果

2.在连接建立后,需要对数据库进行访问,执行命名或是SQL语句,可以通过Statement(存在SQL注入问题)PrepardStatement(预处理) CallableStatement(存储过程)

3.Statement对象执行SQL语句,存在SQL注入风险

4.SQL注入是利用某些系统没有对用户输入对数据进行充分对检查,而在用户输入数据中注入非法对SQL语句段或命令,恶意攻击数据库

5.要防范SQL注入,只要用PreparedStatement(从Statement扩展而来),取代Statement就可以了

聊到select语句,在这里介绍一下ResultSet类

ResultSet类

表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

ResultSet对象保持一个光标指向其当前的数据行。 最初,光标位于第一行之前。 next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false ,因此可在while循环中使用循环来遍历结果集。

我们来看一下ResultSet底层

rows所有行,是一个ArrayList数组,internalRowDate是一个对象数组,每个对象数组包含各行的数据,比如说0对应的是49是id为1的ASCll码,1对应的name中的‘周星驰‘,UTF-8中每一个汉字占三个字节,所以对应了九个ascll码以此类推

由于只是测试,表我们已经建好了

mysql> select * from actor;
+----+-----------+-----+---------------------+-------+
| id | name      | sex     | borndate            | phone |
+----+-----------+-----+---------------------+-------+
|  1 | 周星驰     | 男      | 1970-11-11 00:00:00 | 110   |
|  3 | 刘德华     | 男      | 1970-12-12 00:00:00 | 110   |
|  4 | 吴孟达     | 男      | 1969-01-01 00:00:00 | 1231  |
+----+-----------+-----+---------------------+-------+

        //1.注册驱动
        Class.forName(driver);
        //2.得到连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //3.得到Statement
        Statement statement = connection.createStatement();
        //4.组织sql语句
        String sql = "select id,name,sex,borndate from actor";
        //执行给定的sql语句,该语句返回单个 ResultSet对象
        ResultSet resultSet = statement.executeQuery(sql);

 while (resultSet.next()){ //会让光标向后移动,如果没有更多行,则会返回false
            int id =  resultSet.getInt(1);//获取该行第一列数据
            String name = resultSet.getString(2); //获取该行第二列数据
            String sex = resultSet.getString(3);//获取该行第三列数据
            Date date = resultSet.getDate(4);
            System.out.println(id+"\t"+name+"\t"+sex+"\t"+date);

        }

返回结果为:

3.关闭资源

在JDBC编码过程中,我们创建了resultSet,statement,connection等资源,这些资源在使用完毕后一定要进行关闭资源,关闭的过程中遵循从里到外的原则,因为在增删改查中的操作中都要用到这样的关闭操作

         resultSet.close();
        statement.close();
        connection.close();

下面附上关于select查询语句的完整代码:                                                                                                                                                

import java.io.FileInputStream;
import java.sql.*;
import java.util.Properties;

@SuppressWarnings({"all"})
public class ResultSet_ {
    public static void main(String[] args) throws Exception {
        //通过Properties对象获取相关配置文件的信息
        Properties properties = new Properties();
        properties.load( new FileInputStream("src//mysql.Properties"));
        //获取相关的值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String driver = properties.getProperty("driver");
        String url = properties.getProperty("url");

        //1.注册驱动
       // Class.forName(driver);
        //2.得到连接
        Connection connection = DriverManager.getConnection(url, user, password);
        //3.得到Statement
        Statement statement = connection.createStatement();
        //4.组织sql语句
        String sql = "select id,name,sex,borndate from actor";
        //执行给定的sql语句,该语句返回单个 ResultSet对象
        ResultSet resultSet = statement.executeQuery(sql);

        //5.使用while取出数据
        /*
            mysql> select * from actor;
            +----+-----------+-----+---------------------+-------+
            | id | name      | sex     | borndate            | phone |
            +----+-----------+-----+---------------------+-------+
            |  1 | 周星驰     | 男      | 1970-11-11 00:00:00 | 110   |
            |  3 | 刘德华     | 男      | 1970-12-12 00:00:00 | 110   |
            |  4 | 吴孟达     | 男      | 1969-01-01 00:00:00 | 1231  |
            +----+-----------+-----+---------------------+-------+

         */
        while (resultSet.next()){ //会让光标向后移动,如果没有更多行,则会返回false
            int id =  resultSet.getInt(1);//获取该行第一列数据
            String name = resultSet.getString(2); //获取该行第二列数据
            String sex = resultSet.getString(3);//获取该行第三列数据
            Date date = resultSet.getDate(4);
            System.out.println(id+"\t"+name+"\t"+sex+"\t"+date);

        }

        //6.关闭资源
        resultSet.close();
        statement.close();
        connection.close();

    }
}

JDBC编程的内容就这些了,如果你已经全部掌握,还有事务,获取自增,连接池等等内容可以自行了解一下 

原网站

版权声明
本文为[想要进大厂]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_52405010/article/details/124645584