1.1、configuration配置
-
- properties 属性
- settings 设置
- typeAliases 类型命名
- typeHandlers 类型处理器
- objectFactory 对象工厂
- plugins 插件
- environments 环境
- environment 环境变量
- transactionManager 事务管理器
- dataSource 数据源
- environment 环境变量
- databaseIdProvider 数据库厂商标识
- mappers 映射器
1.2、Mapper配置文件总览
mybatis-config_02.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"> <configuration> <!--属性--> <properties resource="jdbc.properties"/> <!--全局配置参数--> <settings> <setting name="defaultScriptingLanguage" value=""/> </settings> <!--类型别名--> <typeAliases> <!-- 单个别名定义 --> <typeAlias type="com.jdy.mybatis2020.bean.User" alias="user"/> <!--批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以)--> <package name="com.jdy.mybatis2020.bean"/> <!--<package name="其他包"/>--> </typeAliases> <!--类型处理器--> <typeHandlers> <typeHandler handler="org.apache.ibatis.type.InstantTypeHandler"/> <typeHandler handler="org.apache.ibatis.type.ZonedDateTimeTypeHandler"/> <typeHandler handler="org.apache.ibatis.type.YearTypeHandler"/> <typeHandler handler="org.apache.ibatis.type.YearMonthTypeHandler"/> </typeHandlers> <!--对象工厂--> <objectFactory type=""/> <!--插件--> <plugins> <plugin interceptor=""></plugin> </plugins> <!-- 和spring整合后 environments配置将废除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理--> <transactionManager type="JDBC"/> <!-- 数据库连接池--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClass}"/> <property name="url" value="${jdbc.jdbcUrl}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="sqlmap/user.xml"/> <mapper resource="sqlmap/userMapper.xml"/> </mappers> </configuration>
二、properties
mybatis可以使用properties来引入外部properties配置文件的内容
<!--resource:引入类路径下的资源--> <properties resource=""/> <!--url:引入网络路径或者磁盘路径下的资源--> <properties url=""/>
三、settings
settings包含很多重要的设置项,name:设置项名,value:设置项取值
<settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
Description(描述) | Valid Values(验证值组) | Default(默认值) | |
---|---|---|---|
cacheEnabled | 在全局范围内启用或禁用缓存配置任何映射器在此配置下。 | true|false | TRUE |
lazyLoadingEnabled | 在全局范围内启用或禁用延迟加载。禁用时,所有协会将热加载。 | true|false | TRUE |
aggressiveLazyLoading | 启用时,有延迟加载属性的对象将被完全加载后调用懒惰的任何属性。 否则,每一个属性是按需加载。 |
true|false | TRUE |
multipleResultSetsEnabled | 允许或不允许从一个单独的语句(需要兼容的驱动程序)要返回多个结果集。 | true|false | TRUE |
useColumnLabel | 使用列标签代理列名。不同的驱动有不同的行为。 参考驱动文档或测试两种方法来决定你的驱动程序的行为如何。 |
true|false | TRUE |
useGeneratedKeys | 允许JDBC支持生成的密钥。兼容的驱动程序是必需的。此设置强制生成的键被使用, 如果设置为true,一些驱动会不兼容性,但仍然可以工作。 |
true、false | FALSE |
autoMappingBehavior | 指定MyBatis的应如何自动映射列到字段/属性。NONE自动映射。 PARTIAL只会自动映射结果没有嵌套结果映射定义里面。 FULL会自动映射的结果映射任何复杂的(包含嵌套或其他)。 |
NONE, PARTIAL, FULL | PARTIAL |
defaultExecutorType | 配置默认执行人。SIMPLE执行人确实没有什么特别的。 REUSE执行器重用准备好的语句。 BATCH执行器重用语句和批处理更新。 |
SIMPLE REUSE BATCH | SIMPLE |
defaultStatementTimeout | 设置驱动程序等待一个数据库响应的秒数。 | Any positive integer | Not Set (null) |
safeRowBoundsEnabled | 允许使用嵌套的语句RowBounds。 | true、false | FALSE |
mapUnderscoreToCamelCase | 从经典的数据库列名A_COLUMN启用自动映射到骆驼标识的经典的Java属性名aColumn。 | true、false | FALSE |
localCacheScope | MyBatis的使用本地缓存,以防止循环引用, 并加快反复嵌套查询。默认情况下(SESSION)会话期间执行的所有查询缓存。 如果localCacheScope=STATMENT本地会话将被用于语句的执行, 只是没有将数据共享之间的两个不同的调用相同的SqlSession。 |
SESSION|STATEMENT | SESSION |
dbcTypeForNull | 指定为空值时,没有特定的JDBC类型的参数的JDBC类型。 有些驱动需要指定列的JDBC类型,但其他像NULL,VARCHAR或OTHER的工作与通用值。 |
JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER |
OTHER |
lazyLoadTriggerMethods | 指定触发延迟加载的对象的方法。 | A method name list separated by commas | equals,clone,hashCode,toString |
defaultScriptingLanguage | 指定所使用的语言默认为动态SQL生成。 | A type alias or fully qualified class name | org.apache.ibatis.scripting. xmltags.XMLDynamicLanguageDriver |
callSettersOnNulls | 指定如果setter方法或地图的put方法时,将调用检索到的值是null。它是有用的, 当你依靠Map.keySet()或null初始化。注意原语(如整型,布尔等)不会被设置为null。 |
true|false | FALSE |
logPrefix | 指定的前缀字串,MyBatis将会增加记录器的名称。 | Any String | Not set |
logImpl | 指定MyBatis的日志实现使用。如果此设置是不存在的记录的实施将自动查找。 | SLF4J 、 LOG4J 、 LOG4J2 、 JDK_LOGGING 、 COMMONS_LOGGING 、 STDOUT_LOGGING 、 NO_LOGGING |
Not set |
proxyFactory | 指定代理工具,MyBatis将会使用创建懒加载能力的对象。 | CGLIB|JAVASSIST |
四、typeAliases-别名处理器
在mapper.xml中,定义很多的statement,statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。
如果在指定类型时输入类型全路径,不方便进行开发,可以针对parameterType或resultType指定的类型定义一些别名,在mapper.xml中通过别名定义,方便开发。
4.1、mybatis支持别名
值得注意的是, MyBatis 已经 为许多常见的 Java 类型内建了相应的类型别名。它们都是 大小写不敏感 的 ,我们在起别名的时候千万不要占用已有的别名。
4.2、自定义别名
在mybatis-config_01.xml中配置:
<typeAliases> <!-- 单个别名定义 --> <typeAlias type="com.jdy.mybatis2020.bean.User" alias="user"/> <!--批量别名定义,扫描整个包下的类,别名为类名(首字母大写或小写都可以)--> <package name="com.jdy.mybatis2020.bean"/> </typeAliases>
批量起别名的情况下,使用@Alias注解为某个类型指定新的别名
@Alias("itms") public class Items {}
注解的优先级高。
五、typeHandlers 类型处理器
无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。
自定义类型处理器
我们可以重写类型处理器或创建自己的类型处理 器来处理不支持的或非标准的类型。
步骤:
- 实现org.apache.ibatis.type.TypeHandler接口或 者继承org.apache.ibatis.type.BaseTypeHandler
- 指定其映射某个JDBC类型(可选操作)
- 在mybatis全局配置文件中注册
六、plugins 插件
插件是MyBatis提供的一个非常强大的机制,我们可以通过插件来修改MyBatis的一些核心行为。插件通过动态代理机制,可以介入四大对象的任何一个方法的执行。
-
-
Executor (update, query, flushStatements, commit, rollback,getTransaction, close, isClosed)
-
ParameterHandler (getParameterObject, setParameters)
-
ResultSetHandler (handleResultSets, handleOutputParameters)
-
StatementHandler (prepare, parameterize, batch, update, query)
-
七、environments
MyBatis可以配置多种环境,比如开发、测试和生产环境需要有不同的配置,每种环境使用一个environment标签进行配置并指定唯一标识符。可以通过environments标签中的default属性指定一个环境的标识符来快速的切换环境。
environment-指定具体环境:配置一个具体的环境信息;必须有两个标签;id代表当前环境的唯一标识。transactionManager:事务管理器。
-
-
-
transactionManager和dataSource都必须有
-
-
transactionManager
-
type 取值JDBC | MANAGED | 自定义
-
JDBC:使用了JDBC 的提交和回滚设置,依赖于从数据源得到的连接来管理事务范围。 JdbcTransactionFactory
-
MANAGED:不提交或回滚一个连接、让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 ManagedTransactionFactory
-
自定义:实现TransactionFactory接口,type=全类名/别名
-
-
-
DataSource
-
type: UNPOOLED | POOLED | JNDI | 自定义
-
UNPOOLED:不使用连接池, UnpooledDataSourceFactory
-
POOLED:使用连接池, PooledDataSourceFactory
-
JNDI: 在EJB 或应用服务器这类容器中查找指定的数据源
-
自定义:实现DataSourceFactory接口,定义数据源的获取方式。
-
-
实际开发中我们使用Spring管理数据源,并进行事务控制的配置来覆盖上述配置
八、databaseIdProvider 环境
<databaseIdProvider type="DB_VENDOR"> <!-- 为不同的数据库厂商起别名 --> <property name="MySQL" value="mysql"/> <property name="Oracle" value="oracle"/> <property name="SQL Server" value="sqlserver"/> </databaseIdProvider>
-
Type: DB_VENDOR
使用MyBatis提供的VendorDatabaseIdProvider解析数据库厂商标识。也可以实现DatabaseIdProvider接口来自定义。
-
Property-name:数据库厂商标识
-
Property-value:为标识起一个别名,方便SQL语句使用databaseId属性引用
-
会通过 DatabaseMetaData#getDatabaseProductName() 返回的字符串进行设置。由于通常情况下这个字符串都非常长而且相同产品的不同版本会返回不同的值,所以最好通过设置属性别名来使其变短。
-
MyBatis匹配规则如下
-
如果没有配置databaseIdProvider标签,那么databaseId=null
-
如果配置了databaseIdProvider标签,使用标签配置的name去匹配数据库信息,匹配上设置databaseId=配置指定的值,否则依旧为null
-
如果databaseId不为null,他只会找到配置databaseId的sql语句
-
-
九、mappers-映射器
Mapper配置的几种方法:
-
<mapper resource=" "/>
使用相对于类路径classpath下的资源,如:<mapper resource="sqlmap/user.xml" />
-
<mapper url=" " />
使用完全限定路径如:<mapper url="file:///E:suning_workspacejdy-testmybaties-2020srcmain esourcessqlmapuser.xml" />
-
<mapper class=" " />
使用mapper接口类路径,如:<mapper class="mapper.UserMapper"/>
注意:有sql映射文件,映射文件名必须和接口同名,并且放在与接口同一目录下;没有sql映射文件,所有的sql都是利用注解写在接口上;
推荐:比较重要的,复杂的Dao接口我们来写sql映射文件。不重要,简单的Dao接口为了开发快速可以使用注解; -
注册指定包下的所有mapper接口,如:<package name="com.jdy.mybatis.mapper"/>
<mappers> <mapper class="com.jdy.mybatis2020.dao.intf.UserQuery"/> </mappers>
public interface UserQuery { @Select("select * from user where id = #{id}") public User queryUser(String id); }
- 测试
@Test public void test_Method09() { SqlSession sqlSession = sqlSessionFactory.openSession(); UserQuery dao = sqlSession.getMapper(UserQuery.class); User user = dao.queryUser("2"); System.out.println("user = " + user); }