JDBC:Java DataBase Connectivity
1. 期望能用统一的一套规范来操作所有关系型数据库
2. JDBC即定义了一套操作所有关系型数据库的规则( 接口)
3. 不同的数据库厂商实现了其自己版本的JDBC接口,提供数据库驱动jar包
4. 我们使用这套接口( JDBC) 时,实际上使用的是驱动jar包中的实现类
操作步骤:
1. 导入jar包 http: / / central. maven. org/ maven2/ mysql/ mysql- connector- java/
a. 项目目录下新建libs文件夹,将jar包复制到libs内
b. IDEA中右键libs文件夹,选择add as library
2. 注册驱动
MySQL 8.0 +
Class. forName ( "com.mysql.cj.jdbc.Driver" ) ;
3. 获取数据库连接对象 Connection
在8.0 后需要设置连接属性
URL:jdbc: mysql: / / localhost: 3306 / test? characterEncoding= utf8& useSSL= false & serverTimezone= UTC& rewriteBatchedStatements= true
Connection connection = DriverManager. getConnection ( URL, "用户名" , "密码" ) ;
4. 定义sql
String sql = "update account set balance = 1000" ;
5. 获取执行sql语句的对象 Statement
Statement statement = connection. createStatement ( ) ;
6. 执行sql,接收返回结果
int count = statement. executeUpdate ( sql) ;
7. 处理结果
System. out. println ( count) ;
8. 释放资源
statement. close ( ) ;
connection. close ( ) ;
JDBC中各个对象
1. DriverManager:驱动管理对象
a. 作用
1. 注册驱动
static void registerDriver ( Driver driver) ;
在MySQL- jar 5.0 + 可以不用写注册驱动,因为jar中包含了注册驱动的配置
2. 获取数据库连接
static Connection getConnection ( String url, String user, String password) ;
url:指定连接的路径
jdbc: mysql: / / ip地址: 端口号/ 数据库名
user:用户名
password:密码
2. Connection:数据库连接对象
a. 作用
1. 获取执行sql的对象
Statement createStatement ( ) ;
PreparedStatement PreparedStatement ( String sql) ;
2. 管理事务:
1. 开启事务:
void setAutoCommit ( boolean autoCommit) ;
2. 提交事务:
void commit ( ) ;
3. 回滚:
void rollback ( ) ;
3. Statement:执行静态sql语句的对象
a. 作用
1. 执行sql方法:
boolean execute ( String sql) ;
int executeUpdate ( String sql) ; -- 返回值int 类型是影响的行数,用于判定sql成功与否
ResultSet executeQuery ( String sql) ;
ResultSet中封装了查询的结果表
4. ResultSet:结果集对象
a. 作用
1. next方法:
boolean next ( ) ;
光标从当前位置向下移动一行,一开始获取到的结果集中,光标指向的是表头
如果想要读取数据,获取到ResultSet后应首先向下移动一行,即调用next ( ) 方法
注意:
next方法返回的布尔值,指的是当前指向的一行是否有数据
true 表示有数据,false 表示现在指向表的末尾,当前行不能获取数据
2. 获取数据:
getInt ( arg) :返回int 类型的值
getString ( arg) :返回varchar类型的值
getDouble ( arg) :返回double 类型的值
getXxx ( arg) :返回对应类型的值
参数arg:
* int 类型:传入获取数据的的列标号,列标号从左至右1 开始
* String类型:传入获取数据的列的名称
3. 使用步骤:
1. 游标向下移动一行
2. 判断是否有数据
3. 获取数据
5. PreparedStatement:执行动态sql语句的对象
a. 作用:解决SQL注入问题
1. sql注入:在拼接sql时,有一些sql关键字参与字符串拼接则会造成安全性问题
例如:
String sql = "select * from user where username = '" + name+ "' and password = '" + password+ "'" ;
若name随便写,在password中写入a' or ' a' = ' a,此时拼接完成后就会产生'a' = 'a' 的永真条件
此时可以查出所有信息,造成安全性问题
2. 预编译SQL:sql语句参数使用占位符( ? ) 替代
String sql = "select * from user where username = ? and password = ?" ;
3. 使用Connection对象获取PreparedStatement对象
PreparedStatement pstmt = conn. prepareStatement ( sql) ;
4. 利用PreparedStatement对象成员方法给占位符( ? ) 赋值
pstmt. setXxx ( 参数1 , 参数2 ) ;
Xxx:代表设置的数据类型
参数1 :代表第几个占位符( ? ) ,从1 开始
参数2 :代表该占位符的值
5. 执行sql,此时执行不再需要传递参数,直接调用相应的execute成员函数
6. 数据库的增删查改都将使用PreparedStatement对象执行sql语句,保证安全性
JDBC事务管理
1. 使用Connection方法管理事务
a. 开启事务:
void setAutoCommit ( boolean autoCommit) ;
b. 提交事务:
void commit ( ) ;
c. 回滚:
void rollback ( ) ;
2. 使用步骤:
a. 在获取到连接后执行sql前开启一个事务
b. 在完成一个事务后,提交事务
c. 在catch 到异常< 此处应该是Exception,即不论发生什么异常都要回滚> 时,在catch 内进行回滚操作