千家信息网

Mybatis源码怎么写

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,Mybatis源码怎么写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。mybatis官方demo代码如下import o
千家信息网最后更新 2025年02月01日Mybatis源码怎么写

Mybatis源码怎么写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

mybatis官方demo代码如下

import org.apache.ibatis.mapping.Environment;import org.apache.ibatis.session.Configuration;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.apache.ibatis.transaction.TransactionFactory;import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;import javax.sql.DataSource;public class Mybatis {    public static void main(String[] args) {        /*配置数据源*/        DataSource dataSource=null;        /*配置事务*/        TransactionFactory transactionFactory = new JdbcTransactionFactory();        /*数据源与事务组合配置类*/        Environment environment = new Environment("development", transactionFactory, dataSource);        /*配置类构造器*/        Configuration configuration = new Configuration(environment);        /*SqlSession工厂类*/        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);        SqlSession sqlSession =  sqlSessionFactory.openSession();        sqlSession.update("");    }}

DataSource数据源

TransactionFactory 事务工厂接口,源码如下,主要的作用构造事务的配置信息

/** *    Copyright 2009-2015 the original author or authors. * *    Licensed under the Apache License, Version 2.0 (the "License"); *    you may not use this file except in compliance with the License. *    You may obtain a copy of the License at * *       http://www.apache.org/licenses/LICENSE-2.0 * *    Unless required by applicable law or agreed to in writing, software *    distributed under the License is distributed on an "AS IS" BASIS, *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *    See the License for the specific language governing permissions and *    limitations under the License. */package org.apache.ibatis.transaction;import java.sql.Connection;import java.util.Properties;import javax.sql.DataSource;import org.apache.ibatis.session.TransactionIsolationLevel;/** * Creates {@link Transaction} instances. * * @author Clinton Begin */public interface TransactionFactory {  /**   * Sets transaction factory custom properties.   * @param props   */  void setProperties(Properties props);  /**   * Creates a {@link Transaction} out of an existing connection.   * @param conn Existing database connection   * @return Transaction   * @since 3.1.0   */  Transaction newTransaction(Connection conn);    /**   * Creates a {@link Transaction} out of a datasource.   * @param dataSource DataSource to take the connection from   * @param level Desired isolation level   * @param autoCommit Desired autocommit   * @return Transaction   * @since 3.1.0   */  Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);}

主要的实现类有JdbcTransactionFactory和ManagedTransactionFactory,两者最大的区别是ManagedTrandactionFactory在关闭时会多一个是否关闭数据源的功能,JdbcTransactionFactory是一定会关闭,查看对应的实现主法

JdbcTransaction

  @Override  public void close() throws SQLException {    if (connection != null) {      resetAutoCommit();      if (log.isDebugEnabled()) {        log.debug("Closing JDBC Connection [" + connection + "]");      }      connection.close();    }  }

ManagedTransaction

  public void close() throws SQLException {    if (this.closeConnection && this.connection != null) {      if (log.isDebugEnabled()) {        log.debug("Closing JDBC Connection [" + this.connection + "]");      }      this.connection.close();    }  }
package org.apache.ibatis.transaction.jdbc;import java.sql.Connection;import java.util.Properties;import javax.sql.DataSource;import org.apache.ibatis.session.TransactionIsolationLevel;import org.apache.ibatis.transaction.Transaction;import org.apache.ibatis.transaction.TransactionFactory;/** * Creates {@link JdbcTransaction} instances. * * @author Clinton Begin * * @see JdbcTransaction */public class JdbcTransactionFactory implements TransactionFactory {  @Override  public void setProperties(Properties props) {  }  @Override  public Transaction newTransaction(Connection conn) {    return new JdbcTransaction(conn);  }  @Override  public Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) {    return new JdbcTransaction(ds, level, autoCommit);  }}
package org.apache.ibatis.transaction.managed;import java.sql.Connection;import java.util.Properties;import javax.sql.DataSource;import org.apache.ibatis.session.TransactionIsolationLevel;import org.apache.ibatis.transaction.Transaction;import org.apache.ibatis.transaction.TransactionFactory;/** * Creates {@link ManagedTransaction} instances. * * @author Clinton Begin * * @see ManagedTransaction */public class ManagedTransactionFactory implements TransactionFactory {  private boolean closeConnection = true;  @Override  public void setProperties(Properties props) {    if (props != null) {      String closeConnectionProperty = props.getProperty("closeConnection");      if (closeConnectionProperty != null) {        closeConnection = Boolean.valueOf(closeConnectionProperty);      }    }  }  @Override  public Transaction newTransaction(Connection conn) {    return new ManagedTransaction(conn, closeConnection);  }  @Override  public Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) {    // Silently ignores autocommit and isolation level, as managed transactions are entirely    // controlled by an external manager.  It's silently ignored so that    // code remains portable between managed and unmanaged configurations.    return new ManagedTransaction(ds, level, closeConnection);  }}

有了数据源就可以配置环境类的构造方式了,Environment源码如下,id主要的作用是区别于环境

/** *    Copyright 2009-2015 the original author or authors. * *    Licensed under the Apache License, Version 2.0 (the "License"); *    you may not use this file except in compliance with the License. *    You may obtain a copy of the License at * *       http://www.apache.org/licenses/LICENSE-2.0 * *    Unless required by applicable law or agreed to in writing, software *    distributed under the License is distributed on an "AS IS" BASIS, *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *    See the License for the specific language governing permissions and *    limitations under the License. */package org.apache.ibatis.mapping;import javax.sql.DataSource;import org.apache.ibatis.transaction.TransactionFactory;/** * @author Clinton Begin */public final class Environment {  private final String id;  private final TransactionFactory transactionFactory;  private final DataSource dataSource;  public Environment(String id, TransactionFactory transactionFactory, DataSource dataSource) {    if (id == null) {      throw new IllegalArgumentException("Parameter 'id' must not be null");    }    if (transactionFactory == null) {        throw new IllegalArgumentException("Parameter 'transactionFactory' must not be null");    }    this.id = id;    if (dataSource == null) {      throw new IllegalArgumentException("Parameter 'dataSource' must not be null");    }    this.transactionFactory = transactionFactory;    this.dataSource = dataSource;  }  public static class Builder {      private String id;      private TransactionFactory transactionFactory;      private DataSource dataSource;    public Builder(String id) {      this.id = id;    }    public Builder transactionFactory(TransactionFactory transactionFactory) {      this.transactionFactory = transactionFactory;      return this;    }    public Builder dataSource(DataSource dataSource) {      this.dataSource = dataSource;      return this;    }    public String id() {      return this.id;    }    public Environment build() {      return new Environment(this.id, this.transactionFactory, this.dataSource);    }  }  public String getId() {    return this.id;  }  public TransactionFactory getTransactionFactory() {    return this.transactionFactory;  }  public DataSource getDataSource() {    return this.dataSource;  }}

把环境、数据源、事务配置构造成Configuration,Configuaration配置类,sql的映射关系等原如下

 public Configuration(Environment environment) {    this();    this.environment = environment;  }  public Configuration() {    typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);    typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class);    typeAliasRegistry.registerAlias("JNDI", JndiDataSourceFactory.class);    typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class);    typeAliasRegistry.registerAlias("UNPOOLED", UnpooledDataSourceFactory.class);    typeAliasRegistry.registerAlias("PERPETUAL", PerpetualCache.class);    typeAliasRegistry.registerAlias("FIFO", FifoCache.class);    typeAliasRegistry.registerAlias("LRU", LruCache.class);    typeAliasRegistry.registerAlias("SOFT", SoftCache.class);    typeAliasRegistry.registerAlias("WEAK", WeakCache.class);    typeAliasRegistry.registerAlias("DB_VENDOR", VendorDatabaseIdProvider.class);    typeAliasRegistry.registerAlias("XML", XMLLanguageDriver.class);    typeAliasRegistry.registerAlias("RAW", RawLanguageDriver.class);    typeAliasRegistry.registerAlias("SLF4J", Slf4jImpl.class);    typeAliasRegistry.registerAlias("COMMONS_LOGGING", JakartaCommonsLoggingImpl.class);    typeAliasRegistry.registerAlias("LOG4J", Log4jImpl.class);    typeAliasRegistry.registerAlias("LOG4J2", Log4j2Impl.class);    typeAliasRegistry.registerAlias("JDK_LOGGING", Jdk14LoggingImpl.class);    typeAliasRegistry.registerAlias("STDOUT_LOGGING", StdOutImpl.class);    typeAliasRegistry.registerAlias("NO_LOGGING", NoLoggingImpl.class);    typeAliasRegistry.registerAlias("CGLIB", CglibProxyFactory.class);    typeAliasRegistry.registerAlias("JAVASSIST", JavassistProxyFactory.class);    languageRegistry.setDefaultDriverClass(XMLLanguageDriver.class);    languageRegistry.register(RawLanguageDriver.class);  }

SqlSessionFactoryBuilder是一个建造器,主要的作用是把xml配置文件转换成Configuration配置,主要的方法如下

  public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {    try {      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);      return build(parser.parse());    } catch (Exception e) {      throw ExceptionFactory.wrapException("Error building SqlSession.", e);    } finally {      ErrorContext.instance().reset();      try {        inputStream.close();      } catch (IOException e) {        // Intentionally ignore. Prefer previous error.      }    }  }

经过上面几个类的构造最终的目的是获取SqlSessionFactory类,构造出SqlSession类,以DefaultSqlSessionFactory类为例,openSession的主要构造方法

private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {  Transaction tx = null;  try {    final Environment environment = configuration.getEnvironment();    final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);    tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);    final Executor executor = configuration.newExecutor(tx, execType);    return new DefaultSqlSession(configuration, executor, autoCommit);  } catch (Exception e) {    closeTransaction(tx); // may have fetched a connection so lets call close()    throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);  } finally {    ErrorContext.instance().reset();  }}

Executor是一个执行器接口,主要SimpleExecutor,BatchExecutor,ReuseExecutor,CachingExecutor,分别处理简单的,批量的,重复使用,缓存解析器

public Executor newExecutor(Transaction transaction, ExecutorType executorType) {  executorType = executorType == null ? defaultExecutorType : executorType;  executorType = executorType == null ? ExecutorType.SIMPLE : executorType;  Executor executor;  if (ExecutorType.BATCH == executorType) {    executor = new BatchExecutor(this, transaction);  } else if (ExecutorType.REUSE == executorType) {    executor = new ReuseExecutor(this, transaction);  } else {    executor = new SimpleExecutor(this, transaction);  }  if (cacheEnabled) {    executor = new CachingExecutor(executor);  }  executor = (Executor) interceptorChain.pluginAll(executor);  return executor;}

以SimpleExecutor为例DefaultSqlSession执行查询的过程,MappedStatement包含映射配置信息

  @Override  public  List selectList(String statement, Object parameter, RowBounds rowBounds) {    try {      MappedStatement ms = configuration.getMappedStatement(statement);      return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);    } catch (Exception e) {      throw ExceptionFactory.wrapException("Error querying database.  Cause: " + e, e);    } finally {      ErrorContext.instance().reset();    }  }

执行查询过程,prepareStatement获取Jdbc的Statement对像,执行查询过程,封装返回接口,整个流程执行完成

  @Override  public  List doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {    Statement stmt = null;    try {      Configuration configuration = ms.getConfiguration();      StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);      stmt = prepareStatement(handler, ms.getStatementLog());      return handler.query(stmt, resultHandler);    } finally {      closeStatement(stmt);    }  }
private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException {  Statement stmt;  Connection connection = getConnection(statementLog);  stmt = handler.prepare(connection, transaction.getTimeout());  handler.parameterize(stmt);  return stmt;}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

0