Mybatis的核心组件
- SqlSessionFactoryBuild(构造器):它会根据配置或者代码来生成SqlSessionFactory,采用的是分布构建Builder模式。
这部分代码返回一个 SqlSessionFactory对象 - SQLSessionFactory(工厂接口):依靠他来生成SqlSession,使用的是工厂模式。
- SqlSession(会话):一个既可以发送SQL执行返回结果,也可以获取Mapper的接口。在现有的技术中,一般我们会让其在业务逻辑代码中“消失”,而使用的是Mybatis提供的SQL Mapper接口编程技术,它能提高代码的可阅性和可维护性。
- SQL Mapper(映射器):Mybatis新设计存在的组件,它有一个Java接口和XML文件构成(还可以由注解完成,个人用的都是XML),需要给出对应的SQL和映射规则。它赋值发送SQL执行,并返回结果。
- 运行流程 SqlSessionFactoryBuild(构造器)—>(通过配置或者代码)—>SqlSessionFactory(工厂接口)—>SqlSession(会话)---->(发送SQL语句)—>SQL Mapper(映射器)----->数据库
这里附上代码,来自于书《Java EE互联网轻量型级框架整合开发》
链接:https://pan.baidu.com/s/1X6-NlcybWaXTA0Gl0jVJlw
提取码:zswh
SqlSessionFactory(工厂接口)
在Mybatis中,可以通过xml文件生成SqlSession,也可以通过Java代码形式去生成SqlSessionFactory。
XMl构建SqlSessionFactory
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases><!-- 别名 -->
<typeAlias alias="role" type="com.learn.ssm.chapter3.pojo.Role"/>
</typeAliases>
<!-- 数据库环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/chapter3"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 映射文件 -->
<mappers>
<mapper resource="com/learn/ssm/chapter3/mapper/RoleMapper.xml"/>
<mapper class="com.learn.ssm.chapter3.mapper.RoleMapper2"/>
</mappers>
</configuration>
Mybatis基础配置文件:
- < typeAlias>元素定义了一个别名role,它代表着com.learn.ssm.chapter3.pojo.Role这个类。定义完以后,可以在Mybatis的上下文使用别名去替代全限定名了。
- < environment>元素的定义,这里描述的是数据库。它里面的元素是配置事务管理器.
dataSource元素配置数据库,其中属性type=“POOLED”代表采用Mybatis内部提供了连接池方式。最后定义了一些JDBC的属性信息。 - < mapper> 元素代表引入的那些映射器
通过读取配置文件mybatis-config.xml然后通过SqLSessionFactoryBuilder的Builder方法去创建SqlSessionFactory。在Mybatis中,采用Builder模式为开发者隐藏了这部分细节,只需重点SqlSessionFactory被创建出来,就好了。
SqlSession
在使用XML配置免去了我们创建SQLSessionFactory,下一步我们去创建SqlSession。我们先去了解一下SqLSession
在Mybatis中,SqlSession是其中核心接口。在Mybatis中有两个实现类,DefaultSqlSession和SqlSessionManager。DefaultSqlSession是单线程使用的,而SqlSessionManager在多线程环境下使用。SqlSession的作用类似于一个JDBC中的Connection对象,代表着一个连接资源的启用,具体功能有3个:
- 获取Mapper接口
- 发送SQL给数据库
- 控制数据库事务
映射器
映射器是Mybatis中最重要、最复杂的组件,它由一个接口对应的XML文件或注解组成。提供以下功能
- 描述映射规则
- 提供SQL语句,并可以配置SQL参数类型、返回类型、缓存刷新等信息
- 配置缓存
- 提供动态SQL
写一个例子来实现,pojo类 Role
public class Role{
private Long id;
private String roleName;
private String note;
}
使用XML实现映射器
映射器接口:RoleMapper
public interface RoleMaper{
public int insertRole(Role role);
public int deleteRole(Long id);
public int updateRole(Role role);
public Role getRole(Long id);
public List<Role> findRoles(String roleName);
}
配置XML
<mapper resource="com.sx.Mapper.UserMapper.xml">
实现UserMapper接口,UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.learn.ssm.chapter3.mapper.RoleMapper">
<insert id="insertRole" parameterType="role">
insert into t_role(role_name, note) values(#{roleName}, #{note})
</insert>
<delete id="deleteRole" parameterType="long">
delete from t_role where id= #{id}
</delete>
<update id="updateRole" parameterType="role">
update t_role set role_name = #{roleName}, note = #{note} where id= #{id}
</update>
<select id="getRole" parameterType="long" resultType="role">
select id,
role_name as roleName, note from t_role where id = #{id}
</select>
</mapper>
这样就完成了一个映射器,先看XML属性
- < mapper >元素中的属性namespace所对应的是一个接口的全限定名,于是Mybatis上下文就可以通它找到相对应的接口。
- < select >元素表名这是一条查询语句,而属性id标识了这条SQL,属性parameterType="long"说明传递给SQL的是一个long型参数,而resultType=“role”表示了返回的是Role类的对象。而role是之前配置文件mybatis-config.xml配置的别名。
- 这条SQL语句中的#{id}表示传递进去的参数。
Mybatis基于XML配置文件创建Configuration对象的过程
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourcesAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
SqlSession sqlSession = sqlSessionFactory.openSession();
1、在这段代码中,SqlSessionFactoryBuild对象先是执行build()
2、根据配置信息创建一个XMLConfigBuilder对象
3、SqlSessionFactoryBuilder调用XMLConfigBuilder对象的parser()方法
4、XMLConfigBuilder对象返回一个Configuration对象
5、SqlSessionFactoryBuilder对象的build(Configuration config)方法返回一个DefaultSqlSessionFactory对象
SqlSessionFactoryBuild代码:
public class SqlSessionFactoryBuilder {
public SqlSessionFactoryBuilder() {
}
public SqlSessionFactory build(Reader reader) {
return this.build((Reader)reader, (String)null, (Properties)null);
}
public SqlSessionFactory build(Reader reader, String environment) {
return this.build((Reader)reader, environment, (Properties)null);
}
public SqlSessionFactory build(Reader reader, Properties properties) {
return this.build((Reader)reader, (String)null, properties);
}
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
SqlSessionFactory var5;
try {
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
var5 = this.build(parser.parse());
} catch (Exception var14) {
throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException var13) {
}
}
return var5;
}
public SqlSessionFactory build(InputStream inputStream) {
return this.build((InputStream)inputStream, (String)null, (Properties)null);
}
public SqlSessionFactory build(InputStream inputStream, String environment) {
return this.build((InputStream)inputStream, environment, (Properties)null);
}
public SqlSessionFactory build(InputStream inputStream, Properties properties) {
return this.build((InputStream)inputStream, (String)null, properties);
}
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
SqlSessionFactory var5;
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
var5 = this.build(parser.parse());
} catch (Exception var14) {
throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException var13) {
}
}
return var5;
}
public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
}