MyBatis(五) 事务管理

简介: 基于Mybaties实现事务操作(附源码)

项目截图
在这里插入图片描述

项目建立步骤:
1、在src目录下建立dp.properties文件,存放配置信息(需要自己在Oracle数据库建表)

jjdbc.driver=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.username=bjsxt
jdbc.password=123

2、建立MyBatisUtil工具类

package cn.bjsxt.util;

import java.io.IOException;
import java.io.InputStream;

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

public class MyBatisUtil {
    private static SqlSessionFactory factory=null;
    
    static {
        
        try {
            InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
            factory=new SqlSessionFactoryBuilder().build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getSession() {
        SqlSession session=null;
        if (factory!=null) {
            //true表示开启自动提交功能,防止回滚,但是运行多条sql语句可能出问题
            //session=factory.openSession(true);
            session=factory.openSession();
        }
        return session;
    }
}

3、log4j.properties 文件,设置日志输出格式

# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=ERROR, CONSOLE
# log4j.rootCategory=DEBUG, CONSOLE, LOGFILE

# 单独设置sql语句的输出级别为DEBUG级别
#方法级别
#log4j.logger.cn.bjsxt.mapper.UserMapper.selAll=DEBUG
#类级别
# log4j.logger.cn.bjsxt.mapper.UserMapper=DEBUG
# 包级别
log4j.logger.cn.bjsxt.mapper=DEBUG

# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=- %m%n

# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:/test.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=- %m %l%n


4、mybatie-cfg.xml 框架主要的配置文件

<?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>
    <!--properties 加载外部文件 -->
    <properties resource="db.properties"></properties>
    <!-- 用于指定使用哪个环境 mysql故障 故采用oracle default:用于指定使用的环境id -->
    <settings>
        <!-- 设置mybatis使用log4j支持 -->
        <setting name="logImpl" value="LOG4J" />
    </settings>
    <typeAliases>
        <!-- typeAlias 给类起别名,在UserMapper使用时直接引用类名即可 -->
        <!-- <typeAlias type="cn.bjsxt.pojo.User"/> -->
        <package name="cn.bjsxt.pojo" />
    </typeAliases>
    <environments default="dev">
        <!-- 用于配置开发环境 id:环境的唯一识别码 -->
        <environment id="dev">
            <!-- 事务管理器 type:用于设置mybaties采用什么方式管理事务 JDBC表示采用和JDBC一样的事务管理方式 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- 数据源/连接池,用于配置连接池和数据库连接的参数 type:用于设置mybatis是否采用连接池技术 POOLED表示mybatis采用连接池技术 -->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
    <!-- 扫描mapper文件 -->
    <mappers>
        <mapper resource="cn/bjsxt/mapper/UserMapper.xml" />
    </mappers>
</configuration>

5、UserMapper.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">
  <!-- 
      namespace:命名空间,可以随意定义,一般情况下要写全限定路径
      MyBatis管理SQL语句是通过namespace+id来定位的
   -->
<mapper namespace="cn.bjsxt.mapper.UserMapper">
    <!-- 新增 -->
    <insert id="insUser" parameterType="user">
        insert into t_user values(#{id},#{username},#{password})
    </insert>
    <!--  修改 -->
    <update id="updUser" parameterType="user">
        update t_user set username=#{username},password=#{password} where id=#{id}
    </update>
    <update id="delUser" parameterType="user">
        delete from t_user where id=#{id}
    </update>
</mapper>

6、实体类

package cn.bjsxt.pojo;

import java.io.Serializable;

public class User implements Serializable {
    private int id;
    private String username;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public User(int id, String username, String password) {
        super();
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public User() {
        super();
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        result = prime * result + ((password == null) ? 0 : password.hashCode());
        result = prime * result + ((username == null) ? 0 : username.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (id != other.id)
            return false;
        if (password == null) {
            if (other.password != null)
                return false;
        } else if (!password.equals(other.password))
            return false;
        if (username == null) {
            if (other.username != null)
                return false;
        } else if (!username.equals(other.username))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
    }

}

7、主类

package cn.bjsxt.test;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import cn.bjsxt.pojo.User;
import cn.bjsxt.util.MyBatisUtil;

public class TestInsert {
    @Test
    public void TestDel() {
        SqlSession session = MyBatisUtil.getSession();
        User user = new User();
        user.setId(8);
        
        int num = session.delete("cn.bjsxt.mapper.UserMapper.delUser", user);
        if (num>0) {
            System.out.println("删除成功");
            session.commit();
        } else {
            System.out.println("删除失败");
            session.rollback();
        }
    }
    
    @Test
    public void testUpd() {
        SqlSession session = MyBatisUtil.getSession();
        User user = new User();
        user.setId(8);
        user.setUsername("普京");
        user.setPassword("666");
        
        int num = session.update("cn.bjsxt.mapper.UserMapper.updUser", user);
        if (num>0) {
            System.out.println("更新成功");
            session.commit();
        }else {
            System.out.println("更新失败");
            session.rollback();
        }
        session.close();
    }
    //使用junit时,每次要运行一个方法都要在方法前面加@Test,否则会报无法解析的异常
    
    @Test
    public void testIns() {
        SqlSession session = MyBatisUtil.getSession();
        User user = new User();
        user.setId(8);
        user.setUsername("小京");
        user.setPassword("123");
        
        int num = session.insert("cn.bjsxt.mapper.UserMapper.insUser", user);
        if (num>0) {
            //成功时,提交事务,防止回滚
            System.out.println("新增成功");
            session.commit();
        }else {
            //失败时,回滚事务
            System.out.println("新增失败");
            session.rollback();
        }
        //关闭资源
        session.close();
    }
    
    
}

8、运行结果演示(因为该数据已经插入,所以插入失败)
在这里插入图片描述

相关文章
|
Java 关系型数据库 MySQL
详解 MyBatis 事务管理,彻底颠覆你对事务的理解!
详解 MyBatis 事务管理,彻底颠覆你对事务的理解!
695 0
详解 MyBatis 事务管理,彻底颠覆你对事务的理解!
|
Java 关系型数据库 MySQL
不能吧,最后一次它又来了--整合Mybatis和事务管理(“最易懂得Spring学习”)(一)
整合Mybatis以及了解Spring中的事务管理 十二、整合Mybatis 1. 回忆mybatis
不能吧,最后一次它又来了--整合Mybatis和事务管理(“最易懂得Spring学习”)(一)
|
Java 数据库连接 数据库
不能吧,最后一次它又来了--整合Mybatis和事务管理(“最易懂得Spring学习”)(三)
十三、声明式事务 1. 回顾事务 2. 一个案例 3.Spring中的事务管理
|
22天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
9天前
|
SQL XML Java
springboot整合mybatis-plus及mybatis-plus分页插件的使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis-Plus及其分页插件,包括依赖引入、配置文件编写、SQL表创建、Mapper层、Service层、Controller层的创建,以及分页插件的使用和数据展示HTML页面的编写。
springboot整合mybatis-plus及mybatis-plus分页插件的使用
|
2月前
|
Java 数据库连接 测试技术
SpringBoot 3.3.2 + ShardingSphere 5.5 + Mybatis-plus:轻松搞定数据加解密,支持字段级!
【8月更文挑战第30天】在数据驱动的时代,数据的安全性显得尤为重要。特别是在涉及用户隐私或敏感信息的应用中,如何确保数据在存储和传输过程中的安全性成为了开发者必须面对的问题。今天,我们将围绕SpringBoot 3.3.2、ShardingSphere 5.5以及Mybatis-plus的组合,探讨如何轻松实现数据的字段级加解密,为数据安全保驾护航。
94 1
|
2月前
|
Web App开发 前端开发 关系型数据库
基于SpringBoot+Vue+Redis+Mybatis的商城购物系统 【系统实现+系统源码+答辩PPT】
这篇文章介绍了一个基于SpringBoot+Vue+Redis+Mybatis技术栈开发的商城购物系统,包括系统功能、页面展示、前后端项目结构和核心代码,以及如何获取系统源码和答辩PPT的方法。
|
2月前
|
Java 关系型数据库 MySQL
1、Mybatis-Plus 创建SpringBoot项目
这篇文章是关于如何创建一个SpringBoot项目,包括在`pom.xml`文件中引入依赖、在`application.yml`文件中配置数据库连接,以及加入日志功能的详细步骤和示例代码。