当前位置: 首页 > news >正文

Mybatis注解开发与事务

Mybatis注解开发与事务

  • 注解开发
  • 事务

注解开发

MyBatis 注解开发是一种通过 Java 注解来配置 SQL 映射关系的方式,相比传统的 XML 配置,它可以将 SQL 语句直接写在接口方法上,使代码更加简洁。

常用的注解:
@Insert:添加、@Update:修改、@Delete:删除、@Select:查询、@Result:实现结果集封装
@Results:可以和@Result一起使用,封装多个结果集
@One:实现一对一和多对一的结果集封装
@Many:实现一对多结果级封装

import org.apache.ibatis.annotations.*;
import java.util.List;public interface UserMapper {// 新增@Insert("INSERT INTO user(username, age) VALUES(#{username}, #{age})")int insert(User user);// 删除@Delete("DELETE FROM user WHERE id = #{id}")int deleteById(Integer id);// 更新@Update("UPDATE user SET username = #{username}, age = #{age} WHERE id = #{id}")int update(User user);// 查询单个@Select("SELECT id, username, age FROM user WHERE id = #{id}")User selectById(Integer id);// 查询所有@Select("SELECT id, username, age FROM user")List<User> selectAll();
}

结果映射 @Result 注解

public interface UserDao {//查询所有@Select("select * from user")@Results(id="userMap",value = {@Result(property = "id",column = "id"),@Result(property = "username",column = "username"),@Result(property = "birthday",column = "birthday"),@Result(property = "sex",column = "sex"),@Result(property = "address",column = "address")})public List<User> findAll();//通过ID查询@Select("select * from user where id = #{id}")@ResultMap(value = "userMap")public User findById(int id);
}

运行代码结果如下:

在这里插入图片描述
在这里插入图片描述

事务

事务(Transaction)是数据库操作的基本单元,用于保证一组数据库操作的原子性、一致性、隔离性和持久性(ACID 特性):

  • 原子性(Atomicity):事务中的操作要么全部成功,要么全部失败(失败则回滚)。
  • 一致性(Consistency):事务执行前后,数据库的状态始终保持合法符合业务规则。
  • 隔离性(Isolation):多个并发事务之间相互隔离,互不干扰,避免脏读、不可重复读、幻读。
  • 持久性(Durability):事务提交后,修改会永久保存到数据库,即使系统崩溃也不会丢失。

一个完整的事务通常包含以下阶段:

  1. 开始事务(Begin Transaction)
    标记事务的起点,此后的所有操作都将被纳入该事务的范围。在 MySQL 中,默认自动开启事务,也可通过BEGIN或START TRANSACTION显式开启。
  2. 执行 SQL 操作
    执行一系列增删改查语句,这些操作会暂时记录在事务日志中,未真正写入数据库(或仅写入内存缓冲区)。
  3. 提交事务(Commit)
    若所有操作无异常,通过COMMIT确认事务,将日志中的修改永久写入数据库,事务结束。
  4. 回滚事务(Rollback)
    若执行过程中发生错误(如异常、约束冲突),通过ROLLBACK撤销所有操作,数据库恢复到事务开始前的状态,事务结束。

配置事务示例,使用本地事务策略:

			<!--配置事务的类型,使用本地事务策略--><transactionManager type="JDBC"></transactionManager>

设置自动提交事务,可以通过openSession的方法进行设置,openSession(true) 自动提交事务
MyBatis框架中的事务默认是手动提交的,也就是每次编写程序都需要调用commit()方法提交事务

代码示例

import com.qcby.dao.UserDao;
import com.qcby.entity.User;
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 org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Date;
import java.util.List;public class UserTest {private InputStream in = null;private SqlSession session = null;private UserDao userDao = null;@Before  //前置通知, 在方法执行之前执行public void init() throws IOException {//加载主配置文件,目的是为了构建SqlSessionFactory对象in = Resources.getResourceAsStream("SqlMapConfig.xml");//创建SqlSessionFactory对象SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//通过SqlSessionFactory工厂对象创建SqlSesssion对象session = factory.openSession();//通过Session创建UserDao接口代理对象userDao = session.getMapper(UserDao.class);}@After  //@After: 后置通知, 在方法执行之后执行 。public void destory() throws IOException {//释放资源session.close();in.close();}@Testpublic void add(){User user = new User();user.setUsername("小王");user.setSex("男");user.setAddress("北京");user.setBirthday(new Date());int count = userDao.add(user);try{userDao.add(user);session.commit();}catch(Exception e){e.printStackTrace();session.rollback();}System.out.println(count);}
http://www.dtcms.com/a/321905.html

相关文章:

  • MPLS LDP标签的分发与管理
  • Linux基础命令速查:从入门到精通
  • 搜广推校招面经一百零三
  • 从手工到智能决策,ERP让制造外贸企业告别“数据孤岛“降本增效
  • Flow的进阶学习2025
  • 亚马逊广告运营如何平衡ASIN投放和关键词投放
  • 用不均匀硬币实现公平决策
  • 虚拟机Ubuntu图形化界面root用户登录错误
  • Python的七大框架对比分析
  • 《嵌入式数据结构笔记(六):二叉树》
  • 【C语言:一个整数分离出每一位数后求重新组合后接近于某个数的整数】
  • STM32传感器模块编程实践(十三)人脸识别模块简介及驱动
  • Redis缓存击穿、穿透雪崩
  • ADB 命令执行模块开发:双模式(普通模式Shell交互模式)实现、线程安全与资源管理优化
  • Linux系统层IO
  • Node.js 》》数据验证 Joi 、express-joi
  • 【数字图像处理系列笔记】Ch06:图像压缩
  • 数据结构5-哈希表
  • 板卡如何安装在主机系统(刀片服务器或计算节点)
  • Linux之shell脚本入门
  • Unity基于Recoder的API写了一个随时录屏的工具
  • http状态码403,404,500等是什么意思?
  • Cursor CLI 来了,准备 Build anything
  • Sum of Three Values(sorting and searching)
  • 全面了解selenium
  • RSA非对称加密
  • 除了腾讯会议,私有化有哪些选择?
  • 安科瑞EMS3.0源网荷储一体化解决方案 全面助力零碳园区建设
  • FreeSWITCH parse-all-invite-headers
  • 记一次lombok链式调用引发EasyExcel兼容性的问题