JDBC

JDBC

1、什么是JDBC

JDBC (JAVA Database Connectivity):java数据库链接,是一种执行SQL语句的API。
各个数据库公司来维护自己的数据库驱动。
JDBC

2、固定步骤

可以使用properties读取参数:

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcstudy?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=true
useName=root
password=123456

一般步骤例子:

//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.用户信息
String url="jdbc:mysql://localhost:3306/jdbcstudy?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=true";
String useName="root";
String usePassword="123456789jxy";
//3.连接数据库,返回数据库对象
Connection connection = DriverManager.getConnection(url,useName,usePassword);
//4.执行sql对象Statement
Statement statement = connection.createStatement();
//5.执行SQL的对象去执行SQL,可能存在结果,查看返回结果
String select="select * from users";
ResultSet resultSet= statement.executeQuery(select);
while ( resultSet.next()){
    System.out.println("id="+resultSet.getObject("id"));
    System.out.println("NAME="+resultSet.getObject("NAME"));
    System.out.println("email="+resultSet.getObject("email"));
    System.out.println("birthday="+resultSet.getObject("birthday"));
}
//6.释放连接
resultSet.close();//多余
statement.close();
connection.close();
  1. 加载驱动:利用类加载导入驱动
  2. 用户信息:链接字符串,用户名,密码三个。
  3. 连接数据库,返回数据库对象:connection
  4. 执行sql对象:
  5. 执行SQL的对象去执行SQL,可能存在结果,查看返回结果
  6. 释放连接

3、类型映射

在java程序向数据库写入、读取数据时,sql数据类型相对应的java数据类型如下表所示:

SQL类型 Java类型
CHAR java.lang.String
VARCHAR java.lang.String
LONGVARCHAR java.lang.String
NUMERIC java.math.BigDecimal
DECIMAL java.math.BigDecimal
BIT boolean
TINYINT byte
SMALLINT short
INTEGER int
BIGINT long
REAL float
FLOAT double
DOUBLE double
BINARY byte[]
VARBINARY byte[]
LONGVARBINARY byte[]
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
BLOB java.sql.Blob
CLOB java.sql.Clob
Array java.sql.Array
REF java.sql.Ref
Struct java.sql.Struct

4、crud

增删改

int num=statement.executeUpdate(del);

executeUpdate()返回受影响行数,根据行数判断执行情况。

查询:

ResultSet resultSet= statement.executeQuery(select);

executeQuery()返回结果集ResultSet对象。

5、ResultSet

ResultSet是statement执行查询是返回的结果集,即包含了查询结果的集合。

5.1、行与光标

光标:当前数据行的位置,由ResultSet维护。
每调用一次next()方法,光标向下移动一行。

5.2、列

getXXX()系列方法提供获取当前行中某列值的途径。在每一行中,可按照任何次序取值。但是为了保证可移植性,应从左至右取值,并一次性读取列值。

5.3、数据类型和转换

对getXXX()系列方法,JDBC驱动程序试图将基本数据类型转换成指定Java类型

5.4、用流取大值

在数据库中可能存在LONGVARBINARY、LONGVARCHAR类型数据。方法getBytes()和getString()可以很好的取值。

5.5、空值NULL

要确定给定结果值是否是JDBC NULL,必须先读取该列,然后使用ResultSet.wasNull,方法检查该次读取是否返回JDBC NULL。

5.6、自关闭

ResultSet不需要用户关闭,Statement可以很好的管理ResultSet。

6、SQL注入

6.1、什么是sql注入

通过SQL语句,实现无账号登入,甚至篡改数据库。

例子:

select * from userInfo where pwd == "123213" or 1 == 1

6.2、常见解决方法

7、PreparedStatement

PreparedStatement是什么?

​ 预编译的Statement,

PreparedStatement占位符:?

String insert="insert into jdbcstudy.users(id, NAME, PASSWORD, email, birthday) VALUES (?,?,?,?,?);";
PreparedStatement prepareStatement = connection.prepareStatement(insert);
//加入参数
prepareStatement.setInt(1,6);
prepareStatement.setString(2,"久曌");
prepareStatement.setString(3,"");
prepareStatement.setString(4,"XXXXXX@qq.com");
prepareStatement.setDate(5,new Date(new java.util.Date().getTime()));

作用:通过占位符,传入参数的形式,防止sql注入。

8、事务

事务可以是一条sql语句或是一组sql语句,并且具有ACID的特性。简言之,事务要么一起成功,要不就一起失败。

ACID:

  • 原子性(atomicity)
  • 一致性(consistency)
  • 隔离性(isolation)
  • 持久性(durability)

事务方法:

//开启事物
connection.setAutoCommit(false);
//提交事物
connection.commit();
//回滚事物
connection.rollback();

例子:

付款与发货。假设有这样俩条sql语句:1、付款。2、发货

情景1:当付款在发货语句前时,付款语句成功,发货语句失败,用户扣钱,但是购买失败了。

情景2:当发货在付款语句前时,已经发货,但是用户仍未付款。

当这俩条语句做为一个事务时,它们将会共患难。

ection.commit();
//回滚事物
connection.rollback();


例子:

付款与发货。假设有这样俩条sql语句:1、付款。2、发货

情景1:当付款在发货语句前时,付款语句成功,发货语句失败,用户扣钱,但是购买失败了。

情景2:当发货在付款语句前时,已经发货,但是用户仍未付款。

当这俩条语句做为一个事务时,它们将会共患难。

上一篇:JDBC简单回顾


下一篇:JDBC 释放资源细节问题