事务控制的代码实现

  • JDBC方式的事务控制
package com.lty;

import java.sql.*;

/**
 * @Description:
 * @Author: Feng.QC
 * @Date: 2020/12/16 11:33
 * @Version: 1.0
 */
public class ConnectionTransaction {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stat = null;
        PreparedStatement prep1 = null;
        PreparedStatement prep2=null;
        try {
            //注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/test";
            String username = "root";
            String password = "root";
            //开启事务
            conn.setAutoCommit(false);
            //创建数据库的连接
            conn = DriverManager.getConnection(url, username, password);
            //sql语句---实现A给B转账
            String sql1="update  account set money=money-? where id=?";
            String sql2="update account set money=money+? where id=?";
            //预处理
            prep1 = conn.prepareStatement(sql1);
            prep2 = conn.prepareStatement(sql2);
            //赋值
            prep1.setInt(1,100);
            prep1.setInt(2,1);
            prep2.setInt(1,100);
            prep2.setInt(2,2);
            prep1.executeUpdate();
            /*
            * int i=3/0;
            *
            * Exception in thread "main" java.lang.NullPointerException
	        * at com.lty.ConnectionTransaction.main(ConnectionTransaction.java:24)
            * 在一个事务中,出现异常的话,将会回滚,对数据库中的数据没有进行改变。
            * */
            prep2.executeUpdate();
            conn.commit();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
            try {
                conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
        //释放空间
        if (prep1!=null){
            try {
                prep2.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (prep2!=null){
            try {
                prep2.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (stat!=null){
            try {
                stat.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn!=null){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 需要注意的是:

在这里插入图片描述

  • mybatis方式的事务控制

从创建一个完整的mybtis项目开始

  1. 创建一个maven项目,导入mybatis的依赖包
 <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
 </dependencies>
  1. 创建一个实体类和后台数据库保持一致
public class Account {
  private int id;
  private String name;
  private int money;
  }
  //构造方法和get/set方法省略
  1. mybatis-config.xml-----mybatis的配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
       PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
   <environments default="development">
       <environment id="development">
           <transactionManager type="JDBC"/>
           <dataSource type="POOLED">
               <property name="driver" value="com.mysql.jdbc.Driver"/>
               <property name="url" value="jdbc:mysql://localhost:3306/test"/>

               <property name="username" value="root"/>
               <property name="password" value="root"/>
           </dataSource>
       </environment>
   </environments>
   <mappers>
       <mapper resource="com/lty/dao/AccountDaoMapper.xml"/>
   </mappers>

</configuration>
  1. mybatis的工具类
package com.lty.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;

public class MybatisUtils {

   private static SqlSessionFactory sqlSessionFactory;

   static {
       try {
           String resource = "mybatis-config.xml";
           InputStream inputStream = Resources.getResourceAsStream(resource);
           sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
   //获取SqlSession连接
   public static SqlSession getSession(){
       return sqlSessionFactory.openSession();
   }

}

  1. 接口的实现
package com.lty.dao;

import com.lty.pojo.Account;

import java.util.List;

public interface AccountDao {
   List<Account> getAccountList();

   int updateAccount(Account account);

   Account selectAccountById(int id);
}

  1. 实现接口的xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lty.dao.AccountDao">
   <select id="getAccountList" resultType="com.lty.pojo.Account">
       select * from account;
   </select>
   <update id="updateAccount" parameterType="com.lty.pojo.Account" >
       update account  set name= #{name},money= #{money} where id= #{id};
   </update>
   <select id="selectAccountById" parameterType="int" resultType="com.lty.pojo.Account">
       select * from account where id= #{id};
   </select>
</mapper>
  1. 测试类实现
package com.lty.dao;
import com.lty.pojo.Account;
import com.lty.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;

/**
* @Description:
* @Author: Feng.QC
* @Date: 2020/12/16 13:39
* @Version: 1.0
*/
public class AccountMapperTest {
   @Test
   public void test01(){
       //获取sqlSession
       SqlSession session = MybatisUtils.getSession();
       //执行sql
       AccountDao mapper = session.getMapper(AccountDao.class);
       List<Account> accountList = mapper.getAccountList();
       for (Account account : accountList) {
           System.out.println(account);
       }
       //关闭sqlsession
       session.close();
   }
   @Test
   public void test02(){
       SqlSession session = MybatisUtils.getSession();
       AccountDao mapper = session.getMapper(AccountDao.class);
       Account account = mapper.selectAccountById(1);
       System.out.println(account);
   }
   @Test
   public void test03(){
       SqlSession session = MybatisUtils.getSession();

       AccountDao mapper = session.getMapper(AccountDao.class);
       Account account = mapper.selectAccountById(1);
       account.setMoney(8999);
       int i = mapper.updateAccount(account);
       System.out.println(i);
       //sqlSession是不能手动开启事务的
       //因为mybaties是自动开启事务的,如果没有提交的话,后台收据库是没有发生变化的。
       //事务提交
       session.commit();
       session.close();
   }
}
  • 体现事务的部分
    在这里插入图片描述
  • 参考资料
    视频:https://www.bilibili.com/video/BV1NE411Q7Nx?from=search&seid=11050525512831279590
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值