01_Mybatis基础
参考:Mybatis 3.4.6中文开发手册
开源项目下载网址:github.com/mybatis/mybatis-3/release
官方文档网址: www.mybatis.org/mybatis-3
Mybatis原始apache的开源项目iBatis,后来迁移到google code,改名Mybatis。iBatis来源:internet+abates,一个基于java的持久层框架:SQL maps +DAO(Data Access Objects)。
Mybatis:支持定制化SQL、存储过程和高级映射。支持使用简单的XML或注解配置和映射原生信息,将接口和Java的POJO(Plain Old Java Object 普通Java对象)映射成数据库中记录。
每个Mybatis应用程序主要使用SqlSessionFactory实例(通过SqlSessionFactoryBuilder从一个XML配置文件或预定义的配置类的实例获取)。
XML文件构建SqlSessionFactory实例:Mybatis的使用类Resource,有很多方法,可方便从类路径及其他位置加载资源。
从XML中构建SqlSessionFacoty:
1、每个基于Mybatis应用都是以一个SqlSessionFactory实例为中心;
2、每个SqlSessionFactory实例可以通过SqlSesssionFactoryBuilder获得(从配置文件或一个预先定制的Configuration实例构建)。
从XML文件构建SqlSessionFactory实例的方法:建议使用类路径下的资源文件进行配置,也可以使用任意输入流实例(字符串形式文件路径或file:// 文件路径来配置)
Resource工具类,包含一些实用方法,可以从classpatch或其他位置加载资源文件。
String resource = "org/mybatis/example/mybatis-config.xml"; InputStream InputStream = Resouces.getResourceAsStream(resource); SqlSessionFactory SqlSessionFactory = new SqlSessionFactoryBuilder().build(InputStream);
XML配置文件包含了mybatis系统的核心设置:
DataSource(数据源): 获取数据库连接实例
TransactionManager(事务管理器): 决定事物作用域和控制方式
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org/DTD Cconfig 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" > <configuration> <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="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <Mappers> <mapper resource="org/mybatis/example/BlogMapper.xml" /> </Mappers> </configuration>
从SqlSessionFactory获取SqlSession:
SqlSession完全包含了面向数据库执行SQL需要的所有方法;可通过SqlSession实例直接执行已映射的SQL语句
SqlSession session = sqlSessionFactory.openSession(); try{ BlogMapper mapper = session.getMapper(BlogMapper.class); Blog blog = mapper.selectBlog(101); } finally { session.close(); }
内部执行逻辑; <Mapper namesapce= "org.mybatis.example.BlogMapper" > <select id="selectBlog" resultType="Blog" > select * from Blog where id=#{id} </select> </Mapper>
作用域和生命周期
依赖注入框架可创建线程安全的、基于事物的SqlSession和映射器并将它们注入到你的bean中。与spring集成Mybatis-spring
SqlSessionFactoryBuilder:
一旦创建完SqlSessionFactory后就不再需要,因为最佳作用域是方法作用域(局部变量),可以重用创建多个SqlSessionFactory实例。
SqlSessionfactory
一旦被创建就应该程序运行期间一直存在,没有任何理由对其清除或重建。
最佳作用域:应用作用域,比如单例模式
SqlSession
每个线程都应该有自己的SqlSession实例。SqlSession实例线程不安全。
最佳作用域:请求或方法作用域,不能共享。
每次收到请求,新建Session,用完关闭。比如每次HTTP请求,都可以打开一个SqlSession,执行,然后关闭。
SqlSession SqlSession = sqlSessionFactory.openSession(); try{ // do work } finally { session.close(); }
映射器Mapper Instance
映射器是创建用来绑定映射语句的接口;映射器接口实例从SqlSession获取。
最佳作用域是方法作用域。,不需要显式关闭映射器实例。
SqlSession SqlSession = sqlSessionFactory.openSession(); try{ BlogMapper mapper = session.getMapper(BlogMapper.class); // do work } finally { session.close(); }
XML配置文件
Mybatis配置文件包含影响Mybatis行为的Settings和properties信息。
文档顶层结构如下:
Configuration
properties属性
settings设置
typeAlias类型别名
typeHandlers类型处理器
objectFactory 对象工厂
plugins插件
enviroments环境
environment环境变量
transactionManager 事物处理器
dataSource 数据源
databaseProvider 数据库厂商标识
mappers映射器
properties:
这些属性都是可外部配置且可动态替换的,既可以典型Java属性文件中配置,也可通过properties元素的子元素来传递
<properties resource="org/mybatis/example/config.properties" > <property name="username" value="dev_user" /> <property name="password" value="123456" /> </properties> <dataSource type="POOLED" > <property name="driver" value="${driver}" /> <property name="url" value="${url}" /> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource>
属性也可以被传递到 SqlSessionFactoryBuilder().build(reader, props);
sqlSessionFactory factory = new sqlSessionFactoryBuilder().build(reader, props);
...
sqlSessionFactory factory = new sqlSessionFactoryBuilder().build(reader, enviroment, props);
如果属性不只一个地方进行了配置,则mybatis按照如下顺序来加载
1、 properties元素体内指定的属性先被读取;
2、 根据properties元素中resource属性读取类路径下属性文件或根据url属性指定的路径读取属性文件,并覆盖已读取的同名属性
3、 读取方法参数传递的属性,并覆盖已读取的同名属性
优先级从高到低: 方法传递参数->resource/url指定的配置文件->properties属性中属性
Settings
改变mybatis运行时行为
cacheEnabled 所有映射器中配置的缓存全局开关 true/false 默认值 true
lazyLoadingEnabled 延迟加载的全局开关。开启时所有关联对象都会延迟加载 默认值false
aggressiveLazyLoading 开启时,任何方法调用都会加载改对象的所有属性,否则每个属性按需加载 默认值 false
useGenerateKeys 允许JDBC支持自动生成主键。如设置为true,则该配置强制使用自动生成主键 默认值false
typeAlias
<typeAliases>
<typeAlias alias="Author" type="domain.blog.Author" />
</typeAliases>
也可以指定一个包名,Mybatis会在包名下面搜索需要的Java Bean
<typeAliases>
<package name="domain.blog" />
</typeAliases>
每一个在上述包中Java bean,在没有注解情况下,会使用bean的首字母小写的非限定类名作为别名。如 domain.blog.Author别名author。
使用注解设置别名
@Alias(“author”)
常见Java类型对应的类型别名
typeHandlers
无论是Mybatis在预处理PreparedStatement设置一个参数,还是结果集中取出一个值,都会用类型处理器将过去的值以合适方式转换成Java类型
默认的类型处理器
BooleanTypeHandler java.lang.Boolean JDBC类型boolean
StringTypeHandler java.lang.String JDBC类型CHAR,VARCHAR
DataTypeHandler java.util.Data JDBC类型:TIMESTAMP
重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类型
实现 org.apache.ibatis.type.TypeHandler接口
或继承类 org.apache.ibatis.type.BaseTypeHandler,然后选择性映射到一个JDBC类型