【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);
    }
相关推荐
少年攻城狮3 小时前
Mybatis-Plus系列---【自定义拦截器实现sql完整拼接及耗时打印】
数据库·sql·mybatis
清晓粼溪4 小时前
Mybatis02:核心功能
java·mybatis
SadSunset5 小时前
(13)复杂查询
java·笔记·架构·mybatis
SadSunset6 小时前
(12)基于注解实现的sql
mybatis
期待のcode8 小时前
MyBatis-Plus基本CRUD
java·spring boot·后端·mybatis
Mai Dang8 小时前
黑马Mybatis-Plus学习笔记
笔记·学习·mybatis
hadage23320 小时前
--- redis 常见问题 ---
数据库·redis·mybatis
_院长大人_21 小时前
MyBatis Plus 分批查询优化实战:优雅地解决 IN 参数过多问题(实操)
java·mybatis
5***b971 天前
SpringBoot(整合MyBatis + MyBatis-Plus + MyBatisX插件使用)
spring boot·tomcat·mybatis