数据库技术-JDBC中的PreparedStatement和Transaction
PreparedStatement
首先介绍PreparedStatement: 1、PreparedStatement是一种Statement 2、比父接口提供了更多可以让我们用的方式. prepstmt = conn.prepareStatement("INSERT INTO animal VALUES( , , )"); prepstmt.setInt(1, 1);
prepstmt.setString(2, "pig");
prepstmt.setInt(3, 10);
prepstmt.execute();
三个? 表示三个占位符,设定三个位置的值。 1表示第一个问号的值,2表示第二个问号的值,3表示第三个问号的值。
可以这样理解: 我首先准备好一条sql语句,这条语句中有三个值等待确定,接下来依次确定三个值的类型和值。
package myjdbc;
import java.sql.*;
public class PreparedJdbc {
private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3308/zoo";
private static String user = "root";
private static String password = "123";
private static Connection conn = null;
private static PreparedStatement prepstmt = null;
private static ResultSet rs = null;
public static void main(String[] args) {
try {
Class.forName(driver);
//
conn = DriverManager.getConnection(url,user,password);
prepstmt = conn
.prepareStatement("INSERT INTO animal VALUES( , , )");
prepstmt.setInt(1, 1);
prepstmt.setString(2, "pig");
prepstmt.setInt(3, 10);
prepstmt.execute();
System.out.println("finish!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) {
rs.close();
}
if (prepstmt != null) {
prepstmt.close();
}
if (conn != null) {
conn.close();
}
} catch (Exception e2) {
// TODO: handle exception
}
}
}
}
MySQL:
Transaction
先举个简单的例子,A账户转账到B账户,一般需要两条sql语句,一条update A账户上的钱,一条update B账户的钱。这两天update语句必须同时执行成功,或者同时不执行成功,不予许出现中间情况,一条成功一条不成功。
这两条语句就构成了transaction。
conn.setAutoCommit(false);//首先设置自动提交false
stmt = conn.createStatement();
stmt.addBatch("insert into animal values (51, '500', 3)");
stmt.addBatch("insert into animal values (52, '500', 4)");
stmt.addBatch("insert into animal values (53, '500', 5)");
stmt.executeBatch();//三条语句批处理
conn.commit();
conn.setAutoCommit(true);//还原默认自动提交true
设置回滚
catch (SQLException e) {
e.printStackTrace();
try {
if (conn != null) {
conn.rollback();
conn.setAutoCommit(true);
}
}
下面代码:
package myjdbc;
import java.sql.*;
public class TestTransaction {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3308/zoo", "root", "123");
conn.setAutoCommit(false);
stmt = conn.createStatement();
stmt.addBatch("insert into animal values (51, '500', 3)");
stmt.addBatch("insert into animal values (52, '500', 4)");
stmt.addBatch("insert into animal values (53, '500', 5)");
stmt.executeBatch();
conn.commit();
conn.setAutoCommit(true);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
try {
if (conn != null) {
conn.rollback();
conn.setAutoCommit(true);
}
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
try {
if (stmt != null)