事务在java中表示为执行数据库操作过程中更新数据库中各种数据项的一个程序执行单元(unit),事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。
注:数据项是数据的不可分割的最小单位,如“name”、“id”、“age”
通常在
由事务开始(begin transaction)
操作1:
操作2:
.
.
…
事务结束(end transaction)
之间执行的全体操作组成。
1、事务的ACID原则
(1)原子性 :事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行。(比如一个事务操作“A”)
(2)一致性:事务在完成时必须是所有的数据都保持一致状态,(个人感觉像化学中的质量守恒)
(3)隔离性:一个事务的执行不能被其他事务影响
()持久性:一个事务一旦提交,事物的操作便永久性的保存在DB中。即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。(一个事务对于数据库的操作结果是永久的,不是临时的)
2、java中的事务有三类JDBC事务、容器事务、JTA(JAVA Transaction APT)事务
JDBC事务
在JDBC中处理事务,都是通过Connection完成的。同一事务中所有的操作,都在使用同一个Connection对象。JDBC事务默认是开启的,并且是默认提交。
例:
事务开启:
conn = DriverManager.getConnection(url, user, password)
/设置是否为自动提交事务,如果true(默认值为true)表示自动提交,也就是每条执行的SQL语句都是一个单独的事务,如果设置为false,需要手动提交事务。/
conn.setAutoCommit(false);
操作1:Statement stmt = conn.createStatement();
操作2:stmt.executeUpdate(sql);
.
…
事务提交:
conn.commit();
conn.setAutoCommit(true); //自动提交
如果失败则回滚
coon.rollback():回滚结束事务。事务失败通过调用rollback()方法进行回滚。
最后释放数据库连接
freeConnection();
文章内容来自:
https://blog.csdn.net/weixin_37934748/article/details/82774230
(二)JAVA连接SQL相关知识
(1)连接数据库bai步骤:
a. 用java程序与db建立一个连接(通道)
b。根据连接获取一个执行sql语句的对象
c。执行sql语句
d。关闭连接
public static void main(String[] args) {
try {
// 1加载驱动类
// forName() 返回与带有给定字符串名的类或接口相关联的 Class 对象
Class.forName(“org.gjt.mm.mysql.Driver”);
// a.建立连接通道
// DriverManager 管理一组 JDBC 驱动程序的基本服务。java.sql
// getConnection() 返回: 到 URL 的连接
String url = “jdbc:mysql://127.0.0.1:3306/a11”;
String user = “root”;
String password = “root”;
Connection conn = DriverManager.getConnection(url, user, password);
// b。获取一个执行sql语句的对象
// Statement 用于执行静态 SQL 语句并返回它所生成结果的对象。
// createStatement()创建一个 Statement 对象来将 SQL 语句发送到数据库。
Statement st;
st = conn.createStatement();
// c.执行sql语句
// 执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或不返回内容
st.executeUpdate(“insert into student(stuname,stuage,stusex,stubirth) values(‘张三’,10,‘m’,‘1988-08-09’)”);
// d.关闭连接
// 立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们被自动释放
conn.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(“加载驱动类失败!”);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//或者关闭写在finally
createStatement()创建一个 Statement 对象来将 SQL 语句发送到数据库。
(2)CreateStatement 和 PrepareStatement
创建了一个对象然后去通过对象调用executeQuery方法来执行sql语句。
PrepareStatement接口是Statement接口的子接口,他继承了Statement接口的所有功能。它主要是拿来解决我们使用Statement对象多次执行同一个SQL语句的效率问题的。ParperStatement接口的机制是在数据库支持预编译的情况下预先将SQL语句编译,当多次执行这条SQL语句时,可以直接执行编译好的SQL语句,这样就大大提高了程序的灵活性和执行效率。此外比Statement安全!
示例1:使用createStatement()
String sql = “select * from users where username= '”+username+"’ and userpwd=’"+userpwd+"’";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
示例2:使用PrepareStatement()
String sql = “select * from users where username=? and userpwd=?”;
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, userpwd);
rs = pstmt.executeQuery();
(3)
DatabaseMetaData和ResultSetMetaData就是两个常用的获取数据库元数据相关信息的接口
java执行SQL语句后的输出结果可以保存在ResultSet 中
ResultSet 结果内容展示: