MyBatis学习(一)之MyBatis初识

MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。 1. SqlSessionFactory

SqlSessionFactory对象是使用MyBatis的应用程序的核心,SqlSession都需要通过SqlSessionFactory实例来获取。构造SqlSessionFactory有两种方式, xml和java 两种方式。

  • xml构建方式,此方式为最常用的方式。
首先创建xml配置文件,一个简单的配置(以MySQL为例)
【MyBatis学习(一)之MyBatis初识】


这里我们创建了SqlSessionFactory可以依赖的环境(包括数据源和事务管理),可以创建多个environment,但需要指定其中的一个为默认的环境。 简要说明下transactionManager和dataSource的type代表的意思, transactionManager的type可选值为:
JDBC #代表 org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory MANAGED #代表 org.apache.ibatis.transaction.managed.ManagedTransactionFactory


dataSource的type可选值为:
JNDI #代表org.apache.ibatis.datasource.jndi.JndiDataSourceFactory POOLED #代表org.apache.ibatis.datasource.pooled.PooledDataSourceFactory UNPOOLED #代表 org.apache.ibatis.datasource.unpooled.UnpooledDataSourceFactory


配置文件里面还可以配置其他很多地方,在以后的章节我们再做描述。
根据xml配置构建SqlSessionFactory, 我们这里使用SqlSessionFactoryBuilder来构建SqlSessionFactory。
String configurationResource = "mybatis-configuration.xml"; InputStream inputStream = Resources.getResourceAsStream(configurationResource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); inputStream.close();

  • Java 方式创建SqlSessionFactory(其实就是将xml中配置的信息转换到Java代码里)
DataSource dataSource = new PooledDataSource("com.mysql.jdbc.Driver","jdbc:mysql://localhost:3306/test","root","123456"); Environment environment = new Environment("develop",new JdbcTransactionFactory(),dataSource); Configuration configuration = new Configuration(environment); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);


2. SqlSession
SqlSession 提供了以数据库为背景的所有SQL操作的方法。SqlSession可以从SqlSessionFactory中获取,SqlSessionFactory提供了多种方式来获取一个SqlSession。
SqlSession openSession(); SqlSession openSession(boolean autoCommit); SqlSession openSession(Connection connection); SqlSession openSession(TransactionIsolationLevel level); SqlSession openSession(ExecutorType execType); SqlSession openSession(ExecutorType execType, boolean autoCommit); SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level); SqlSession openSession(ExecutorType execType, Connection connection);


这里我们直接使用默认的SqlSession获取方法:
SqlSession sqlSession = sqlSessionFactory.openSession(); try{ List list = sqlSession.selectList("org.antstudio.mybatis.test.ConfigurationTest.selectTest"); }finally{ sqlSession.close(); }



这里我们使用sqlSession查询出了一个列表,注意,sqlSession为非线程安全的对象,其使用范围最好为一个请求或者一个方法范围内。
3. MappedStatement
MyBatis将sql语句、参数、结果处理等一系列相关的元素封装成一个一个的已映射的sql(MappedStatement), 在上面我们通过sqlSession来查询了一个列表,要使这段代码正常运行,还需要配置或者定义相关的MappedStatement。 MappedStatement可以通过xml配置或者Java方式显示添加。
  • xml的配置MappedStatement.

新建一个ConfigurationTestMapper.xml.xml
select * from tab_user


每一个MappedStatement的唯一标示为namespace+id,如果注册重复的MappedStatement则会抛出异常。
然后在mybatis-configuration.xml配置文件中添加如下语句:


将配置的映射添加进来。
  • java添加MappedStatement
如同SqlSessionFactory的java构造一样,需要提供xml构造时的所有的信息。
SqlSource sqlSource1 = new StaticSqlSource(configuration,"select * from tab_user"); final ResultMap resultMap = new ResultMap.Builder(configuration,"org.antstudio.mybatis.test.Configuration.selectTest",HashMap.class,new ArrayList()).build(); MappedStatement mappedStatement = new MappedStatement.Builder(configuration,"org.antstudio.mybatis.test.Configuration.selectTest",sqlSource, SqlCommandType.SELECT) .resultMaps(new ArrayList(){{add(resultMap); }}).build(); //定义一个mappedStatement,每行用HashMap包装--》等同于xml中的resultType="HashMap" configurationWithoutXml.addMappedStatement(mappedStatement); //添加到configuration



这样就具备了MyBatis可以简单运行的所有必备元素,这里主要简单介绍了MyBatis的基本的元素和配置。具体源码见: https://gist.github.com/gavincook/4471c06138976bf1284c

    推荐阅读