该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
package com.venilry.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/*
* statement,存在SQL注入危险
*/
/*
* 【Statement接口】
* 用于执行静态SQL语句并返回它所生成结果的对象。
* 【三种Statement类】
* 1、Statement:由createStatement创建,用于发送简单的SQL语句。(不带参数的)
* 2、PreparedStatement(预编译):继承自Statement接口,由prepareStatement创建,
* 用于发送含有一个或多个输入参数的Sql语句。PreparedStatement对象比Statement
* 对象的效率更高,并且可以防止SQL注入。我们一般都用PreparedStatement。
* 3、CallableStatement:继承自PreparedStatement。由方法prePareCall创建,用于调用存储过程。
* 【常用的Statement方法】
* 1、execute():运行语句,返回是否有结果集。
* 2、executeQuery():运行select语句,返回ResultSet结果集。
* 3、executeUpdate():运行insert/update/delete操作,返回更新的行数。
* 【JDBC详细操作】
* 1、灵活指定SQL语句中的变量
* PreparedStatement
* 2、对存储过程进行调用
* CallableStatement
* 3、运用事务处理
* Transaction
* 4、批处理
* Batch:对于大量的批处理,建议使用Statement,因为PreparedStatement的预编译空
* 间有限,当数据量特别大时,会发生异常。
*/
/*
【事务】
一个connection对应一个事务,一个connection可以有多个statement,一个statement对一个sql的一次execute对应一个结果集resultset,如果继续用该statement对另一个sql进行execute则会自动对上一个resultset进行close。
所以如果想同时获得每个不同sql的结果集,要使用多个statement对象。
JDBC的connection的事务是默认自动开启的,可以手动开启,届时需要通过connection的commit来手动提交事务。
----------------------------------
java的事务控制是基于mysql的事务控制的。
当mysql开启事务时:
当sql语句都顺利执行时,手动提交会使得事务执行,手动回滚会使得事务不执行。
当有sql语句执行出错时,是否需要手动回滚呢?手动提交的结果是会顺利执行还是失败呢?
答:当执行到有问题的sql语句时,会自动抛出错误,最终该事务手动提交的结果是正确的语句仍然正确执行,错误的语句不会执行。而手动回滚则全都不执行。
*/
public class Test010 {
public static void main(String[] args) throws Exception {
// 加载数据库驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
// 获得Connection对象
// 建立连接(连接对象内部包含了Socket对象,是一个远程的连接。比较耗时,这是Connection对象管理的一个要点
// 真正开发中,为了提高效率,都会使用连接池来管理连接对象。
Connection connection = DriverManager
.getConnection("jdbc:mysql://localhost:3306/db01?serverTimezone=Asia/Shanghai", "root", "root");
// sql语句
String sql = "select * from user where id=1";
// 获得statement
Statement statement = connection.createStatement();
// Statement.execute()
boolean execute = statement.execute(sql);
System.out.println(execute);
// Statement.executeQuery()
ResultSet resultSet = statement.executeQuery(sql);
// 操作结果集:getXxx()方法的参数可以是String对象,即表中字段名,或者int类型,即表中字段顺序
while (resultSet.next()) {
Object name = resultSet.getObject("name");
System.out.println(name.toString());
}
// 关闭资源(遵循从resultset→statement→connection这样的关闭顺序,一定要将三个try-catch分开写)
resultSet.close();
statement.close();
connection.close();
}
}