1、介绍:
持久层框架,支持自定义SQL、存储过程以及高级映射。Mybatis几乎免除了所有的JDBC代码一设置参数和获取结果集的工作。可以通过简单地XML或者注解来哦诶之和映射原始类型、接口和Javapojo为数据库中的记录。
2、安装Mybatis:
要使用Mybatis的话只需将 [mybatis-x.x.x.jar] (Releases · mybatis/mybatis-3 · GitHub) 文件置于类路径(classpath)中即可。
还有一中就是,如果你通过Maven来构建项目,则需要配置xml文件,导入依赖:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>x.x.x</version> </dependency>
1、SqlSessionFactory:
每个Mybatis的应用都是以SqlSessionFactory的实例为核心的,而且SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder来获得。而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先配置的Configuration 实例来构建出SqISessionFactory 实例。
2、XMl文件中构建SQLSessionFactory:
第一种方法:类路径下的资源文件进行配置。
String resource = "org/mybatis/example/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
第二种:使用任意的输入流(InputSttream)实例,比如用文件路径字符串或者file://URL构造输入流。
xml文件配置中包含了对Mybatis系统的核心配置,包括数据库链接实例的数据源(DataSource)以及决定事物作用域和控制方式的事务管理器(TransactionManager)。environment 元素体中包含了事务管理和连接池的配置。mappers 元素则包含了一组映射器(mapper)
<?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> <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>
3、不使用XML构建SQLSessionFactory:
从java代码中创建配置
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource(); TransactionFactory transactionFactory = new JdbcTransactionFactory(); Environment environment = new Environment("development", transactionFactory, dataSource); Configuration configuration = new Configuration(environment); configuration.addMapper(BlogMapper.class); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
注意
configuration 添加了一个映射器类(mapper class)。映射器类是 Java 类,它们包含 SQL 映射注解从而避免依赖 XML 文件。不过,由于 Java 注解的一些限制以及某些 MyBatis 映射的复杂性,要使用大多数高级映射(比如:嵌套联合映射),仍然需要使用 XML 配置。有鉴于此,如果存在一个同名 XML 配置文件,MyBatis 会自动查找并加载它(在这个例子中,基于类路径和 BlogMapper.class 的类名,会加载 BlogMapper.xml)。
命名空间:为了减少输入量,MyBatis 对所有具有名称的配置元素(包括语句,结果映射,缓存等)使用了如下的命名解析规则。
-
全限定名(比如 “com.mypackage.MyMapper.selectAllThings)将被直接用于查找及使用。
-
短名称(比如 “selectAllThings”)如果全局唯一也可以作为一个单独的引用。 如果不唯一,有两个或两个以上的相同名称(比如 “com.foo.selectAllThings” 和 “com.bar.selectAllThings”),那么使用时就会产生“短名称不唯一”的错误,这种情况下就必须使用全限定名。
举例:都是一样,前者为xml配置,后者为java代码编写
<?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>
package org.mybatis.example; public interface BlogMapper { @Select("SELECT * FROM blog WHERE id = #{id}") Blog selectBlog(int id); }
3、配置
1.属性(properties)
可以在java属性文件中配置,也可在properties元素的子元素中配置
<properties resource="org/mybatis/example/config.properties"> <property name="username" value="dev_user"/> <property name="password" value="F2Fa3!33TYyg"/> </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>
上面的username和password会由properties元素中设置的相应的值来替换,driver和URL属性将会由config.properties文件中对应的值来替换。
还有一种方法就是在SQLSessionFactoryBuilder.build()方法中传入属性值。
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props); // ... 或者 ... SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);
属性不一定都在一个地方配置,若不在一个地方,则mybatis将会按照特定的顺序来进行加载:
-
首先读取在properties元素体内指定的属性
-
然后根据properties元素中的resource属性来读取类路径下的属性文件,或者根据url属性指定的路径来进行读取属性文件,并且覆盖之前读取过的同名属性。
-
最后 读取作文方法参数传递的属性,并覆盖之前读取过的同名属性。
【优先级】通过方法参数传递的属性具有最高优先级,resource/url属性中指定的配置文件次之,最低优先级的则是properties元素中指定的属性。
【可以为占位符指定默认值】
<dataSource type="POOLED"> <!-- ... --> <property name="username" value="${username:ut_user}"/> <!-- 如果属性 'username' 没有被配置,'username' 属性的值将为 'ut_user' --> </dataSource>
但是,我们要使用这个特性,就必须要添加特定的属性来开启这个特性。
<properties resource="org/mybatis/example/config.properties"> <!-- ... --> <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- 启用默认值特性 --> </properties>
【提示】如果你在属性名中使用了 ":"
字符(如:db:username
),或者在 SQL 映射中使用了 OGNL 表达式的三元运算符(如: ${tableName != null ? tableName : 'global_constants'}
),就需要设置特定的属性来修改分隔属性名和默认值的字符。例如:
<properties resource="org/mybatis/example/config.properties"> <!-- ... --> <property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/> <!-- 修改默认值的分隔符 --> </properties>
<dataSource type="POOLED"> <!-- ... --> <property name="username" value="${db:username?:ut_user}"/> </dataSource>
2.设置(settings)
这个部分很多,需要的小伙伴可以去搜一下
一个配置完整的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>
3.类型别名(typeAliases)
用于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>
当配置了上面之后,比如Blog可以用在任何使用domain.blog.Blog的地方。
4.类处理器(typeHandlers)
MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型
你可以重写已有的类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 具体做法为:实现 org.apache.ibatis.type.TypeHandler
接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler
, 并且可以(可选地)将它映射到一个 JDBC 类型。比如:
// ExampleTypeHandler.java @MappedJdbcTypes(JdbcType.VARCHAR) public class ExampleTypeHandler extends BaseTypeHandler<String> { @Override public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, parameter); } @Override public String getNullableResult(ResultSet rs, String columnName) throws SQLException { return rs.getString(columnName); } @Override public String getNullableResult(ResultSet rs, int columnIndex) t