注解开发
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);
}