Mybatis注解、Mybatis运行原理
注解
作用:mybatis为了简化mapper.xml文件,但是动态Sql依然使用mapper.xml文件。
- mapper.xml和注解是可以共同存在的。
- 使用注解时,mybatis.xml中<mappers ‘>使用<package =/>或者是<mapper class=’’‘/>
注解示例
1、基本的增删改查
@Select("select * from teacher")
public List<Teacher> selAll();
//增删改返回值都是int
@Insert("insert into teacher values(default,#{name})")
public int add(Teacher teacher);
@Update("update teacher set name=#{name} where id=#{id}")
public int update(Teacher teacher);
@Delete("delete from teacher where id=#{id}")
public int delete(int id);
2、使用AutoMapping根据查询学生信息查询老师信息
@Select("select s.id,s.name,age,tid,t.id `teacher.id`,t.name `teacher.name` from stu s left join teacher t on s.tid=t.id")
List<Stu> selAll();
3、使用注解配置resultMap,根据查询老师信息查询学生信息
- 在StudentMapper中,查询全部学生信息
@Select("select * from stu where tid=#{tid}")
List<Stu> selStu(int tid);
- 在TeacherMapper中,配置resultMap
注:@Results相当于<resultMap ‘/>
@Result,id=true时相当于<id’>标签,否则相当于<result’>。
@Many相当于<collection’>标签
@One相当于<association’>标签
@Results(value={@Result(id=true,property="id",column="id"),
@Result(property="name",column="name"),
@Result(column="id",property="list",many=@Many(select="com.mapper.StudentMapper.selStu"))
})
@Select("select * from teacher")
public List<Teacher> selAndStu();
Mybatis运行原理
- Resources类, Mybatis中IO流工具类。作用:加载mybatis.xml配置文件。
- SqlSessonFactoryBuilder() 构建器。作用:创建SqlSessionFactory接口的实现类。
- XMLconfigBuilder类, Mybatis全局配置文件内容构建器类。作用:负责读取流内容并转换为JAVA代码。
- Configuration类, 封装了全局配置文件所有配置信息。
- DefaultSqlSessionFactory类,是SqlSessionFactory接口的实现类。
- Transaction事务类。每个SqlSession会带有一个Transaction对象。
- TransactionFactory事务工厂。负责生产Transaction。
- Executor类,Mybatis执行器。作用:负责执行SQL命令,相当于JDBC中statement对象(或者PrepareStatement或CallableStatement),默认执行器为SimpleExcutor、批量操作为BatchExcutor,通过openSession(参数控制)
- DefaultSqlSession类是SqlSession接口的实现类
10.ExceptionFactory类,Mybatis中异常工厂。
运行流程:
文字描述:
首先,在Mybatis运行开始时需要先通过Resources加载全局配置文件,下面需要实例化SqlSessionFactoryBuilder构建器,帮助SqlSessionFactory接口实现DefaultSqlSessionFactory。
其次,在实例化DefaultSqlSessionFactory之前,需要先创建XmlConfigBuilder解析全局配置文件流,并把解析结果存放在Configuration之中,之后把Configuration传递给DefaultSqlSessionFactory。到此SqlSessionFactory工厂创建成功。
然后,由SqlSessionFactory工厂创建SqlSession,每次创建SqlSession时,都需要TransactionFactory创建Transactio对象,同时还需要创建SqlSession的执行器Excutor,最后实例化DefaultSqlSession,传递给SqlSession接口。
最后, 根据项目需求使用SqlSession接口中的API完成具体的事务操作。
如果事务执行成功,提交给数据库,关闭SqlSession。
如果事务执行失败,需要进行rollback回滚事务。