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