【Mybatis】注解开发与事务

注解开发

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

常用的注解:

@Insert:添加、@Update:修改、@Delete:删除、@Select:查询、@Result:实现结果集封装

@Results:可以和@Result一起使用,封装多个结果集

@One:实现一对一和多对一的结果集封装

@Many:实现一对多结果级封装

java 复制代码
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 注解

java 复制代码
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()方法提交事务

代码示例

java 复制代码
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();
    }
    @Test
    public 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);
    }
相关推荐
天若有情6731 天前
SpringBoot4 + MyBatis 前后端分离实战|从零实现坏习惯管理系统,支持局域网手机访问CRUD
智能手机·mybatis
不能只会打代码1 天前
Day 011 — Spring 全家桶深度拆解
spring boot·mybatis·spring aop·spring mvc·spring ioc
憧憬成为web高手2 天前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
Java面试题总结3 天前
mybatis插件
java·tomcat·mybatis
Devin~Y4 天前
互联网大厂Java面试实战:Spring Boot、MyBatis、Redis、Kafka、JWT、Spring Cloud 与 AI 场景追问
java·spring boot·redis·spring cloud·kafka·mybatis·spring security
Ethan01074 天前
mybatis插件
mybatis
扎Zn了老Fe5 天前
MyBatis-Plus必知必会:告别低效CRUD,高效开发持久层
后端·mybatis
醉城夜风~5 天前
MyBatis 基础CRUD全套实战学习笔记
笔记·学习·mybatis
万亿少女的梦1685 天前
基于微信小程序、Spring Boot与Vue3的智慧养老管理系统设计与实现
spring boot·redis·微信小程序·mybatis·vue3
4154116 天前
MyBatis-Plus + PostGIS 实战(四):GeoJSON 序列化与前端地图对接,全局 WKT + 局部 GeoJSON,两种格式优雅共存
java·mybatis·postgis·geojson