MyBatis 快速入门和重点详解

1.定义

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

官网

http://www.mybatis.org/

2.使用 MyBatis

  • 编程式

即不与其他框架集成使用mybatis。
入门实例参考:http://www.mybatis.org/mybatis-3/zh/getting-started.html
别人自己的实例:https://github.com/ljmomo/learn-mybatis mybatis-demo 模块

  • 集成式 managed 集成到 spring

集成Spring http://www.mybatis.org/spring/zh/
工作中使用一般是 集成式 managed 集成到spring 并且使用
MyBatis Generator 生成生成 Bean 和 Mapper。
在IDEA中如何使用可以参考另一篇文章: IDEA中使用MyBatis Generator

3.作用域(Scope)和生命周期

类名称 SCOPE
SqlSessionFactoryBuilder method
SqlSessionFactory application
SqlSession request/method (可以认为是线程级)
Mapper method

详细说明:http://www.mybatis.org/mybatis-3/zh/getting-started.html

4.mybatis config文件

  • typeAliases

类型别名是为 Java 类型设置一个短的名字。
它只和 XML 配置有关,存在的意义仅在于用来减少类完全限定名的冗余。例如:

  1. <typeAliases>
  2. <typeAlias alias="Author" type="domain.blog.Author"/>
  3. <typeAlias alias="Blog" type="domain.blog.Blog"/>
  4. <typeAlias alias="Comment" type="domain.blog.Comment"/>
  5. <typeAlias alias="Post" type="domain.blog.Post"/>
  6. <typeAlias alias="Section" type="domain.blog.Section"/>
  7. <typeAlias alias="Tag" type="domain.blog.Tag"/>
  8. </typeAliases>
  • typeHandlers

无论是 MyBatis在预处理语句(PreparedStatement)中设置一个参数时,
还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。

你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。
具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口,
或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler,
然后可以选择性地将它映射到一个 JDBC 类型。比如:

  1. @MappedJdbcTypes(JdbcType.VARCHAR)
  2. public class JunliTypeHandler extends BaseTypeHandler<String> {
  3. @Override
  4. public void setNonNullParameter(PreparedStatement preparedStatement, int i, String s, JdbcType jdbcType) throws SQLException {
  5. preparedStatement.setString(i, s + "LIJUN");
  6. }
  7. @Override
  8. public String getNullableResult(ResultSet resultSet, String s) throws SQLException {
  9. return resultSet.getString(s)+"LIJUN";
  10. }
  11. @Override
  12. public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
  13. return resultSet.getString(i);
  14. }
  15. @Override
  16. public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
  17. return callableStatement.getString(i);
  18. }
  19. }
  1. <!-- mybatis-config.xml -->
  2. <typeHandlers>
  3. <typeHandler handler="com.junli.mybatis.demo.mybatis.JunliTypeHandler"/>
  4. </typeHandlers>
  1. @MappedJdbcTypes(JdbcType.VARCHAR) <br />使用这个的类型处理器将会覆盖已经存在的处理 Java String 类型属性<br />和 VARCHAR 参数及结果的类型处理器。

preparedStatement.setString(i, s + “LIJUN”);
表示在所有String类型后面加上 LIJUN
但是有时候我们只是想特定的字段加上LIJUN。
可以如下配置(mybatis-config.xml 就不需要了):

  1. //插入
  2. insert into test (id, nums, name)
  3. values (#{id,jdbcType=INTEGER},
  4. #{nums,jdbcType=INTEGER},
  5. #{name,jdbcType=VARCHAR,
  6. typeHandler=com.junli.mybatis.demo.mybatis.JunliTypeHandler}
  7. )
  8. //返回
  9. <resultMap id="BaseResultMap" type="com.junli.mybatis.beans.Test">
  10. <id column="id" jdbcType="INTEGER" property="id" />
  11. <result column="nums" jdbcType="INTEGER" property="nums" />
  12. <result column="name" jdbcType="VARCHAR" property="name"
  13. typeHandler="com.junli.mybatis.demo.mybatis.JunliTypeHandler"/>
  14. </resultMap>
  • 插件(plugins)

MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。
默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
- Executor (update, query, flushStatements, commit, rollback,getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)

下面通过自定义插件来打印出查询的sql语句:

  1. @Intercepts({@Signature(type = Executor.class,
  2. method = "query",
  3. args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})
  4. public class JunliPlugin implements Interceptor {
  5. @Override
  6. public Object intercept(Invocation invocation) throws Throwable {
  7. MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
  8. BoundSql boundSql = mappedStatement.getBoundSql(invocation.getArgs()[1]);
  9. System.out.println(String.format("plugin output sql = %s , param=%s", boundSql.getSql(),boundSql.getParameterObject()));
  10. return invocation.proceed();
  11. }
  12. @Override
  13. public Object plugin(Object o) {
  14. return Plugin.wrap(o,this);
  15. }
  16. @Override
  17. public void setProperties(Properties properties) {
  18. }
  19. }

配置插件:

  1. <plugins>
  2. <plugin interceptor="com.junli.mybatis.demo.mybatis.JunliPlugin"/>
  3. </plugins>
  • 映射器(mappers)

既然 MyBatis 的行为已经由上述元素配置完了,我们现在就要定义 SQL 映射语句了。
但是首先我们需要告诉 MyBatis 到哪里去找到这些语句。
Java 在自动查找这方面没有提供一个很好的方法,
所以最佳的方式是告诉 MyBatis 到哪里去找映射文件。
你可以使用相对于类路径的资源引用,或完全限定资源定位符(包括 file:/// 的 URL),
或类名和包名等。例如:

  1. <mappers>
  2. <mapper resource="xml/TestMapper.xml"/>
  3. <mapper resource="xml/PostsMapper.xml"/>
  4. </mappers>


详细的mybatis config 参考官网:http://www.mybatis.org/mybatis-3/zh/configuration.html