第二章、核心配置
一、SqlSessionFactoryBuilder
局部变量
1.重载
核心源码
build()方法中的参数environment和properties都可以为null
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;
}
参数inputStream是字节流,它封装了XML文件形式的配置信息;
参数environment和参数properties为可选参数。
其中,参数environment决定将要加载的环境,包括数据源和事务管理器;
参数properties决定将要加载的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;
}
第一种形式的build()方法使用InputStream字节流封装了XML文件形式的配置信息,
而第二种形式的build()方法使用Reader字符流封装了xml文件形式的配置信息。
2.注意点
用单例模式创建SqlSessionFactory,因为它是线程安全的
SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用程序执行期间都会存在。
如果我们多次创建同一个数据库的SqlSessionFactory对象,
那么该数据库的资源将很容易被耗尽。
通常每一个数据库都只创建一个SqlSessionFactory对象,
所以在构建SqlSessionFactory对象时,建议使用单例模式。
二、Sqlsession
SqlSession是MyBatis框架中另一个重要的对象,
它是应用程序与持久层之间执行交互操作的一个单线程对象,
主要作用是执行持久化操作,类似于JDBC中的Connection。
SqlSession对象包含了执行SQL操作的方法,由于其底层封装了JDBC连接,
所以可以直接使用SqlSession对象来执行已映射的SQL语句。
1.常用方法
参数总结
String statement------------------------>mapper里面的语句ID
Object parameter----------------------->mapper的SQl语句的占位对象,类似?
2.作用域SCOPE
每一个线程都应该有一个自己的SqlSession对象,并且该对象不能共享。
SqlSession对象是线程不安全的,因此其使用范围最好在一次请求或一个方法中,
(如Servlet的HttpSession)中使用。
绝不能将其放在类的静态字段、对象字段或任何类型的管理范围
SqlSession对象使用完之后,要及时的关闭,SqlSession对象通常放在finally块中关闭
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// 此处执行持久化操作
} finally {
sqlSession.close();
}
三、MyBatis-config.xml
1.<configuration.>
元素列表
在核心配置文件中,<configuration.>的子元素必须按照上图
由上到下的顺序进行配置,否则MyBatis在解析XML配置文件的时候会报错。
- <properties.>是一个配置属性的元素,该元素的作用是读取外部文件的配置信息。
<dataSource type="POOLED">
<property name="driver" value="${mysql.driver}"/>
</dataSource>
${mysql.driver}实现动态替换
2.<.settings>
可以配置以下
3.《typeAliases》
设置别名用的,
<typeAliases>
<typeAlias alias=“User”type="com.itheima.pojo.User"/>
4.《environments>
<environment>元素有两个子元素,
<transactionManager>元素和<daraSource>元素。
<transactionManager>元素用于配置运行环境的事务管理器;
<daraSource>元素用于配置运行环境的数据源信息。
-
UNPOOLED表示数据源为无连接池类型。配置此数据源类型后,程序在每次被请求时会打开和关闭数据库连接。UNPOOLED适用于对性能要求不高的简单应用程。
-
POOLED表示数据源为连接池类型。POOLED数据源利用“池”的概念将JDBC连接对象组织起来,节省了在创建新的连接对象时需要初始化和认证的时间。POOLED数据源使得并发Web应用可以快速的响应请求,是当前比较流行的数据源配置类型
5.<mappers。>
<mappers.>元素用于引入MyBatis映射文件。
映射文件包含了POJO对象和数据表之间的映射信息,
MyBatis通过核心配置文件中的
<mappers.>元素找到映射文件并解析其中的映射信息。
四、Mapper.Xml
1.nameSpacce元素
-
用于区分不同的mapper,全局唯一。
-
绑定DAO接口,即面向接口编程。当namespace绑定某一接口之后,可以不用写该接口的实现类,MyBatis会通过接口的全限定名查找到对应的mapper配置来执行SQL语句,因此namespace的命名必须跟接口同名。
-
Mybatis的接口不需要实现类,实际上是使用了JDK动态代理的方式创建代理对象完成的。
这里有其它人的源码分析
2.<select.>
select>元素用来映射查询语句,它可以从数据库中查询数据并返回。
<select id="findById" parameterType="int"
resultType="com.lipp.pojo.User">
select * from users where uid = #{id}
</select>
3.<insert.>
如果使用的数据库支持主键自动增长(如MySQL和SQL Server),那么可以通过keyProperty属性指定POJO类的某个属性接收主键返回值(通常会设置到id属性上),然后将useGeneratedKeys的属性值设置为true。
<insert id="addUser" parameterType="com.itheima.pojo.User"
keyProperty="uid" useGeneratedKeys="true" >
insert into users(uid,uname,uage)values(#{uid},#{uname},#{uage})
</insert>
4.<update.>
<update.>元素用于映射更新语句,它可以更新数据库中的数据。在执行完元素中定义的SQL语句后,会返回更新的记录数量。
<update id="updateUser" parameterType="com.itheima.pojo.User">
update users set uname= #{uname},uage = #{uage} where uid = #{uid} </update>
5.<delete.>
<delet.e>元素用于映射删除语句,在执行完元素中的SQL语句之后,会返回删除的记录数量。
<select id="findUserById" parameterType="Integer"
resultType="com.itheima.pojo.User">
select * from users where id = #{id}
</select>
6.<sql.>
在一个映射文件中,通常需要定义多条SQL语句,
在映射文件中使用MyBatis所提供的<sql>元素,
将这些SQL语句中相同的组成部分抽取出来,然后在需要的地方引用。
7.<resultMap.>
解决属性名与字段名不一致的问题
<resultMap type="com.lipp.pojo.Student" id="studentMap">
<id property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="age" column="sage"/>
</resultMap>
<select id="findAllStudent" resultMap="studentMap">
select * from t_student
</select>
其中,在实际中,只需要将不一致的部分进行映射就行了