- 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项目开始
- 创建一个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>
- 创建一个实体类和后台数据库保持一致
public class Account {
private int id;
private String name;
private int money;
}
//构造方法和get/set方法省略
- 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>
- 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();
}
}
- 接口的实现
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);
}
- 实现接口的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>
- 测试类实现
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