4、配置解析
1、核心配置文件
-
我这里写的叫做:SqlMapConfig.xml,但是标准文档中叫做:mybatis-config.xml
-
Mybatis的配置文件包含了会深深影响Mybatis的行为的设置和属性信息
-
configuration(配置) properties(属性) settings(设置) typeAliases(类型别名) typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) environments(环境配置) environment(环境变量) transactionManager(事务管理器) dataSource(数据源) 连接池 databaseIdProvider(数据库厂商标识) mappers(映射器)
绑定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"> <!--mybatis的主配置文件--> <configuration> <!--引入外部的配置文件--> <properties resource="db.properties"/> <!--设置:使用标准的日志工厂--> <settings> <setting name="logImpl" value="LOG4J"/> </settings> <!--给实体类起一个别名 User或者user--> <typeAliases> <package name="cn.edu.cxtc.domain"></package> </typeAliases> <!--配置环境 这里默认是选择mysql,这只是一个名字,可以配置多个--> <environments default="mysql"> <!--配置mysql的环境--> <environment id="mysql"> <!--配置事物的类型--> <transactionManager type="JDBC"></transactionManager> <!--配置数据源(连接池)--> <dataSource type="POOLED"> <!--配置连接数据库的4个基本信息--> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件--> <mappers> <!--指定配置文件的位置--> <mapper resource="cn/edu/cxtc/dao/UserMapper.xml"></mapper> </mappers> </configuration>
2、环境配置(environment)
Mybatis可以配置成适应多种环境
不过要记住:尽管可以配置多个环境,但是每个SQLSessionFactory实例只能选择一种环境–> 就是一次只能选择一个。
学会用配置多套运行环境!!
Mybatis默认的事务管理器就是JDBC,连接池:POOLED
3、属性(properties)
我们可以通过properties属性来实现引用配置文件。
这些属性可以在外部进行配置,并可以进行动态替换。你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
- 在resources中编写一个properties配置文件
db.properties
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatisdb
username = root
password = root
-
在核心配置文件中引入db.properties:在写properties标签时要按照顺序写
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XBvi5sWw-1590794861058)(C:\Users\kmkd\AppData\Roaming\Typora\typora-user-images\image-20200525155236099.png)]
-
<!--引入外部的配置文件--> <properties resource="db.properties"/>
-
在environment中引入DataSource数据源
-
<dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource>
-
注:就相当于我将要连接的信息写到了外部的properties配置文件中,不用在mybatis-config.xml主配置文件中写,直接引入配置文件就行了,和之前的相似。
4、类型别名(typeAliases)
-
类型别名可为 Java 类型设置一个缩写名字。
-
它仅用于 XML 配置,意在降低冗余的全限定类名书写
-
**简言之:**在dao的映射配置文件中,resultType是方法的返回值类型,但是cn.edu.cxtc.domain.User太冗余,给他起个名字。
-
方法一:直接给实体类起别名:
<!--给实体类起一个别名--> <typeAliases> <typeAlias type="cn.edu.cxtc.domain.User" alias="User"></typeAlias> </typeAliases>
-
方法二:也可以指定一个包名,MyBatis 会在包名下面搜索需要的 Java Bean
- 每一个在包
cn.edu.cxtc.domain
中的 Java Bean,在没有注解的情况下,会使用 Bean 的首字母小写或者大写的非限定类名来作为它的别名 -->推荐使用小写,但是我使用大写 --> User或者user都可以
<typeAliases> <package name="cn.edu.cxtc.domain"></package> </typeAliases>
在实体类比较少的时候,使用第一种
如果实体类十分多,建议使用第二种
第一种可以DIY别名(自定义取名字),第二种不行,必须是实体的名字首字母大写或者小写
- 每一个在包
-
方法三:可以在domain下的实体类中加一个注解:@Alias(“别名”)
- @Alias这个包是在Mybatis下的
- 使用注解定义了别名,在别处使用的时候就可以使用别名
-
建议三种方法不要混合使用
-
去官网查看Mybatis默认的一些类型别名
5、设置(settings)
设置是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为 =>查看帮助文档
-
缓存开启和关闭
-
懒加载
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qzRh3ynm-1590794861062)(C:\Users\kmkd\AppData\Roaming\Typora\typora-user-images\image-20200525163105798.png)]
- 日志实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ttQ1gfYz-1590794861072)(C:\Users\kmkd\AppData\Roaming\Typora\typora-user-images\image-20200525163143211.png)]
6、其他配置
-
对象工厂(objectFactory)
-
类型处理器(typeHandlers)
-
插件(plugins)
- mybatis-generator-core
- Mybatis-plus
- 通用mapper
7、映射器(mappers)
我们需要告诉 MyBatis 到哪里去找到这些SQL语句。所以最好的办法是直接告诉 MyBatis 到哪里去找映射文件。
这些配置会告诉 MyBatis 去哪里找映射文件,剩下的细节就应该是每个 SQL 映射文件了
方式一:使用相对于类路径的资源引用 -->推荐
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<!--指定配置文件的位置-->
<mapper resource="cn/edu/cxtc/dao/UserMapper.xml"></mapper>
</mappers>
方式二:使用映射器接口实现类的完全限定类名
<!-- 使用映射器接口实现类的完全限定类名 -->
<mappers>
<mapper class="cn.edu.cxtc.dao.UserDao"/>
</mappers>
方式三:将包内的映射器接口实现全部注册为映射器
只要指定了包,这个包下面的所有dao接口的配置文件都能够被指定
<!-- 将包内的映射器接口实现全部注册为映射器 -->
<mappers>
<package name="cn.edu.cxtc.dao"/>
</mappers>
**注:**使用方法二和方法三时:
* 接口和他的Mapper配置文件必须同名
* Mapper配置文件的包结构目录必须和dao接口的包目录相同,并且分级
8、作用域(Scope)和生命周期
作用域、生命周期是至关重要的,错误的使用会导致非常严重的并发问题。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ciuSkT6J-1590794861082)(C:\Users\kmkd\AppData\Roaming\Typora\typora-user-images\image-20200525190930584.png)]
SqlSessionFactoryBuilder
* 一旦创建了SqlSessionFactory,就不在需要它了
* 所以SqlSessionFactoryBuilder是一个局部变量
SqlSessionFactory
- 说白了就是可以想象为:数据库连接池
- SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
- 因此SqlSessionFactory的最佳作用域是应用作用域
- 最简单的就是使用单例模式或者静态单例模式,使他只创建一个实例
SqlSession
- 连接到连接池的一个请求
- SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
- 用完之后要赶紧关闭,否则资源被占用