äºå¡å¤çæ¯å¨é对æ°æ®åºæä½æ¶ä¸ä¸ªéè¦ç¯èï¼å®å¯ä»¥ä¿è¯æ§è¡å¤æ¡è®°å½çä¸è´æ§ï¼å®ç°æ°æ®åºä¸è¡¨ä¸è¡¨ä¹é´çå
³èï¼åæ¶æé«äºå¯¹æ°æ®æä½çåç¡®æ§ãå®å
¨æ§ãæ¬æ主è¦ä¸èµ·æ¥å¦ä¹ å¨Javaç¨åºä¸å¦ä½ä½¿ç¨JDBCæ¥å®ç°æ°æ®é´çäºå¡å¤çã
ä¸ãä»ä¹æ¯äºå¡å¤ç
äºå¡å¤çå°±æ¯å½æ§è¡å¤ä¸ªSQLæ令æ¶ï¼å¦æå 为æ个åå 使å
¶ä¸ä¸æ¡æ令æ§è¡æé误ï¼ååæ¶å
åæ§è¡è¿çæææ令ãå®çä½ç¨æ¯ä¿è¯å项æä½çä¸è´æ§åå®æ´æ§ã
äºãJDBCä¸çäºå¡æ§å¶
JDBC APIä¸çJDBCäºå¡æ¯éè¿Connection对象è¿è¡æ§å¶çãConnection对象æä¾äºä¸¤ç§äºå¡æ¨¡å¼ï¼èªå¨æ交模å¼åæå·¥æ交模å¼ãç³»ç»é»è®¤ä¸ºèªå¨æ交模å¼ï¼å³ï¼å¯¹æ°æ®åºè¿è¡æä½çæ¯ä¸æ¡è®°å½ï¼é½è¢«çä½æ¯ä¸é¡¹äºå¡ãæä½æååï¼ç³»ç»ä¼èªå¨æ交ï¼å¦åèªå¨åæ¶äºå¡ã å¦ææ³å¯¹å¤ä¸ªSQLè¿è¡ç»ä¸çäºå¡å¤çï¼å°±å¿
é¡»å
åæ¶èªå¨æ交模å¼ï¼éè¿ä½¿ç¨Connection çsetAutoCommit(false) æ¹æ³æ¥åæ¶èªå¨æ交äºå¡ãConnectionç±»ä¸è¿æä¾äºå¦ä¸å
¶ä»æ§å¶äºå¡çæ¹æ³ï¼
1ï¼public boolean getAutoCommit()ï¼å¤æå½åäºå¡æ¨¡å¼æ¯å¦ä¸ºèªå¨æ交ï¼å¦ææ¯åè¿åtureï¼å¦åè¿åfalseï¼
2ï¼public void commit()ï¼æ交äºå¡ï¼
3ï¼public void rollback()ï¼åæ»äºå¡ï¼
注æï¼
Javaä¸ä½¿ç¨JDBCäºå¡å¤çï¼ä¸ä¸ªJDBCä¸è½è·¨è¶å¤ä¸ªæ°æ®åºèä¸éè¦å¤æå½å使ç¨çæ°æ®åºæ¯å¦æ¯æäºå¡ãè¿æ¶å¯ä»¥ä½¿ç¨ DatabaseMedaData çsupportTranslations() æ¹æ³è¿è¡æ£æ¥æ°æ®åºæ¯å¦æ¯æäºå¡å¤çï¼è¥è¿å true å说ææ¯æäºå¡å¤çï¼å¦åè¿å false ãå¦ä½¿ç¨MySQL çäºå¡åè½ï¼å°±è¦æ±MySQLéç表çç±»å为Innodbææ¯æäºå¡æ§å¶å¤çï¼å¦åï¼å¨Javaç¨åºä¸åäº commit æ rollback ï¼ä½æ°æ®åºä¸æ¯ä¸çæçã
ä¸ãJDBC äºå¡å¤çåºæ¬æµç¨
å®ç°äºå¡å¤ççåºæ¬æµç¨å¦ä¸ï¼
1ï¼å¤æå½å使ç¨çJDBC驱å¨ç¨åºåæ°æ®åºæ¯å¦æ¯æäºå¡å¤çï¼
2ï¼å¨æ¯æäºå¡å¤ççåæä¸ï¼åæ¶ç³»ç»èªå¨æ交模å¼ï¼
3ï¼æ·»å éè¦è¿è¡çäºå¡ä¿¡æ¯ï¼
4ï¼å°äºå¡å¤çæ交å°æ°æ®åºï¼
5ï¼å¨å¤çäºå¡æ¶ï¼è¥ææ¡ä¿¡æ¯åçé误ï¼åæ§è¡äºå¡åæ»æä½ï¼å¹¶åæ»å°äºå¡æ交åçç¶æã
åãäºå¡å¤ççå®ä¾
å©ç¨JDBCå®ç°äºå¡å¤ççå®ä¾ï¼å°4æ¡SQLè¯å¥å å¨åä¸ä¸ªäºå¡éï¼å½å
¶ä¸ä¸æ¡è¯å¥åçé误æ¶ï¼åæ§è¡äºå¡åæ»ï¼åæ¶ææçæä½ãæ以å¨æåçè¿è¡ç»æä¸ï¼å¹¶æ²¡æåç°ææ°æ®æ´æ°ã
1ãå
·ä½ç代ç å¦ä¸ï¼
[java] view plaincopy
package chp07;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Java_Transa {
// æ°æ®åºè¿æ¥
public static Connection getConnection() {
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver"); // å è½½Mysqlæ°æ®é©±å¨
con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/myuser", "root", "root"); // å建æ°æ®è¿æ¥
} catch (Exception e) {
System.out.println("æ°æ®åºè¿æ¥å¤±è´¥");
}
return con;
}
// å¤ææ°æ®åºæ¯å¦æ¯æäºå¡
public static boolean JudgeTransaction(Connection con) {
try {
// è·åæ°æ®åºçå
æ°æ®
DatabaseMetaData md = con.getMetaData();
// è·åäºå¡å¤çæ¯ææ
åµ
return md.supportsTransactions();
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
// å°ä¸ç»SQLè¯å¥æ¾å¨ä¸ä¸ªäºå¡éæ§è¡ï¼è¦ä¹å
¨é¨æ§è¡éè¿ï¼è¦ä¹å
¨é¨ä¸æ§è¡
public static void StartTransaction(Connection con, String[] sqls) throws Exception {
if (sqls == null) {
return;
}
Statement sm = null;
try {
// äºå¡å¼å§
System.out.println("äºå¡å¤çå¼å§ï¼");
con.setAutoCommit(false); // 设置è¿æ¥ä¸èªå¨æ交ï¼å³ç¨è¯¥è¿æ¥è¿è¡çæä½é½ä¸æ´æ°å°æ°æ®åº
sm = con.createStatement(); // å建Statement对象
//ä¾æ¬¡æ§è¡ä¼ å
¥çSQLè¯å¥
for (int i = 0; i < sqls.length; i++) {
sm.execute(sqls[i]);// æ§è¡æ·»å äºç©çè¯å¥
}
System.out.println("æ交äºå¡å¤çï¼");
con.commit(); // æ交ç»æ°æ®åºå¤ç
System.out.println("äºå¡å¤çç»æï¼");
// äºå¡ç»æ
//æè·æ§è¡SQLè¯å¥ç»ä¸çå¼å¸¸
} catch (SQLException e) {
try {
System.out.println("äºå¡æ§è¡å¤±è´¥ï¼è¿è¡åæ»ï¼\n");
con.rollback(); // è¥åé¢ææ¡è¯å¥åºç°å¼å¸¸æ¶ï¼è¿è¡åæ»ï¼åæ¶åé¢æ§è¡çæææä½
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
sm.close();
}
}
// æ¥è¯¢è¡¨ staff
public static void query_student() throws Exception {
Connection conect = getConnection(); // è·åè¿æ¥
System.out.println("æ§è¡äºç©å¤çåï¼è¡¨ staff çå
¨é¨è®°å½ä¸ºï¼\n");
try {
String sql = "select * from staff"; // æ¥è¯¢æ°æ®çsqlè¯å¥
Statement st = (Statement) conect.createStatement(); // å建Statement对象
ResultSet rs = st.executeQuery(sql); // æ§è¡SQLè¯å¥å¹¶è¿åæ¥è¯¢æ°æ®çç»æé
//æå°è¾åºæ¥è¯¢ç»æ
while (rs.next()) { // å¤ææ¯å¦è¿æä¸ä¸ä¸ªæ°æ®
// æ ¹æ®å段åè·åç¸åºçå¼
String name = charset(rs.getString("name"));
int age = rs.getInt("age");
String sex = charset(rs.getString("sex"));
String depart = charset(rs.getString("depart"));
String address = charset(rs.getString("address"));
int worklen = rs.getInt("worklen");
int wage = rs.getInt("wage");
System.out.println(name + " " + age + " " + sex + " "
+ address + " " + depart + " " + worklen + " " + wage);
}
System.out.println();
} catch (SQLException e) {
System.out.println("æ¥è¯¢æ°æ®å¤±è´¥");
}
}
// å符éç设å®ï¼è§£å³ä¸æä¹±ç
public static String charset(String str) throws Exception {
String newStr = new String(str.getBytes("ISO8859-1"), "UTF-8");
return newStr;
}
public static void main(String[] args) throws Exception {
String[] arry = new String[4]; // å®ä¹ä¸ç»äºç©å¤çè¯å¥
arry[0] = "delete from staff where name='Serein'"; //å é¤staffè¡¨æ ¼ä¸ name å段å¼ä¸º "Serein" çå工记å½
arry[1] = "UPDATE staff SET address='Shenzhen' where name=lili";// æ§è¡è¿æ¡è¯å¥ä¼å¼èµ·é误ï¼å 为表 staff ä¸name='lili'ä¸åå¨
arry[2] = "INSERT INTO student (name,age,sex,address,depart,worklen,wage)" //SQLæå
¥è®°å½è¯å¥
+ "values ('Allen',19,'M','Beijing','Engine',4,4800)";
arry[3] = "select * from staff"; //SQLæ¥è¯¢è¡¨ staff è¯å¥
Connection con = null;
try {
con = getConnection(); // è·å¾æ°æ®åºè¿æ¥
boolean judge = JudgeTransaction(con); // å¤ææ¯å¦æ¯ææ¹å¤ç
System.out.print("æ¯æäºå¡å¤çåï¼ ");
System.out.println(judge ? "æ¯æ" : "ä¸æ¯æ");
if (judge) {
StartTransaction(con, arry); // å¦ææ¯æåå¼å§æ§è¡äºå¡
}
} catch (Exception e) {
e.printStackTrace();
} finally {
con.close(); // å
³éæ°æ®åºè¿æ¥
}
query_student();
}
}
说æï¼è¯¥Javaç¨åºä¸æ°æ®åºæä½æ¶åçæ°æ®åºä¸º âmyuser â ï¼å¹¶ä½¿ç¨å
¶ä¸ç âstaffâ è¡¨æ ¼ï¼ä¹å°±æ¯æä¹åçæç« ãJDBCè¿æ¥MySQLæ°æ®åºå示ä¾ãéæå建çæ°æ®åºå表ãå¦æéè¦è·çå»å®ç°å¹¶è¿è¡è¿ä¸ªä¾åçè¯ï¼å¯ä»¥åå»åèå建ï¼æè
æ ¹æ®ä½ èªå·±çæ°æ®åºæ
åµå»ä¿®æ¹å
¶ä¸æå
³è¿æ¥MySQLç代ç 以åSQLè¯å¥ã
éä¸ç¨åºè¿è¡åçâstaffâè¡¨æ ¼ä¸çæ°æ®ï¼
注æè§å¯éé¢ç第ä¸æ¡è®°å½ï¼å³ name å段å¼ä¸ºâSerenâçè®°å½ãå³å°è¿è¡ç Java ç¨åºç第113代ç ä¸ç SQL è¯å¥è¡¨ç¤ºè¦å é¤è¯¥æ¡è®°å½ï¼ä½æ¯ç±äºåé¢çäºå¡åºéï¼æ以å
¨é¨çäºå¡ä¸æ§è¡ï¼å¹¶åæ»ï¼æ以æåçç»ææ¯name为âSereinâè¿æ¡è®°å½ä¾æ§åå¨äºæ°æ®è¡¨ä¸ã
温馨提示:内容为网友见解,仅供参考
《深入理解mybatis原理四》 MyBatis事务管理机制
MyBatis的事务管理分为两种形式:JdbcTransaction 和 ManagedTransaction。它们的类图如上所示。在MyBatis的XML配置文件中,我们可以通过节点定义事务配置信息,根据子节点的type属性选择事务管理机制。MyBatis事务的创建则由TransactionFactory事务工厂完成。初始化时,会根据配置生成相应的TransactionFactory实例,进而...
Jdbc中是否支持事务,如果支持包含了哪些
事务处理就是当执行多个SQL指令时,如果因为某个原因使其中一条指令执行有错误,则取消先前执行过的所有指令。它的作用是保证各项操作的一致性和完整性。二、JDBC中的事务控制 JDBC API中的JDBC事务是通过Connection对象进行控制的。Connection对象提供了两种事务模式:自动提交模式和手工提交模式。系统默认为自...
MyBatis事务管理机制
MyBatis事务管理分为两大类别:一是基于JDBC的手动事务管理,通过java.sql.Connection进行提交(commit)、回滚(rollback)和关闭(close)操作;二是利用程序容器(如JBOSS或Weblogic)的MANAGED事务管理,MyBatis自身并不直接管理事务,而是由容器负责。在配置阶段,MyBatis XML文件中会定义数据库连接信息,...
java事务相关
一般情况下,J2EE应用服务器支持JDBC事务、JTA(JavaTransactionAPI)事务、容器管理事务。一般情况下,最好不要在程序中同时使用上述三种事务类型,比如在JTA事务中嵌套JDBC事务。第二方面,事务要在尽可能短的时间内完成,不要在不同方法中实现事务的使用。下面我们列举两种事务处理方式。1、JavaBean中使用JD...
jdbc事务详解
事务具有ACID特性,即原子性、一致性、隔离性和持久性。满足这些特性的数据库操作被视为事务。在JDBC中,通过调用`Connection`对象的`setAutoCommit(false)`方法,可开启事务模式,使得在`commit()`之前的所有操作被视为一个整体。当事务执行过程中遇到异常,开发者可以调用`rollback()`方法,将事务回滚到...
JDBC的事务,有哪位能详细解说下?麻烦告诉我
事务是针对原子操作的,要求原子操作不可再分,要求原子操作必须同时成功同时失败。事务是捆绑的原子操作的边界。JDBC中使用事务,先要使用连接调用setAutoCommite(false)方法,把自动提交(commit)置为false。打开事务就要关闭自动提交。不用事务是要把setAutoCommite(true).在处理事务时,在发送sql语句后...
mybatis基本配置详解
1、transactionManager:事务管理器; type 事务管理类型: JDBC(JdbcTransactionFactory); MANAGED(ManagedTransactionFactory) 自定义事务管理器:实现TransactionFactory接口.type指定为全类名 2、dataSource:数据源; type :数据源类型; UNPOOLED(UnpooledDataSourceFactory); POOLED...
java中DataSourceTransactionManager作用是什么
HibernateTransactionManager:是对Hibernate进行事务管理,当在spring中使用HibernateTemplate时,要使用此管理器。但是当在service的一个方法中同时使用了JdbcTemplate和HibernateTemplate时,就要使用HibernateTransactionManager了,因为当使用DataSourceTransactionManager时,JdbcTemplate和HibernateTemplate获得的connection并不...
11、什么是事务,事物的特性?
JDBC事务提供简单且易于理解的事务控制,仅适用于单个数据库连接。JTA事务则提供更强大且复杂的功能,允许事务跨越多个数据库或多个DAO,但相应的实现和管理也更为复杂。容器事务通常由J2EE应用服务器提供,主要针对EJB应用,实现方式更为简化,程序员只需指定哪些方法参与事务,容器将负责整个事务管理,这大大...
java 数据库事务与应用事务的区别
在使用JTA之前,你必须首先实现一个Xid类用来标识事务(在普通情况下这将由事务管理程序来处理)。Xid包含三个元素:formatID、gtrid(全局事务标识符)和bqual(分支修饰词标识符)。 下面的例子说明Xid的实现: import javax.transaction.xa.*; public class MyXid implements Xid { protected int formatId; protected ...