zoukankan      html  css  js  c++  java
  • Mybatis Guide

    每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为中心的。SqlSessionFactory的实例可以通过SqlSessionFactoryBuilder获得。而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。

    下面按照步骤创建一个基于Maven购建的Mybatis实例。

    (1) 创建Maven工程及pom.xml

     1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     2     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     3     <modelVersion>4.0.0</modelVersion>
     4     <groupId>com.mytest</groupId>
     5     <artifactId>mybatistest</artifactId>
     6     <version>0.0.1-SNAPSHOT</version>
     7     <packaging>pom</packaging>
     8 
     9     <dependencies>
    10         <!-- Mybatis Core -->
    11         <dependency>
    12             <groupId>org.mybatis</groupId>
    13             <artifactId>mybatis</artifactId>
    14             <version>3.4.5</version>
    15         </dependency>
    16         <!-- Sybase JDBC driver(请根据需要换成相应DB的JDBC driver) -->
    17         <dependency>
    18             <groupId>com.sybase</groupId>
    19             <artifactId>jconn4</artifactId>
    20             <version>7.07</version>
    21         </dependency>
    22     </dependencies>
    23 
    24     <build>
    25         <pluginManagement>
    26             <plugins>
    27                 <plugin>
    28                     <groupId>org.apache.maven.plugins</groupId>
    29                     <artifactId>maven-compiler-plugin</artifactId>
    30                     <configuration>
    31                         <source>${java-version}</source>
    32                         <target>${java-version}</target>
    33                     </configuration>
    34                 </plugin>
    35             </plugins>
    36         </pluginManagement>
    37     </build>
    38     <properties>
    39         <java-version>1.8</java-version>
    40     </properties>
    41 </project>

    (2) 创建Mybatis的Configuration XML文件mybatis-config.xml。其中包含MyBatis的Setting设置,typeAliases,typeHandlers,数据源及映射关系等。

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
     3 <configuration>
     4     <!--MyBatis的Setting设置,它们会改变 MyBatis的运行时行为。 -->
     5     <settings>
     6         <!-- 该配置影响的所有映射器中配置的缓存的全局开关[default:true] -->
     7         <setting name="cacheEnabled" value="true" />
     8         <!-- 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载[default:false] -->
     9         <setting name="lazyLoadingEnabled" value="true" />
    10         <!-- 是否允许单一语句返回多结果集(需要兼容驱动)[default:true] -->
    11         <setting name="multipleResultSetsEnabled" value="true" />
    12         <!-- 使用列标签代替列名[default:true] -->
    13         <setting name="useColumnLabel" value="true" />
    14         <!-- 允许JDBC支持自动生成主键,需要驱动兼容[default:false] -->
    15         <setting name="useGeneratedKeys" value="false" />
    16         <!-- 指定MyBatis应如何自动映射列到字段或属性。NONE表示取消自动映射; PARTIAL只会自动映射没有定义嵌套结果集映射的结果集。FULL会自动映射任意复杂的结果集(无论是否嵌套)[default:PARTIAL] -->
    17         <setting name="autoMappingBehavior" value="PARTIAL" />
    18         <!-- 指定发现自动映射目标未知列(或者未知属性类型)的行为。NONE不做任何反应; WARNING输出提醒日志('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior'的日志等级必须设置为WARN); -->
    19         <!-- FAILING映射失败 (抛出 SqlSessionException)[default:NONE] -->
    20         <setting name="autoMappingUnknownColumnBehavior" value="WARNING" />
    21         <!-- 配置默认的执行器。SIMPLE就是普通的执行器;REUSE执行器会重用预处理语句(prepared statements); 
    22             BATCH执行器将重用语句并执行批量更新[default:SIMPLE] -->
    23         <setting name="defaultExecutorType" value="SIMPLE" />
    24         <!-- 设置超时时间,它决定驱动等待数据库响应的秒数 -->
    25         <setting name="defaultStatementTimeout" value="25" />
    26         <!-- 为驱动的结果集获取数量(fetchSize)设置一个提示值。此参数只可以在查询设置中被覆盖 -->
    27         <setting name="defaultFetchSize" value="100" />
    28         <!-- 允许在嵌套语句中使用分页(RowBounds)。如果允许使用则设置为false[default:false] -->
    29         <setting name="safeRowBoundsEnabled" value="false" />
    30         <!-- 是否开启自动驼峰命名规则(camel case)映射[default:false] -->
    31         <setting name="mapUnderscoreToCamelCase" value="false" />
    32         <!-- MyBatis利用本地缓存机制(Local Cache)防止循环引用(circular references)和加速重复嵌套查询。 -->
    33         <!-- 默认值为SESSION,这种情况下会缓存一个会话中执行的所有查询。 若设置值为STATEMENT,本地会话仅用在语句执行上,对相同SqlSession的不同调用将不会共享数据 -->
    34         <setting name="localCacheScope" value="SESSION" />
    35         <!-- 当没有为参数提供特定的JDBC类型时,为空值指定JDBC类型。 某些驱动需要指定列的JDBC类型,多数情况直接用一般类型即可,比如NULL、VARCHAR或OTHER[default:OTHER] -->
    36         <setting name="jdbcTypeForNull" value="OTHER" />
    37         <!-- 指定哪个对象的方法触发一次延迟加载。[default:equals,clone,hashCode,toString] -->
    38         <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
    39     </settings>
    40 
    41     <!-- 类型别名是为Java类型设置一个短的名字。它只和XML配置有关,存在的意义仅在于用来减少类完全限定名的冗余。 -->
    42     <typeAliases>
    43         <!-- <package name="com.xx.xxx" /> -->
    44     </typeAliases>
    45 
    46     <!-- 无论是MyBatis在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成Java类型。下面方式可以自定义。 -->
    47     <typeHandlers>
    48         <!-- <package name="com.xx.xxx.typehandler" /> -->
    49     </typeHandlers>
    50     
    51     <!--设置数据源 -->
    52     <environments default="development">
    53         <environment id="development">
    54             <transactionManager type="JDBC" />
    55             <dataSource type="POOLED">
    56                 <property name="driver" value="com.sybase.jdbc4.jdbc.SybDriver" /> <!-- Sybase JDBC driver name(请根据需要换成相应DB的JDBC driver) -->
    57                 <property name="url" value="*****" />
    58                 <property name="username" value="*****" />
    59                 <property name="password" value="*****" />
    60             </dataSource>
    61         </environment>
    62     </environments>
    63     <!--设置映射关系 -->
    64     <mappers>
    65         <!-- <mapper resource="xxx/xxx.xml" /> -->
    66     </mappers>
    67 </configuration>

    (3) 创建SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession。(与Hibernate类似)

    SqlSessionFactoryBuilder:这个类可以被实例化、使用和丢弃,一旦创建了SqlSessionFactory,就不再需要它了。因此SqlSessionFactoryBuilder实例的最佳作用域是方法作用域(也就是局部方法变量)。你可以重用SqlSessionFactoryBuilder来创建多个 SqlSessionFactory实例,但是最好还是不要让其一直存在以保证所有的XML解析资源开放给更重要的事情。

    SqlSessionFactory:SqlSessionFactory一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用SqlSessionFactory的最佳实践是在应用运行期间不要重复创建多次,多次重建SqlSessionFactory被视为一种代码“坏味道(bad smell)”。因此SqlSessionFactory的最佳作用域是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

    SqlSession:每个线程都应该有它自己的SqlSession实例。SqlSession的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。绝对不能将SqlSession实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。也绝不能将 SqlSession实例的引用放在任何类型的管理作用域中,比如Servlet架构中的HttpSession。如果你现在正在使用一种Web框架,要考虑SqlSession放在一个和 HTTP 请求对象相似的作用域中。换句话说,每次收到的HTTP请求,就可以打开一个SqlSession,返回一个响应,就关闭它。这个关闭操作是很重要的,你应该把这个关闭操作放到finally块中以确保每次都能执行关闭。

    下面是一个SqlSessionFactoryBuilder创建单例的SqlSessionFactory的例子:

     1 import org.apache.ibatis.io.Resources;
     2 import org.apache.ibatis.session.SqlSessionFactory;
     3 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
     4 
     5 import java.io.IOException;
     6 import java.io.InputStream;
     7 
     8 public class MybatisTestSessionFactory {
     9 
    10     private static SqlSessionFactory instance;
    11 
    12     private MybatisTestSessionFactory() {
    13     }
    14 
    15     public static synchronized SqlSessionFactory getSqlSessionFactoryInstance() {
    16         return instance == null ? getSessionFactory() : instance;
    17     }
    18 
    19     private static SqlSessionFactory getSessionFactory() {
    20         String resource = "mybatis-config.xml";
    21         InputStream inputStream = null;
    22         try {
    23             inputStream = Resources.getResourceAsStream(resource);
    24         } catch (IOException e) {
    25             e.printStackTrace();
    26         }
    27         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    28         return sqlSessionFactory;
    29     }
    30 }

    下面是创建SqlSession实例的例子:

    1 SqlSessionFactory sqlSessionFactory = MybatisTestSessionFactory.getSqlSessionFactoryInstance();
    2 SqlSession session = sqlSessionFactory.openSession();
    3 try {
    4   // do work
    5 } finally {
    6   session.close();
    7 }
  • 相关阅读:
    【常用配置】Spring框架web.xml通用配置
    3.从AbstractQueuedSynchronizer(AQS)说起(2)——共享模式的锁获取与释放
    2.从AbstractQueuedSynchronizer(AQS)说起(1)——独占模式的锁获取与释放
    1.有关线程、并发的基本概念
    0.Java并发包系列开篇
    SpringMVC——DispatcherServlet的IoC容器(Web应用的IoC容器的子容器)创建过程
    关于String的问题
    Spring——Web应用中的IoC容器创建(WebApplicationContext根应用上下文的创建过程)
    <<、>>、>>>移位操作
    System.arraycopy(src, srcPos, dest, destPos, length) 与 Arrays.copyOf(original, newLength)区别
  • 原文地址:https://www.cnblogs.com/storml/p/8309735.html
Copyright © 2011-2022 走看看