MyBatis-03-简单配置MyBatis
Posted PrimaBruceXu——多看,多记,多做,多练
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis-03-简单配置MyBatis相关的知识,希望对你有一定的参考价值。
四、配置MyBatis
4.1 核心配置文件——mybatis-config.xml
-
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:
-
configuration(配置)
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- 数据库厂商标识(databaseIdProvider)
- 映射器(mappers)
-
编写核心配置文件时,必须按照顺序进行
4.2 属性(properties)
-
配置文件中的所有属性都可以在外部进行配置,并可以进行动态替换。
-
你既可以在典型的 Java 属性文件中配置这些属性,也可以在 properties 元素的子元素中设置。
-
示例:
- db.properties
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8 username=root password=123456
- mybatis-config.xml
<properties resource="db.properties"> <property name="password" value="111111"/> </properties> <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="${user}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments>
-
注意:如果配置文件中和xml标签中出现同名的属性,优先使用文件的中的值
4.3 类型别名(typeAliases)
-
类型别名可为 Java 类型设置一个缩写名字。
-
它仅用于 XML 配置,意在降低冗余的全限定类名书写。
-
示例:
-
mybatis-config.xml
<!--方式一--> <typeAliases> <typeAlias type="com.pbx.pojo.User" alias="BruceUser"/> </typeAliases> <!--方式二--> <typeAliases> <package name="com.pbx.pojo"/> </typeAliases>
-
方式一:
- 如果这样配置别名,那么可以在mapper.xml文件中任何需要使用
com.pbx.pojo.User
的地方使用BruceUser
- 如果这样配置别名,那么可以在mapper.xml文件中任何需要使用
-
方式二:
- 直接扫描包名情况下,默认别名为对应实体类的类名,首字母小写。如果实体类中使用了
@Alias(别名)
的注解,那么别名则为注解中定义的名称
- 直接扫描包名情况下,默认别名为对应实体类的类名,首字母小写。如果实体类中使用了
-
4.4 环境配置(environments)
-
MyBatis 可以配置成适应多种环境,这种机制有助于将 SQL 映射应用于多种数据库之中
-
尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。
-
创建指定环境的SQLSessionFactory实例:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, properties);
-
-
事务管理器(transactionManager)
- 在 MyBatis 中有两种类型的事务管理器(也就是 type="[JDBC|MANAGED]"):
- JDBC – 这个配置直接使用了 JDBC 的提交和回滚设施,它依赖从数据源获得的连接来管理事务作用域。
- MANAGED – 这个配置几乎没做什么。(一般不会使用)
-
数据源(dataSource)
- dataSource 元素使用标准的 JDBC 数据源接口来配置 JDBC 连接对象的资源。有三种内建的数据源类型(也就是 type="[UNPOOLED|POOLED|JNDI]")
4.5 映射器(mappers)
1. mappers标签
-
注册映射了SQL语句的文件
-
每个mapper.xml文件必须在mybatis-config.xml文件中注册
-
常用注册方式:
-
方式一:使用相对于类路径的资源引用
<mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <mapper resource="org/mybatis/builder/PostMapper.xml"/> </mappers>
-
方式二:使用映射器接口实现类的完全限定名
<mappers> <mapper class="org.mybatis.builder.AuthorMapper"/> <mapper class="org.mybatis.builder.BlogMapper"/> <mapper class="org.mybatis.builder.PostMapper"/> </mappers>
-
方式三:包扫描模式,注册一个包下面的所有mapper.xml文件
<mappers> <package name="org.mybatis.builder"/> </mappers>
-
方式二和方式三注册的mapper.xml文件需要遵守命名规范,不然会找不到对应的文件
- 使用和映射器接口实现类完全一样名称
-
2. mapper.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="org.mybatis.example.BlogMapper"> <select id="selectBlog" resultType="Blog"> select * from Blog where id = #{id} </select> </mapper>
-
namespace:用于标识唯一的mapper接口实现文件,值要为mapper接口文件的完全限定路径
-
id:需要绑定接口中的函数名
-
resultType:绑定函数的返回值类型
-
parameterType:参数类型
- 如果只有一个参数,可以省略返回值类型
- 如果使用实体类作为参数,请使用实体类中的属性作为参数名
- 如果使用map作为参数,请使用map中的key作为参数名(多个参数或者实体类中存在多个与业务操作无关的属性)
4.6 作用域(Scope)和生命周期
-
作用域和生命周期类别是至关重要的,错误的使用会导致非常严重的并发问题。
-
MyBatis运行流程图
-
SqlSessionFactoryBuilder (类似于JDBC中创建连接池的操作)
- 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。
- 最佳作用域是方法作用域(也就是局部方法变量)
-
SqlSessionFactory(类似于JDBC中的连接池)
- SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
- 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。
- 最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
-
SqlSession (类似于JDBC中的连接数据库)
- 每个线程都应该有它自己的 SqlSession 实例。
- SqlSession 的实例不是线程安全的
- 最佳的作用域是请求或方法作用域。
- 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。
- 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。
- 如果你现在正在使用一种 Web 框架,考虑将 SqlSession 放在一个和 HTTP 请求相似的作用域中。 换句话说,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。
- 这个关闭操作很重要,如果不及时关闭,会导致资源的浪费与性能的降低
-
总结
- SqlSessionFactoryBuilder在SqlSessionFactory被创建之后就可以嗝屁了
- SqlSessionFactory在应用运行期间有且只能存在一个
- SqlSession用完之后要养成随手关闭的习惯
以上是关于MyBatis-03-简单配置MyBatis的主要内容,如果未能解决你的问题,请参考以下文章
MYBATIS03_全局配置文件environmentspropertiesmappertypeAliassettings标签详解