JDBC
1、什么是JDBC
JDBC (JAVA Database Connectivity):java数据库链接,是一种执行SQL语句的API。
各个数据库公司来维护自己的数据库驱动。
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();
- 加载驱动:利用类加载导入驱动
- 用户信息:链接字符串,用户名,密码三个。
- 连接数据库,返回数据库对象: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
增删改:
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:当发货在付款语句前时,已经发货,但是用户仍未付款。
当这俩条语句做为一个事务时,它们将会共患难。