Skip to content

Commit a5e5881

Browse files
committed
更新mapper2文档。
1 parent c60d744 commit a5e5881

File tree

6 files changed

+1328
-0
lines changed

6 files changed

+1328
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ http://repo1.maven.org/maven2/javax/persistence/persistence-api/1.0/
120120

121121
7. [如何使用Mapper专用的MyBatis Generator插件](http://git.oschina.net/free/Mapper/blob/master/wiki/mapper3/7.UseMBG.md)
122122

123+
8. [在Spring4中使用通用Mapper](http://git.oschina.net/free/Mapper/blob/master/wiki/mapper/4.Spring4.md)
124+
123125
###通用Mapper 2
124126

125127
[Mapper2.x首页](http://git.oschina.net/free/Mapper/tree/Mapper2.x)

wiki/mapper/1.Integration.md

Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
#如何集成通用Mapper
2+
3+
`com.github.abel533.mapper.Mapper`
4+
5+
##添加Maven依赖或引入Jar包
6+
7+
如果你使用Maven,只需要添加如下依赖:
8+
9+
```xml
10+
<dependency>
11+
<groupId>com.github.abel533</groupId>
12+
<artifactId>mapper</artifactId>
13+
<!-- 建议使用最新版本,最新版本请从项目首页查找 -->
14+
<version>x.x.x</version>
15+
</dependency>
16+
```
17+
18+
如果你想引入Jar包,你可以从下面的地址下载:
19+
20+
https://oss.sonatype.org/content/repositories/releases/com/github/abel533/mapper/
21+
22+
http://repo1.maven.org/maven2/com/github/abel533/mapper/
23+
24+
由于通用Mapper依赖JPA,所以还需要下载persistence-api-1.0.jar:
25+
26+
http://repo1.maven.org/maven2/javax/persistence/persistence-api/1.0/
27+
28+
29+
##集成`com.github.abel533.mapper.Mapper`
30+
31+
`com.github.abel533.mapper.Mapper`的集成,实际上是配置`MapperHelper`
32+
33+
下面针对Java编码和Spring两种情况分别讲解配置方法。出这两种情况的配置外,还有一种拦截器的方式。
34+
35+
###第一种、Java编码
36+
37+
对于单独使用Mybatis,通过如下方式创建`sqlSessionFactory`:
38+
```java
39+
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
40+
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
41+
reader.close();
42+
```
43+
44+
使用直接的JAVA编码方式,可以在初始化`sqlSessionFactory`的地方按照下面的方式操作:
45+
```java
46+
//从上面的sqlSessionFactory取出一个session
47+
session = sqlSessionFactory.openSession();
48+
//创建一个MapperHelper
49+
MapperHelper mapperHelper = new MapperHelper();
50+
// 设置UUID生成策略
51+
// 配置UUID生成策略需要使用OGNL表达式
52+
// 默认值32位长度:@java.util.UUID@randomUUID().toString().replace("-", "")
53+
mapperHelper.setUUID("");
54+
// 主键自增回写方法,默认值MYSQL,详细说明请看文档
55+
mapperHelper.setIDENTITY("HSQLDB");
56+
// 序列的获取规则,使用{num}格式化参数,默认值为{0}.nextval,针对Oracle
57+
// 可选参数一共3个,对应0,1,2,分别为SequenceName,ColumnName, PropertyName
58+
mapperHelper.setSeqFormat("NEXT VALUE FOR {0}");
59+
// 设置全局的catalog,默认为空,如果设置了值,操作表时的sql会是catalog.tablename
60+
mapperHelper.setCatalog("");
61+
// 设置全局的schema,默认为空,如果设置了值,操作表时的sql会是schema.tablename
62+
// 如果同时设置了catalog,优先使用catalog.tablename
63+
mapperHelper.setSchema("");
64+
// 主键自增回写方法执行顺序,默认AFTER,可选值为(BEFORE|AFTER)
65+
mapperHelper.setOrder("AFTER");
66+
// 注册通用Mapper接口
67+
mapperHelper.registerMapper(Mapper.class);
68+
mapperHelper.registerMapper(HsqldbMapper.class);
69+
//配置完成后,执行下面的操作
70+
mapperHelper.processConfiguration(session.getConfiguration());
71+
//OK - mapperHelper的任务已经完成,可以不管了
72+
```
73+
上面配置参数的时候,是一个个调用set方法进行的,你还可以使用`MapperHelper``MapperHelper(Properties properties)`构造方法,或者调用`setProperties(properties)`方法,通过`.properties`配置文件来配置。
74+
75+
如果你的情况适用于这种方式,推荐你用JAVA编码的方式处理。
76+
77+
###第二种、和Spring集成
78+
79+
在Spring中使用的时候,可以通过xml达到上面Java编码方式的效果。如下配置:
80+
```xml
81+
<bean class="com.github.abel533.mapperhelper.MapperHelper"
82+
depends-on="sqlSession" init-method="initMapper" scope="singleton" lazy-init="false">
83+
<property name="mappers">
84+
<array>
85+
<!-- 可以配置多个 -->
86+
<value>com.isea533.mybatis.mapper.Mapper</value>
87+
</array>
88+
</property>
89+
<!-- 对于多数据源,这里也可以像上面这样配置多个 -->
90+
<property name="sqlSessions" ref="sqlSession"/>
91+
</bean>
92+
```
93+
可以看到配置中依赖了`sqlSession`,所以使用这种方式,你还要在Spring的配置中保证`sqlSession`存在。一般情况下都会在Spring定义`sqlSession`。一般的定义方法如下:
94+
```xml
95+
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" scope="prototype">
96+
<constructor-arg index="0" ref="sqlSessionFactory"/>
97+
</bean>
98+
```
99+
在Spring中使用这种方式的时候,Spring启动完成的时候,所有的通用Mapper都已经处理完成了。后面就可以直接使用通用方法,不需要拦截器来执行了。
100+
101+
**重要:**目前和Spring集成的时候存在一个bug,这个bug产生的原因如下:
102+
103+
如果你的Mapper没有在项目启动的时候通过`@Autowired`注入到`Service`或者其他类中,那么这个Mapper是一个还没有注册到Mybatis`SqlSession`中的Mapper,`MapperHelper`在启动过程中没有处理该Mapper,这就会导致<b>`dynamicSQL`无法实例化一类的异常</b>。
104+
105+
这种情况只能使用拦截器处理。
106+
107+
###第三种、拦截器
108+
109+
首先这里提到的三种配置方式不要重复进行,只需要按其中一种方式即可。
110+
111+
配置方式分为mybatis配置方式和纯spring集成方式。
112+
113+
####1). Mybatis配置文件方式
114+
115+
`mybatis-config.xml`中添加如下配置:
116+
```xml
117+
<plugins>
118+
<plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
119+
<!--================================================-->
120+
<!--可配置参数说明(一般无需修改)-->
121+
<!--================================================-->
122+
<!--UUID生成策略-->
123+
<!--配置UUID生成策略需要使用OGNL表达式-->
124+
<!--默认值32位长度:@java.util.UUID@randomUUID().toString().replace("-", "")-->
125+
<!--<property name="UUID" value="@java.util.UUID@randomUUID().toString()"/>-->
126+
<!--主键自增回写方法,默认值MYSQL,详细说明请看文档-->
127+
<property name="IDENTITY" value="HSQLDB"/>
128+
<!--序列的获取规则,使用{num}格式化参数,默认值为{0}.nextval,针对Oracle-->
129+
<!--可选参数一共3个,对应0,1,2,分别为SequenceName,ColumnName,PropertyName-->
130+
<property name="seqFormat" value="{0}.nextval"/>
131+
<!--主键自增回写方法执行顺序,默认AFTER,可选值为(BEFORE|AFTER)-->
132+
<!--<property name="ORDER" value="AFTER"/>-->
133+
<!--通用Mapper接口,多个通用接口用逗号隔开-->
134+
<property name="mappers" value="com.github.abel533.mapper.Mapper"/>
135+
</plugin>
136+
</plugins>
137+
```
138+
139+
####2). 纯Spring配置方式
140+
141+
```xml
142+
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
143+
<property name="dataSource" ref="dataSource"/>
144+
<property name="mapperLocations">
145+
<array>
146+
<value>classpath:mapper/*.xml</value>
147+
<value>classpath:com/isea533/mybatis/mapper/*.xml</value>
148+
</array>
149+
</property>
150+
<property name="typeAliasesPackage" value="com.isea533.mybatis.model"/>
151+
<property name="plugins">
152+
<array>
153+
<bean class="com.github.abel533.mapperhelper.MapperInterceptor">
154+
<property name="properties">
155+
<!-- 属性一行一个,具体属性参考mybatis-config.xml中的属性 -->
156+
<value>
157+
mappers=com.github.abel533.mapper.Mapper
158+
</value>
159+
</property>
160+
</bean>
161+
</array>
162+
</property>
163+
</bean>
164+
```
165+
166+
<b>如果你同时使用了其他的插件,请将其他插件配置通用Mapper拦截器的上面,将通用Mapper拦截器配置在最下面。</b>
167+
168+
###INENTITY参数配置(仅对 insert 有用)
169+
170+
对于不同的数据库,需要配置不同的参数,这些参数如下:
171+
172+
- <b>DB2</b>: `VALUES IDENTITY_VAL_LOCAL()`
173+
- <b>MYSQL</b>: `SELECT LAST_INSERT_ID()`
174+
- <b>SQLSERVER</b>: `SELECT SCOPE_IDENTITY()`
175+
- <b>CLOUDSCAPE</b>: `VALUES IDENTITY_VAL_LOCAL()`
176+
- <b>DERBY</b>: `VALUES IDENTITY_VAL_LOCAL()`
177+
- <b>HSQLDB</b>: `CALL IDENTITY()`
178+
- <b>SYBASE</b>: `SELECT @@IDENTITY`
179+
- <b>DB2_MF</b>: `SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1`
180+
- <b>INFORMIX</b>: `select dbinfo('sqlca.sqlerrd1') from systables where tabid=1`
181+
- <b>JDBC</b>:这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段)。
182+
183+
JAVA编码方式使用:
184+
185+
```java
186+
// 主键自增回写方法,默认值MYSQL,详细说明请看文档
187+
mapperHelper.setIDENTITY("HSQLDB");
188+
```
189+
190+
Spring中可以属性注入:
191+
192+
```xml
193+
<property name="IDENTITY" value="MYSQL"/>
194+
```
195+
196+
#[如何使用通用Mapper](http://git.oschina.net/free/Mapper/blob/master/wiki/mapper/2.Use.md)
197+
198+
#[返回首页](http://git.oschina.net/free/Mapper/tree/Mapper2.x)

0 commit comments

Comments
 (0)