1. Mybatis 使用基本流程
-
根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象
String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlFactory = new SqlSessionFactoryBuilder().build(inputStream);
这里是根据xml配置文件创建SqlSessionFactory 工厂的,也可以使用纯java的方式创建
-
全局配置文件中有数据源和事务配置
-
编写sql映射文件,配置每一个sql,以及sql的封装规则
-
将sql配置文件注册到全局配置文件中
-
从SqlSessionFactory 工厂获取到sqlSession对象,使用它来执行增删改查(有两种方式)
2. 实现增删改查的两种方式
- 直接使用sqlSession 对象
SqlSession session = sqlSessionFactory.openSession();
try {
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {
session.close();
}
其中"org.mybatis.example.BlogMapper.selectBlog" 是sql映射文件的 namespace + id,第二个参数是查询语句参数
- 使用接口的方式
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);
} finally {
session.close();
}
其中BlogMapper.class 是与sql映射文件对应的接口
3. 全局xml配置文件
- settings
这是mybatis中极为重要的调整设置,它们会改变mybatis的运行时行为。下面是一个完整的settings 元素示例:
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
- typeAliases
类型别名是为java类型设置一个短的名字。它只和xml配置有关,存在的意义仅在于减少完全限定类名的冗余。例如:
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author"/>
<typeAlias alias="Blog" type="domain.blog.Blog"/>
<typeAlias alias="Comment" type="domain.blog.Comment"/>
<typeAlias alias="Post" type="domain.blog.Post"/>
<typeAlias alias="Section" type="domain.blog.Section"/>
<typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>
也可以指定一个包名:
<typeAliases>
<package name="domain.blog"/>
</typeAliases>
这样,“domain.blog” 包下所有类的别名为首字母小写的非限定类名。
- typeHandlers
typeHandlers 用于指定java 类型与数据库类型之间转换的处理器。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 可以配置成适应多种环境,不过要记住:尽管可以配置多个环境,每个SqlSessionFactory 实例只能选择其一。所以,如果要连接两个数据库,就必须创建两个SqlSessionFactory 实例,每个数据库对应一个。即,每个数据库对应一个SqlSessionFactory 实例
-
每个环境配置必须要有transactionManager 和 dataSource 标签。一个环境配置实例如下:
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"> <property name="..." value="..."/> </transactionManager> <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>
-
-
databaseIdProvider
-
mybatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的databaseId 属性。mybatis会加载不带databaseId 属性和带有匹配当前数据库databaseId 属性的所有语句。如果同时找到带有databaseId 和不带有databaseId 属性的相同语句,则后者会被抛弃。为支持多厂商特性只要像下面这样,在mybatis-config.xml 文件中加入databaseIdProvider 即可:
<databaseIdProvider type="DB_VENDOR" />
“DB_VENDOR” 是mybatis 自带的别名。
-
厂商别名配置
<databaseIdProvider type="DB_VENDOR"> <property name="SQL Server" value="sqlserver"/> <property name="DB2" value="db2"/> <property name="Oracle" value="oracle" /> </databaseIdProvider>
其中 name 属性表示厂商默认databaseId , value 属性表示配置的别名。
- mappers
mapper 标签用于告诉mybatis 映射文件在哪里,有如下几种方式:
-
相对于类路径的资源引用
<mappers> <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> <mapper resource="org/mybatis/builder/BlogMapper.xml"/> <mapper resource="org/mybatis/builder/PostMapper.xml"/> </mappers>
-
使用完全限定资源定位符(URL),此种方式一般用于网络映射文件或磁盘映射文件的定位
<mappers> <mapper url="file:///var/mappers/AuthorMapper.xml"/> <mapper url="file:///var/mappers/BlogMapper.xml"/> <mapper url="file:///var/mappers/PostMapper.xml"/> </mappers>
-
使用 class 属性实现接口注册
<mappers> <mapper class="org.mybatis.builder.AuthorMapper"/> <mapper class="org.mybatis.builder.BlogMapper"/> <mapper class="org.mybatis.builder.PostMapper"/> </mappers>
这种情况下,映射文件要和接口文件同名且处于同一目录下,或者不要映射文件直接在接口上使用注解开发。
-
使用 package 属性将包内的接口全部注册为映射器
<mappers> <package name="org.mybatis.builder"/> </mappers>
这种情况下的规则同 class。