一旦创建了SqlSessionFactory

时间:2019-10-07 13:26来源:美高梅手机游戏网站
configuration 配置-properties 属性-settings 设置-typeAliases类型命名-typeHandlers 类型处理器-objectFactory 对象工厂-plugins插件-environments 环境--environment 环境变量--transactionManager事务管理器-dataSource

configuration 配置-properties 属性-settings 设置-typeAliases 类型命名-typeHandlers 类型处理器-objectFactory 对象工厂-plugins 插件-environments 环境--environment 环境变量--transactionManager 事务管理器-dataSource 数据源-mappers 映射器

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

  可以说每个MyBatis都是以一个SqlSessionFactory实例为中心的。SqlSessionFactory实例可以通过SqlSessionFactoryBuilder来构建。一是可以通过XML配置文件的方式来构建SqlSessionFactory,二是可以通过Java API的方式来构建。但不管通过什么方式都有一个Configuration贯穿始终,各种配置正是通过Configuration实例来完成实现。

<configuration> <!-- 配置全局属性 --> <settings> <!-- 使用jdbc的getGeneratedKeys获取数据库自增主键值 --> <setting name="useGeneratedKeys" value="true" /> <!-- 使用列别名替换列名 默认:true --> <setting name="useColumnLabel" value="true" /> <!-- 开启驼峰命名转换:Table{create_time} -> Entity{createTime} --> <setting name="mapUnderscoreToCamelCase" value="true" /> </settings></configuration>

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

  此篇文章旨在通过编码实现MyBatis3.4.1 User Guide所提到的作用域和生命周期指导建议。为什么要了解作用域和生命周期呢?在作用域内正确地使用SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession会让我们避免多线程环境下并发所带来的问题。当然如果使用依赖(DI)注入框架(Spring)可不用在代码中关心作用域问题,因为依赖注入框架会为我们做好几乎一切工作。

mapper.xml[insert、update、select、delete]
<?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="com.neusoft.flycity.dao.BillDao"> <insert > INSERT INTO bill(ticketNum,ticketPrice,totalPrice,bookingID) VALUES (#{bookNum},#{price},#{price}*#{bookNum},#{bookingID}) </insert> <delete parameterType="int"> DELETE FROM bill where bookingID = #{bookingID} </delete> <select parameterType="int" resultType="Bill"> SELECT * FROM bill WHERE bookingID = #{bookingID} </select></mapper>

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

  首先我们来看User Guide对SqlSessionFactoryBuilder作用域以及生命周期的指导意见。

核心对象

SqlSessionFactory

String resource = "org/mybatis/example/mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream;SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

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);

SqlSession

SqlSession session = sqlSessionFactory.openSession();

SqlSessionFactoryBuilder这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。SqlSessionFactorySqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。因此 SqlSessionFactory 的最佳作用域是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。SqlSession每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。

 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>

SqlSessionFactoryBuilder

动态SQL

  • if
<if test="title != null"> AND title like #{title}</if>
  • choose (when, otherwise)
<choose> <when test="title != null"> AND title like #{title} </when> <when test="author != null and author.name != null"> AND author_name like #{author.name} </when> <otherwise> AND featured = 1 </otherwise></choose>
  • trim (where, set)
<where> <if test="state != null"> state = #{state} </if> <if test="title != null"> AND title like #{title} </if> <if test="author != null and author.name != null"> AND author_name like #{author.name} </if></where><trim prefix="WHERE" prefixOverrides="AND |OR "> ... </trim>

<set> <if test="username != null">username=#{username},</if> <if test="password != null">password=#{password},</if> <if test="email != null">email=#{email},</if> <if test="bio != null">bio=#{bio}</if></set><trim prefix="SET" suffixOverrides=","> ...</trim>
  • foreach
<foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item}</foreach>

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

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

 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>

SqlSessionFactory

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

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

编辑:美高梅手机游戏网站 本文来源:一旦创建了SqlSessionFactory

关键词: