摘要:Mybatis笔记_03-2021-06-14,笔记内容均为观看B站视频@狂神说
1.核心配置文件(mybatis-config.xml)
核心配置文件中,标签的引入有固定的前后顺序,但不一定要把所有便签都引入,按照顺序引入即可:
<!--The content of element type "configuration" must match "(
properties?,
settings?,
typeAliases?,
typeHandlers?,
objectFactory?,
objectWrapperFactory?,
reflectorFactory?,
plugins?,
environments?,
databaseIdProvider?,
mappers?
)".-->
2.属性(properties)
- 这些属性可以在外部进行配置,并可以进行动态替换。
- 可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/book?useSSL=false&useUnicode=true&characterEncoding=UTF-8
username=root
password=root
- 异常处理:读取db.properties出现异常,报错ClassException Not Found: driver/url/key;该异常是因为读取不到.properties文件的第一行导致;
- 解决方法:
3.设置(settings)
<settings>
<!--全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。-->
<setting name="cacheEnabled" value="true"/>
<!--懒加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--其他设置-->
</settings>
4.类型别名(typeAliases)
作用:
- 1.类型别名可为 Java 类型设置一个缩写名字;
- 2.它仅用于 XML 配置,意在降低冗余的全限定类名书写。
实现方法:
-
1.全类名的类型,type=“全类名”,alias=“自定义别名”;
-
2.指定包名,那么=“指定的实体类包名”,alias:如果没有注解,别名默认为实体类名,不区分大小写;
-
3.注解提供别名,alias:注解值;
<!--类型别名-->
<typeAliases>
<!--1.全类名的类型,type="全类名",alias="自定义别名";-->
<typeAlias alias="user" type="com.riove.pojo.User"/>
<!--2.指定包名,那么="指定的实体类包名",alias:如果没有注解,别名默认为实体类名,不区分大小写;-->
<package name="com.riove.pojo"/>
<!--3.注解提供别名,alias:注解值;-->
<package name="com.riove.pojo"/>
</typeAliases>
5.环境(environments)
环境:
- 1.environments可以有多个环境,但在进行实例时只能选择一个默认环境,只有默认环境会生效;
- 2.尽管可以配置多个环境,但每个 SqlSessionFactory实例只能选择一种环境;
- 3.两个数据库,就需要创建两个 SqlSessionFactory实例,每个数据库对应一个,而如果是三个数据库,就需要三个实例;
<!--environments可以有多个环境,但在进行实例时只能选择一个默认环境,只有默认环境会被启用-->
<environments default="mysql">
<environment id="mysql">
<!--知识点:transactionManager,事务管理:JDBC|MANAGED-->
<transactionManager type="JDBC"/>
<!--知识点:dataSource,数据源:UNPOOLED|POOLED|JNDI-->
<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>
<environment id="sqlserver">
<transactionManager type="" />
<dataSource type="">
<property name="driver" value=""/>
<property name="url" value=""/>
<property name="username" value=""/>
<property name="password" value=""/>
</dataSource>
</environment>
</environments>
6.映射器(mappers)
映射器作用:
- 1.告诉MyBatis 到哪里去找映射文件;
- 2.通过映射文件找到SQL 映射语句;
实现方法:
- 1.使用相对于类路径的资源引用,注意:路径中的符号应为"/";
- 2.使用映射器接口实现类的完全限定类名,注意:接口和Mapper配置文件必须同名并且在同一个包下,如:接口:UserMapper.java,mapper文件:UserMapper.xml;
- 3.将包内的映射器接口实现全部注册为映射器,注意:接口和Mapper配置文件必须同名并且在同一个包下;
- 4.建议每一个mappers文件都进行一一对应的注册;
<!--Here every mapper must register!-->
<!-- 使用相对于类路径的资源引用 -->
<!--<mappers>
<mapper resource="com/riove/dao/UserMapper.xml"/>
</mappers>-->
<!-- 使用映射器接口实现类的完全限定类名 -->
<!--<mappers>
<mapper class="com.riove.dao.UserMapper"/>
</mappers>-->
<!--将包内的映射器接口实现全部注册为映射器-->
<mappers>
<package name="com.riove.dao"/>
</mappers>
7.作用域(Scope)和生命周期
-
不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
-
获取SqlSessionFactory实例的基本流程。
-
SqlSessionFactoryBuilder
SqlSessionFactoryBuilder:建造者模式,用来创建工厂,可以创建多个工厂
- 一旦创建了 SqlSessionFactory,就不再需要
- 最佳作用域是方法作用域(也就是局部方法变量)
- 可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory实例
- 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例
- 最佳作用域是应用作用域,最简单的就是使用单例模式或者静态单例模式
- SqlSession的实例不是线程安全的,因此是不能被共享的
- 最佳的作用域是请求或方法作用域
- 重点:完成一次请求或调用,应进行关闭:sqlSession.close(); ,避免资源的占用、浪费。