三、Mybatis 配置文件解析
4.1、核心配置文件
Mybatis中的核心配置文件就是MyBatis-config.xml了,从官方文档中我们可以看到涉及的配置项还是挺多的,接下来我们会挑一些重要的看下
4.2、环境配置(environments)
在开发过程中我们有时需要多套环境进行切换,例如一套开发环境,一套测试环境。这时就可以用到environments配置,我们在mybatis-congif.xml中增加一个test的环境配置,如下:
<configuration>
<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/mybatis?useSSL=true&useUnicodetrue&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicodetrue&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/luca/dao/UserMapper.xml"/>
</mappers>
</configuration>
我们修改Utils中的MybatisUtils中,指定SqlSessionFactoryBuilder方法的环境信息为新增的test
再运行下之前的测试方法,发现可以正常运行,说明切换了环境是可以正常使用的。从这里可以看到,不论设置了多少个环境配置,在工厂方法调用的使用最终只是使用一个。
4.3、属性(properties)
在mybatis-config.xml中,dataSource的driver, url等信息很长很复杂,既不方便使用也不方便维护,为了让配置信息更方便使用和维护,我们增加preperties配置,在dataSource中读取配置中的信息。
-
首先将数据连接的配置信息放到配置文件中,在sources新建db.preperties文件,存放数据库连接配置信息
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8 username=root password=123456
-
在mybatis-config.xml文件中增加properties配置,source设置为刚刚创建的db.properties
<properties resource="db.properties" />
-
这样,mybatis会自动读取配置文件中的内容,我们可以修改dataSource中的引用
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments>
这样看起来是不是简洁了许多,并且把数据库信息的维护都放在了配置文件中。
4.4、类型别名(typeAliases)
解决了mybatis-config.xml中的冗余,在UserMapper.xml中,可以看到parameType的全路径类名也是一个冗余的存在,写起来确实很烦。
-
方法一:
1.在mybatis-config.xml中增加配置typeAliases,为com.luca.pojo.User这个实体类设置一个别名,然后在Mapper.xml中都是用别名代替全名
mybatis-config.xml
<typeAliases> <typeAlias alias="user" type="com.luca.pojo.User" /> </typeAliases>
2.替换UserMapper.xml中的com.luca.pojo.User为别名user
-
方法二:
1.在mybatis-config.xml中不指定某一个实体类,而是指定一个包的路径,mybatis会自动扫描包下的实体类,别名自动设置为实体类的类名。
mybatis-config.xml
<typeAliases> <package name="com.luca.pojo"/> </typeAliases>
2.在UserMapper.xml中仍用user代替com.luca.pojo.User,运行测试用例结果正常。
4.5、设置(settings)
这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项设置的含义、默认值等。
4.6、映射器(mappers)
既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要来定义 SQL 映射语句了。 但首先,我们需要告诉 MyBatis 到哪里去找到这些语句。在自动查找资源方面,Java 并没有提供一个很好的解决方案,所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。
-
在上面的例子中我们的mapper是直接指定了一个接口实现类的xml文件
<mappers> <mapper resource="com/luca/dao/UserMapper.xml"/> </mappers>
-
除此之外,我们也可以使用接口实现类的类名,像这样
<mappers> <mapper class="com.luca.dao.UserMapper"/> </mappers>
-
或者在实现类有很多的情况下,我们直接指定包名,Mybatis会自动查找包下面的接口实现类
<mappers> <package name="com.luca.dao"/> </mappers>
需要注意的是,后两种方式需要接口和接口实现类的名称是一致的,否则会导致Mybatis找不到对应的接口实现类xml文件!
4.7、生命周期和作用域
生命周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder
- 一旦创建了SqlSessionFactory,就不再需要它了
- 所以应该把SqlSessionFactoryBuilder作为局部变量
SqlSessionFactory
- 说白了可以想象为数据库连接池
- SqlSessionFactory一旦创建就应该在应用运行期间一直存在,没有理由丢弃它或者重新创建另一个实例
- 因此SqlSessionFactory的最佳作用域是应用作用域
- 最简单就是使用单例模式或者静态单例模式
SqlSession
- 相当于连接到连接池的一个请求
- SqlSession 实例不是线程安全的,因此不能被共享,所以它的最佳作用域是每次请求或者方法作用域
- 用完之后应该赶紧关闭,避免资源的浪费
在这里没一个Mapper相当于一个具体的业务。