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):事务提交后,修改会永久保存到数据库,即使系统崩溃也不会丢失。
一个完整的事务通常包含以下阶段:
- 开始事务(Begin Transaction)
标记事务的起点,此后的所有操作都将被纳入该事务的范围。在 MySQL 中,默认自动开启事务,也可通过BEGIN或START TRANSACTION显式开启。 - 执行 SQL 操作
执行一系列增删改查语句,这些操作会暂时记录在事务日志中,未真正写入数据库(或仅写入内存缓冲区)。 - 提交事务(Commit)
若所有操作无异常,通过COMMIT确认事务,将日志中的修改永久写入数据库,事务结束。 - 回滚事务(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);}