JDBC快速入门

举报
ArimaMisaki 发表于 2022/08/06 22:03:56 2022/08/06
【摘要】 JDBC快速入门 JDBC概述概念JDBC就是使用Java语言操作关系型数据库的一套API。其全称为Java DataBase Connectivity。本质Java官方Sun公司开发了JDBC这样一套操作所有关系型数据库的规则,即标准接口。各个数据库厂商去实现这套接口,即提供数据库驱动jar包。我们可以使用这套接口JDBC来编程,真正执行的代码是驱动jar包中的实现类。好处各数据库厂商使...

JDBC快速入门

JDBC概述

概念

JDBC就是使用Java语言操作关系型数据库的一套API。其全称为Java DataBase Connectivity


本质

Java官方Sun公司开发了JDBC这样一套操作所有关系型数据库的规则,即标准接口。

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

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


好处

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

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

JDBC安装


按以下几个步骤即可完成安装。

(一)点击链接MySQL :: Download Connector/J

image-20220526111326840

(二)查看版本

输入:select version();

image-20220526111802228

我的版本太新了貌似。

image-20220526112105100

下载后解压即可。

JDBC快速上手


JDBC大体可以分为以下几个步骤:

1 创建工程,导入jar包

在工程中创建一个lib文件夹,将下图指的jar包拖入lib文件夹。

image-20220526112642611

然后按下图步骤点击add as library,然后选定jar包作用的范围。

image-20220526113025869

其余步骤体现在代码中:

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 Exception{
        //1 注册驱动
        Class.forName("com.mysql.jdbc.Driver");

        //2 获取链接
        String url = "jdbc:mysql://127.0.0.1:3306/cov22";
        String username = "root";
        String password = "123456";
        Connection conn = DriverManager.getConnection(url,username,password);

        //3 定义sql
        String sql = "update acccount set money = 2000 where id = 1";

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

        //5 执行sql
        int count = stmt.executeUpdate(sql);

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

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

JDBC API详解


DriverManager

  • 驱动管理类

  • 用于注册驱动

  • 在MySQL 5版本之后的驱动包中,JDBC注册驱动可以不写,系统会自动加载

  • 调用getConnection获取链接

getConnection详解

url:jdbc:mysql://127.0.0.1(本机):端口号/数据库;如果连接的是本机mysql服务器,并且默认端口号是3306,则url可以简写为jdbc:mysql:数据库,如果想禁用安全连接还可以写成jdbc:mysql:数据库?useSSL = false

user:用户名

password:密码名


Connection

  • 数据库连接对象
  • 获取执行SQL的对象
  • 管理事务

连接对象

普通执行SQL对象

Statement createStatement()

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

PreparedStatement prepareStatement(sql)

执行存储过程的对象

CallableStatement prepareCall(sql)

事务管理

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;

public class Test {
   public static void main(String[] args) throws Exception{
       //2 获取链接
       String url = "jdbc:mysql://127.0.0.1:3306/cov22";
       String username = "root";
       String password = "943073123";
       Connection conn = DriverManager.getConnection(url,username,password);

       //3 定义sql
       String sql1 = "update acccount set money = 2000 where id = 1";
       String sql2 = "update acccount set money = 2000 where id = 2";

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

       //5 执行sql
       try {
           //开启事务
           conn.setAutoCommit(false);
           int count1 = stmt.executeUpdate(sql1);
           int count2 = stmt.executeUpdate(sql2);

           //6 处理结果
           System.out.println(count1);
           System.out.println(count2);
       } catch (Exception e) {
           //回滚事务
           conn.rollback();
           e.printStackTrace();
       }

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

Statement

  • 用于执行SQL语句

执行SQL语句

用于执行DML、DDL语句,返回值为影响的行数

int executeUpdate(sql)

用于执行DQL语句,返回值为结果集对象

ResultSet executeQuery(sql)

ResultSet

ResultSet结果集对象返回了DQL查询语句的结果,如果我们我们想要获取结果,需通过下面两个方法。

将光标从当前位置向下移动一行,并且判断当前行是否为有效行,返回值为布尔类型。

boolean next()

获取数据,返回值为对应类型,参数有两种写法,填int数字则表示选取的列编号,从1开始;填string则表示选取列的名称。

对应类型 get对应类型(参数)

一般来说,我们使用ResultSet应该使用如下写法:

  • 游标向下移动一行,并判断该行是否有数据
  • 获取数据
while(rs.next()){
	re.get对应类型(参数)
}

使用演示

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

public class Test {
    public static void main(String[] args) throws Exception{
        //2 获取链接
        String url = "jdbc:mysql://127.0.0.1:3306/cov22";
        String username = "root";
        String password = "943073123";
        Connection conn = DriverManager.getConnection(url,username,password);

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

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

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

        //6 处理结果
        while(resultSet.next()){
            int id = resultSet.getInt(1);
            String hotSelect = resultSet.getString(3);

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

        //7 释放资源
        resultSet.close();
        stmt.close();
        conn.close();
    }
}

out:

image-20220526124726582


PreparedStatement

  • 预防SQL注入问题

SQL注入

SQL注入是指通过操作输入一些特定的脚本到文本框中,从而让后台识别错误,被SQL注入者进行服务器攻击。

如:查询语句

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

public class Test {
   public static void main(String[] args) throws Exception{
       String name = "写啥都行";
       String pwd = "'or'1' = '1";

       String sql = "select * from tb_user where username = '"+name+"'and password = '"+pwd+"'";
       System.out.println(sql);
   }
}

当我们输出:

select * from tb_user where username = '写啥都行'and password = ''or'1' = '1'

这表明通过字符串拼接的SQL语句居然被人恰好利用了。where条件为真则查tb_user整张表数据,而or优先级比and低,故or最后执行,而1 = 1为真。

PreparedStatement可以解决SQL注入问题。

(一)获取PreparedStatement对象

将原先的未知变量用?来进行占位。如:

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

PrepareStatement pstmt = conn.prepareStatement(sql);

(二)设置参数

调用PreparedStatement对象的set对应类型方法。用于给?赋值。其中该方法要填上两个参数,第一个参数表示第几个?,第二个参数表示该?对应的值。

(三)执行SQL

调用int executeUpdate(sql)或ResultSet executeQuery(sql)即可。

PreparedStatement原理

好处

  • 预编译SQL,性能更高
  • 预防SQL注入,可以将敏感字符进行转义

预编译性能更高的原因是:在获取PreparedStatement对象时,将所有sql语句发送给mysql服务器进行检查,编译,这些步骤是十分耗时的,但是如果开启了预编译,那么就不用再进行这些步骤了,速度会很快,为何?因为sql的模板都是一样的,只有?处不一样,故对于sql模板只需进行一次检查、编译即可。

如果我们想开启预编译,并且想要在后台看到数据库的访问情况,可以按照如下的方式进行配置。

(一)连接url添加&useServerPrepStmts=true。

(二)前往mysql安装位置,然后打开my.ini,在文件末尾添加如下内容,添加完毕后要重启sql服务:

# 配置执行日志
log-output=FILE
general-log=1
general_log_file="C:\mysql\mysql-8.0.29-winx64\MysqlLog.log"
slow-query-log=1
slow_query_log_file = "C:\mysql\mysql-8.0.29-winx64\mysql_show.log"
long_query_time = 2

数据库连接池


概述

数据库连接池是个容器,负责分配、管理数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个,释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。

连接遗漏

当数据库连接池中的连接被用户所分配完,而新的用户需要连接却没有所需的连接可以给他,老用户则一直占用连接,这时候我们称这种情况为连接遗漏。

数据库连接池会在无可用连接时检查使用连接用户的连接情况,如果发现有些连接连上了却一直闲置,则连接池会强制关闭该用户的连接,这样,新用户就有连接可用了。

数据库连接池实现

官方提供了数据库连接池的标准接口DataSource,并由第三方组织实现此接口。其主要功能是获取连接,主要写法如下:

Connection getConnection()

常见的第三方数据库连接池有:

  • DBCP
  • C3P0
  • Druid

我们要使用的,便是由阿里巴巴开源的数据库连接池项目Druid,其功能强大,性能优秀,是Java语言最好的数据库连接池之一。

数据库连接池的使用如下:

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

public class Test {
    public static void main(String[] args) throws Exception {
        //1 导入jar包

        //2 定义配置文件

        //3 加载配置文件
        Properties prop = new Properties();
        prop.load(new FileInputStream("src/main/java/druid.properties"));
        //4 获取连接池对象
        DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);

        //5 获取数据库连接
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
    }
}

其中druid的配置文件如下:

driverClassName = com.mysql.jdbc.Driver
url = jdbc:mysql://127.0.0.1:3306/cov22?userSSL=false&useServerPrepStmts = true
username = root
password = 943073123
# 初始化链接数量
initialSize = 5
# 最大连接数
maxActive = 10
# 最大等待时间
maxWait = 3000

除了以上的配置信息外,还有一些其他的配置信息,感兴趣的可以自己上网搜索。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。