JDBC
1、什么是JDBC
JDBC (JAVA Database Connectivity):java数据库链接,是一种执行SQL语句的API。
各个数据库公司来维护自己的数据库驱动。
2、固定步骤
可以使用properties读取参数:
1 | driver=com.mysql.cj.jdbc.Driver |
一般步骤例子:
1 | //1.加载驱动 |
- 加载驱动:利用类加载导入驱动
- 用户信息:链接字符串,用户名,密码三个。
- 连接数据库,返回数据库对象:connection
- 执行sql对象:
- 执行SQL的对象去执行SQL,可能存在结果,查看返回结果
- 释放连接
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
增删改:
1 | int num=statement.executeUpdate(del); |
executeUpdate()返回受影响行数,根据行数判断执行情况。
查询:
1 | 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语句,实现无账号登入,甚至篡改数据库。
例子:
1 | select * from userInfo where pwd == "123213" or 1 == 1 |
6.2、常见解决方法
7、PreparedStatement
PreparedStatement是什么?
预编译的Statement,
PreparedStatement占位符:?
1 | String insert="insert into jdbcstudy.users(id, NAME, PASSWORD, email, birthday) VALUES (?,?,?,?,?);"; |
作用:通过占位符,传入参数的形式,防止sql注入。
8、事务
事务可以是一条sql语句或是一组sql语句,并且具有ACID的特性。简言之,事务要么一起成功,要不就一起失败。
ACID:
- 原子性(atomicity)
- 一致性(consistency)
- 隔离性(isolation)
- 持久性(durability)
事务方法:
1 | //开启事物 |
例子:
付款与发货。假设有这样俩条sql语句:1、付款。2、发货
情景1:当付款在发货语句前时,付款语句成功,发货语句失败,用户扣钱,但是购买失败了。
情景2:当发货在付款语句前时,已经发货,但是用户仍未付款。
当这俩条语句做为一个事务时,它们将会共患难。