@@ -17,6 +17,7 @@ public interface UserInfoMapper extends Mapper<UserInfo> {
17
17
18
18
一旦继承了` Mapper<T> ` ,继承的` Mapper ` 就拥有了` Mapper<T> ` 所有的通用方法。
19
19
20
+ <br ><br ><br ><br >
20
21
##2 . 泛型(实体类)` <T> ` 的类型必须符合要求
21
22
22
23
实体类按照如下规则和数据库表进行转换,注解全部是JPA中的注解:
@@ -31,105 +32,135 @@ public interface UserInfoMapper extends Mapper<UserInfo> {
31
32
32
33
5 . 使用` @Transient ` 注解可以忽略字段,添加该注解的字段不会作为表字段使用.
33
34
34
- 6 . 建议一定是有一个` @Id ` 注解作为主键的字段,可以有多个` @Id ` 注解的字段作为联合主键.
35
+ 6 . < b > 建议一定是有一个` @Id ` 注解作为主键的字段,可以有多个` @Id ` 注解的字段作为联合主键.</ b >
35
36
36
- 7 . 默认情况下,实体类中如果不存在包含` @Id ` 注解的字段,所有的字段都会作为主键字段进行使用(这种效率极低).
37
+ 7 . < b > 默认情况下,实体类中如果不存在包含` @Id ` 注解的字段,所有的字段都会作为主键字段进行使用(这种效率极低).</ b >
37
38
38
39
8 . 实体类可以继承使用,可以参考测试代码中的` tk.mybatis.mapper.model.UserLogin2 ` 类.
39
40
40
41
9 . 由于基本类型,如int作为实体类字段时会有默认值0,而且无法消除,所以实体类中建议不要使用基本类型.
41
42
42
- 除了上面提到的这些,Mapper还提供了序列(支持Oracle)、UUID(任意数据库,字段长度32)、主键自增(类似Mysql,Hsqldb)三种方式,其中序列和UUID可以配置多个,主键自增只能配置一个。
43
+ 10 . ` @NameStyle ` 注解,用来配置对象名/字段和表名/字段之间的转换方式,该注解优先于全局配置` style ` ,可选值:
44
+ - ` normal ` :使用实体类名/属性名作为表名/字段名
45
+ - ` camelhump ` :<b >这是默认值</b >,驼峰转换为下划线形式
46
+ - ` uppercase ` :转换为大写
47
+ - ` lowercase ` :转换为小写
43
48
44
- 这三种方式不能同时使用,同时存在时按照 ` 序列>UUID>主键自增 ` 的优先级进行选择.下面是具体配置方法:
49
+ 通过[ 使用Mapper专用的MyBatis生成器插件] ( http://git.oschina.net/free/Mapper/blob/master/wiki/mapper3/7.UseMBG.md ) 可以直接生成符合要求带注解的实体类。
50
+
51
+ <br ><br ><br ><br >
52
+
53
+ <br ><br ><br ><br >
54
+ ##3 .主键策略(仅用于insert方法) - 将会在3.3.0版本移除,使用新的简单的注解
55
+
56
+ 通用Mapper还提供了序列(支持Oracle)、UUID(任意数据库,字段长度32)、主键自增(类似Mysql,Hsqldb)三种方式,其中序列和UUID可以配置多个,主键自增只能配置一个。
57
+
58
+ 由于MySql自增主键最常用,所以这里从最简单的配置方式开始。
59
+
60
+ ###1 .` @GeneratedValue(generator = "JDBC") `
45
61
46
- 1 . 使用序列可以添加如下的注解:
47
62
``` java
48
- // 可以用于数字类型,字符串类型(需数据库支持自动转型)的字段
49
- @SequenceGenerator (name = " Any" ,sequenceName = " seq_userid" )
50
63
@Id
64
+ @GeneratedValue (generator = " JDBC" )
51
65
private Integer id;
52
66
```
53
- 该字段不会回写。这种情况对应类似如下的XML:
54
- ``` xml
55
- <insert id =" insertAuthor" >
56
- insert into Author
57
- (id, username, password, email,bio, favourite_section)
58
- values
59
- (seq_userid.nextval, #{username, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})
60
- </insert >
61
- ```
62
-
63
- 2 . 使用UUID时:
64
- ``` java
65
- // 可以用于任意字符串类型长度超过32位的字段
66
- @GeneratedValue (generator = " UUID" )
67
- private String username;
67
+
68
+ 这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段)。
69
+ 这种情况对应的xml类似下面这样:
70
+ ``` xml
71
+ <insert id =" insertAuthor" useGeneratedKeys =" true" keyProperty =" id" >
72
+ insert into Author (username,password,email,bio)
73
+ values (#{username},#{password},#{email},#{bio})
74
+ </insert >
68
75
```
69
- 该字段不会回写。这种情况对应类似如下的XML:
70
- ``` xml
71
- <insert id =" insertAuthor" >
72
- <bind name =" username_bind" value =' @java.util.UUID@randomUUID().toString().replace("-", "")' />
73
- insert into Author
74
- (id, username, password, email,bio, favourite_section)
75
- values
76
- (#{id}, #{username_bind}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})
77
- </insert >
78
- ```
79
-
80
- 3 . 使用主键自增:
76
+
77
+ ###2 .` @GeneratedValue(strategy = GenerationType.IDENTITY) `
78
+
79
+ 这个注解适用于主键自增的情况,支持下面这些数据库:
80
+
81
+ - <b >DB2</b >: ` VALUES IDENTITY_VAL_LOCAL() `
82
+ - <b >MYSQL</b >: ` SELECT LAST_INSERT_ID() `
83
+ - <b >SQLSERVER</b >: ` SELECT SCOPE_IDENTITY() `
84
+ - <b >CLOUDSCAPE</b >: ` VALUES IDENTITY_VAL_LOCAL() `
85
+ - <b >DERBY</b >: ` VALUES IDENTITY_VAL_LOCAL() `
86
+ - <b >HSQLDB</b >: ` CALL IDENTITY() `
87
+ - <b >SYBASE</b >: ` SELECT @@IDENTITY `
88
+ - <b >DB2_MF</b >: ` SELECT IDENTITY_VAL_LOCAL() FROM SYSIBM.SYSDUMMY1 `
89
+ - <b >INFORMIX</b >: ` select dbinfo('sqlca.sqlerrd1') from systables where tabid=1 `
90
+ - <b >JDBC</b >:这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段)。
91
+
92
+ 使用` GenerationType.IDENTITY ` 需要在全局配置中配置` IDENTITY ` 的参数值,并且需要根据数库配置` ORDER ` 属性。
93
+
94
+ 举例如下:
95
+
81
96
``` java
82
97
// 不限于@Id注解的字段,但是一个实体类中只能存在一个(继承关系中也只能存在一个)
83
98
@Id
84
99
@GeneratedValue (strategy = GenerationType . IDENTITY )
85
100
private Integer id;
86
- ```
87
- 增加这个注解后,__ 会回写ID__ 。
88
-
89
- 通过设置` @GeneratedValue ` 的` generator ` 参数可以支持更多的获取主键的方法,例如在Oracle中使用序列:
90
- ``` java
91
- @Id
92
- @GeneratedValue (strategy = GenerationType . IDENTITY ,generator = " select SEQ_ID.nextval from dual" )
93
- private Integer id;
94
- ```
95
- 使用Oracle序列的时候,还需要配置:
96
- ``` xml
97
- <property name =" ORDER" value =" BEFORE" />
98
- ```
99
- 因为在插入数据库前,需要先获取到序列值,否则会报错。
100
- 这种情况对于的xml类似下面这样:
101
- ``` xml
102
- <insert id =" insertAuthor" >
103
- <selectKey keyProperty =" id" resultType =" int" order =" BEFORE" >
104
- select SEQ_ID.nextval from dual
101
+ ```
102
+
103
+ 对应的XML形式为:
104
+
105
+ ``` xml
106
+ <insert id =" insertAuthor" >
107
+ <selectKey keyProperty =" id" resultType =" int" order =" AFTER" >
108
+ SELECT LAST_INSERT_ID()
105
109
</selectKey >
106
110
insert into Author
107
111
(id, username, password, email,bio, favourite_section)
108
112
values
109
113
(#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})
110
- </insert >
111
- ```
114
+ </insert >
115
+ ```
116
+
117
+ 注意` <selectKey> ` 中的内容就是` IDENTITY ` 参数值对应数据库的SQL
112
118
113
- 4 . 主键自增还有一种简单的写法:
119
+ ## # 3 . ` @GeneratedValue(generator = "UUID") `
114
120
``` java
115
- // 不限于@Id注解的字段,但是一个实体类中只能存在一个(继承关系中也只能存在一个)
116
- @GeneratedValue (generator = " JDBC" )
117
- private Integer id;
121
+ // 可以用于任意字符串类型长度超过32位的字段
122
+ @GeneratedValue (generator = " UUID" )
123
+ private String username;
124
+ ```
125
+ 该字段不会回写。这种情况对应类似如下的XML:
126
+ ``` xml
127
+ <insert id =" insertAuthor" >
128
+ <bind name =" username_bind" value =' @java.util.UUID@randomUUID().toString().replace("-", "")' />
129
+ insert into Author
130
+ (id, username, password, email,bio, favourite_section)
131
+ values
132
+ (#{id}, #{username_bind}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})
133
+ </insert >
118
134
```
119
- 这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系数据库管理系统的自动递增字段)。
120
- 这种情况对应的xml类似下面这样:
121
- ``` xml
122
- <insert id =" insertAuthor" useGeneratedKeys =" true" keyProperty =" id" >
123
- insert into Author (username,password,email,bio)
124
- values (#{username},#{password},#{email},#{bio})
125
- </insert >
126
- ```
127
135
136
+ ###4 .Oracle使用序列
137
+ ``` java
138
+ @Id
139
+ @GeneratedValue (strategy = GenerationType . IDENTITY ,generator = " select SEQ_ID.nextval from dual" )
140
+ private Integer id;
141
+ ```
142
+ 使用Oracle序列的时候,还需要配置:
143
+ ``` xml
144
+ <property name =" ORDER" value =" BEFORE" />
145
+ ```
146
+ 因为在插入数据库前,需要先获取到序列值,否则会报错。
147
+ 这种情况对于的xml类似下面这样:
148
+ ``` xml
149
+ <insert id =" insertAuthor" >
150
+ <selectKey keyProperty =" id" resultType =" int" order =" BEFORE" >
151
+ select SEQ_ID.nextval from dual
152
+ </selectKey >
153
+ insert into Author
154
+ (id, username, password, email,bio, favourite_section)
155
+ values
156
+ (#{id}, #{username}, #{password}, #{email}, #{bio}, #{favouriteSection,jdbcType=VARCHAR})
157
+ </insert >
158
+ ```
128
159
129
160
130
- ##3 . 将继承的Mapper接口添加到Mybatis配置中
161
+ ##4 . 将继承的Mapper接口添加到Mybatis配置中
131
162
132
- 例如本项目测试中的配置 :
163
+ ###非Spring项目中在mybatis配置文件中配置,如 :
133
164
``` xml
134
165
<mappers >
135
166
<mapper class =" tk.mybatis.mapper.mapper.CountryMapper" />
@@ -138,18 +169,27 @@ private Integer id;
138
169
</mappers >
139
170
```
140
171
141
- < b >附 : Spring 配置相关</ b >
172
+ ###Spring配置方式
142
173
143
174
如果你在Spring中配置Mapper接口,不需要像上面这样一个个配置,只需要有下面的这个扫描Mapper接口的这个配置即可:
144
175
``` xml
145
- <bean class =" org .mybatis.spring.mapper.MapperScannerConfigurer" >
176
+ <bean class =" tk .mybatis.spring.mapper.MapperScannerConfigurer" >
146
177
<property name =" basePackage" value =" com.isea533.mybatis.mapper" />
147
178
</bean >
148
- ```
179
+ ```
180
+
181
+ 另外因为通用接口都有顶层的接口,所以你还可以用下面的方式进行配置:
182
+ ``` xml
183
+ <bean class =" tk.mybatis.spring.mapper.MapperScannerConfigurer" >
184
+ <property name =" basePackage" value =" com.**.mapper" />
185
+ <property name =" markerInterface" value =" tk.mybatis.mapper.common.Mapper" />
186
+ </bean >
187
+ ```
188
+ 这样配置后,直接继承了` Mapper ` 接口的才会被扫描,` basePackage ` 可以配置的范围更大。
149
189
150
190
如果想在Spring4中使用泛型注入,还需要包含` Mapper<T> ` 所在的包,具体请看 [ 在Spring4中使用通用Mapper] ( http://git.oschina.net/free/Mapper/blob/master/wiki/UseMapperInSpring4.md ) 。
151
191
152
- ##4 . 代码中使用
192
+ ##5 . 代码中使用
153
193
154
194
例如下面这个简单的例子:
155
195
``` java
@@ -200,7 +240,7 @@ try {
200
240
201
241
直接在需要的地方注入Mapper继承的接口即可,和一般情况下的使用没有区别.
202
242
203
- ##5 .其他
243
+ ##6 .其他
204
244
205
245
如果你的实体是继承Map的,你可能需要将数据库查询的结果从大写下划线形式转换为驼峰形式,你可以搭配下面的拦截器使用:
206
246
0 commit comments