JDBC+事务

简介

Java Data Base Connectivity(Java数据库连接),Java编程语言和广泛的数据库之间独立于数据库的连接标准的Java API,
JDBC是一种规范,它提供的接口,一套完整的,允许便捷式访问底层数据库。
就是JAVA与数据库的连接的桥梁或者插件,用JAVA代码就能操作数据库的增删改查、存储过程、事务等。

JDBC中一些接口

  1. 驱动管理: DriverManager 
  2. 连接接口 Connection、DatabasemetaData 
  3. 语句对象接口 Statement 、PreparedStatement 、CallableStatement
  4. 结果集接口 ResultSet 、ResultSetMetaData

JDBC访问数据库的过程

  • 加载驱动,建立连接 
  • 创建语句对象
  • 执行SQL语句
  • 处理结果集
  • 关闭连接

Driver接口及驱动类加载

要使用JDBC接口,需要先将对应数据库的实现部分(驱动)加载进来。 
驱动类加载方式(Oracle)
装载驱动类,驱动类通过static块实现在DriverManager中的“自动注册”
Class.forName("oracle.jdbc.driver.OracleDriver");

Connection接口

Connection接口负责应用程序对数据库的连接,在加载驱动之后,使用url、username、password三个参数,创建到具体数据库的连接。Class.forName("oracle.jdbc.OracleDriver")。
根据url连接参数,找到与之匹配的Driver对象,调用其方法获取连接
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.26:1521:tarena","name","123456");

Statement接口

Statement接口用来处理发送到数据库的SQL语句对象,通过Connection对象创建。常用三个方法:
 

Statement stmt=conn.createStatement();
//1.execute方法,如果执行的sql是查询语句且有结果集则返回true,如果是非查询语句或者没有结果集,返回false
boolean flag = stmt.execute(sql);
//2.执行查询语句,返回结果集
ResultSetrs = stmt.executeQuery(sql);
//3.执行DML语句,返回影响的记录数
int flag = stmt.executeUpdate(sql);

ResultSet接口

//执行查询SQL语句后返回的结果集,由ResultSet接口接收。常用处理方式:遍历 / 判断是否有结果(登录)。
String sql = "select * from emp";
ResultSetrs = stmt.executeQuery(sql);
while (rs.next()) {
    System.out.println(rs.getInt("empno")+",“
       +rs.getString("ename") );
}

查询的结果存放在ResultSet对象的一系列行中,指针的最初位置在行首,使用next()方法用来在行间移动,getXXX()方法用来取得字段的内容。

处理结果集ResultSet

ResultSet代表DQL查询结果,其内部维护了一个读取数据的游标,默认情况在,游标在第一行数据之前, 当调用next() 方法时候, 游标会向下移动,并将返回结果集中是否包含数据, 如果包含数据就返回true。结果集还提供了很好getXXX方法用于获取结果集游标指向当前行数据。

public static void main(String[] args) throws Exception{
        //注册驱动
        String driver="oracle.jdbc.OracleDriver";
        Class.forName(driver);
        //连接数据库
        String url="jdbc:oracle:thin:@196.168.201.227:2221:orcl";
        String user="name";
        String pwd="123456";
        Connection conn=DriverManager.getConnection(url, user, pwd);
        //创建Statement
        Statement st=conn.createStatement();
        //执行SQL
        String sql="select id, name from user_";
        ResultSet rs=st.executeQuery(sql);
        //处理结果
        //rs结果集中包含一个游标,游标默认在结果集的第一行之前
        //rs.next():移动结果集游标到下一行,检查是否有数据, 如果有返回true, 否则false
        while(rs.next()){
            //getXXX(列名): 返回结果集当前行中
            // 指定列名的数据.
            int id = rs.getInt("id");
            String name=rs.getString("name");
            //输出查询结果
            System.out.println(id+","+name);
        }
        //关闭连接
        conn.close();
    }
}

事务

特性

  1. 原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效
  2. 一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态
  3. 隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见
  4. 持久性:表示已提交的数据在事务执行失败时,数据的状态都应该正确

总结:要么全部执行成功,要么撤销不执行。

Java事务的类型

1.JDBC事务 

JDBC 事务

Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。java.sql.Connection 提供了以下控制事务的方法
setAutoCommit(boolean):设置是否为自动提交事务,如果true(默认值为true)表示自动提交,
也就是每条执行的SQL语句都是一个单独的事务,如果设置为false,需要手动提交事务
commit():提交结束事务
rollback():回滚结束事务

2.JTA(Java Transaction API)事务

JTA(Java Transaction API)提供了跨数据库连接(或其他JTA资源)的事务管理能力。
JTA事务管理则由JTA容器实现,J2ee框架中事务管理器与应用程序,资源管理器,以及应用服务器之间的事务通讯。

JTA的构成

1、高层应用事务界定接口,供事务客户界定事务边界的
2、X/Open XA协议(资源之间的一种标准化的接口)的标准Java映射,它可以使事务性的资源管理器参与由外部事务管理器控制的事务中
3、高层事务管理器接口,允许应用程序服务器为其管理的应用程序界定事务的边界
4JTA的主要接口位于javax.transaction包中
5、UserTransaction接口:让应用程序得以控制事务的开始、挂起、提交、回滚等。由Java客户端程序或EJB调用。
6、TransactionManager 接口:用于应用服务器管理事务状态
7、Transaction接口:用于执行相关事务操作
8、XAResource接口:用于在分布式事务环境下,协调事务管理器和资源管理器的工作
9、Xid接口:为事务标识符的Java映射

JTA编程的步骤

  1. 首先配置JTA ,建立相应的数据源
  2. 建立事务:通过创建UserTransaction类的实例来开始一个事务。代码如下:
       Context ctx = new InitialContext(p) 
       UserTransaction trans = (UserTransaction) ctx.lookup("javax. Transaction.UserTransaction")
  3. 开始事务:代码为 trans.begin() 
  4. 找出数据源:从Weblogic Server上找到数据源,代码: DataSource ds = (DataSource) ctx.lookup(“mysqldb") 
  5. 建立数据库连接:Connection mycon = ds.getConnection() 
  6. 执行SQL操作:stmt.executeUpdate(sqlS)
  7. 完成事务:trans.commit(); / trans.rollback()
  8. 关闭连接:mycon.close() 

Spring容器事务

Spring并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的职责委托给持久化机制所提供的相关平台框架的事务来实现。Spring事务管理器的接口是org.springframework.transaction.PlatformTransactionManager,通过这个接口,Spring为各个平台如JDBC等都提供了对应的事务管理器。

Public interface PlatformTransactionManager{  
       // 由TransactionDefinition得到TransactionStatus对象
       TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
    // 提交
       Void commit(TransactionStatus status) throws TransactionException;  
       // 回滚
       Void rollback(TransactionStatus status) throws TransactionException;  
}

1、Spring JDBC事务

如果应用程序中直接使用JDBC来进行持久化,DataSourceTransactionManager会为你处理事务边界。为了使用 DataSourceTransactionManager,你需要使用如下的XML将其装配到应用程序的上下文定义中。

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
     <property name="dataSource" ref="dataSource" />
</bean>

DataSourceTransactionManager是通过调用java.sql.Connection来管理事务。通过调用连接的commit()方法来提交事务,事务失败则通过调用rollback()方法进行回滚。

2、Java持久化API事务(JPA)

Spring的JpaTransactionManager来处理事务。你需要在Spring中这样配置JpaTransactionManager

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
     <property name="sessionFactory" ref="sessionFactory" />
</bean>

JpaTransactionManager只需要装配一个JPA实体管理工厂(javax.persistence.EntityManagerFactory接口的任意实现)。
JpaTransactionManager将与由工厂所产生的JPAJpaTransactionManager将与由工厂所产生的JPA EntityManager合作来构建事务。

猜你喜欢

转载自blog.csdn.net/weixin_42679286/article/details/87792030
今日推荐