【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);
    }
相关推荐
侠客行03174 小时前
Mybatis入门到精通 一
java·mybatis·源码阅读
赵得C8 小时前
完整 Oracle 12c 分页 Demo(Spring Boot+MyBatis+PageHelper)
spring boot·oracle·mybatis
任子菲阳12 小时前
学Javaweb第四天——springboot入门
java·spring·mybatis
赵得C15 小时前
Spring Boot+MyBatis:用 PageHelper 实现 Oracle 12c 的 OFFSET 分页
spring boot·oracle·mybatis
Leonardo_Fibonacci17 小时前
skbbs-day5
java·开发语言·mybatis
cike_y17 小时前
Mybatis之分页的实现&日志工厂&Log4j详解
数据库·log4j·mybatis
星光一影1 天前
教育培训机构消课管理系统智慧校园艺术舞蹈美术艺术培训班扣课时教务管理系统
java·spring boot·mysql·vue·mybatis·uniapp
cike_y2 天前
Mybatis之作用域(Scope)和生命周期-解决属性名和字段名不一致的问题&ResultMap结果集映射
java·开发语言·数据库·tomcat·mybatis
柒.梧.2 天前
MyBatis一对一关联查询深度解析:大实体类、SQL99联表、分布式查询实践
分布式·mybatis
Coder_Boy_2 天前
SpringAI与LangChain4j的智能应用-(理论篇)
人工智能·spring·mybatis·springai·langchain4j