ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

JDBC

2021-03-11 10:31:00  阅读:213  来源: 互联网

标签:语句 JDBC ResultSet connection 付款 发货 sql


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();
  1. 加载驱动:利用类加载导入驱动
  2. 用户信息:链接字符串,用户名,密码三个。
  3. 连接数据库,返回数据库对象:connection
  4. 执行sql对象:
  5. 执行SQL的对象去执行SQL,可能存在结果,查看返回结果
  6. 释放连接

3、类型映射

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

SQL类型Java类型
CHARjava.lang.String
VARCHARjava.lang.String
LONGVARCHARjava.lang.String
NUMERICjava.math.BigDecimal
DECIMALjava.math.BigDecimal
BITboolean
TINYINTbyte
SMALLINTshort
INTEGERint
BIGINTlong
REALfloat
FLOATdouble
DOUBLEdouble
BINARYbyte[]
VARBINARYbyte[]
LONGVARBINARYbyte[]
DATEjava.sql.Date
TIMEjava.sql.Time
TIMESTAMPjava.sql.Timestamp
BLOBjava.sql.Blob
CLOBjava.sql.Clob
Arrayjava.sql.Array
REFjava.sql.Ref
Structjava.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,ResultSet,connection,付款,发货,sql
来源: https://blog.csdn.net/jiuzhao_12138/article/details/114653865

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有