MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索。MyBatis 使用簡單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數(shù)據(jù)庫中的記錄。
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis 。
2013年11月遷移到Github,MyBatis的Github地址:https://github.com/mybatis/mybatis-3。
iBATIS一詞來源于“internet”和“abatis”的組合,是一個基于Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)。
每個MyBatis應(yīng)用程序主要都是使用SqlSessionFactory實例的,一個SqlSessionFactory實例可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置文件或者一個預(yù)定義的配置類的實例獲得。
1.使用Generator自動生成Dao層,Model層和Mapper層。
MyBatis Generator下載地址:http://www.mybatis.org/generator/
MyBatis Generator中文介紹:http://generator.sturgeon.mopaas.com/
以下用mybatis-generator-core-1.3.2.jar插件加jdbc數(shù)據(jù)庫連接包自動導(dǎo)出持久層dao包,model包和mapper包。
需要用到的Java包有:
mybatis-generator-core-1.3.2.jar,
mysql-connector-java-5.1.34.jar,
ojdbc14-10.2.0.1.0.jar,
sqljdbc4-4.0.jar。
配置文件: generator.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
|
<?xml version= "1.0" encoding= "UTF-8" ?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" > <generatorConfiguration> <!-- 配置屬性文件 用來在配置文件中引入變量 El表達式 --> <!-- 如果是用cmd方式運行 這里應(yīng)該寫url方式寫全路徑 因為找不到classpath 對于resource來說 --> <!-- <properties url= "file:///D:/workspaces/mybatisGen/bin/generatorConfig.properties" /> --> <!-- 數(shù)據(jù)庫驅(qū)動包位置 --> <!-- SQL Server數(shù)據(jù)驅(qū)動包 --> <classPathEntry location= "D:\JavaProject\generator\sqljdbc4-4.0.jar" /> <!-- Oracle數(shù)據(jù)驅(qū)動包 --> <!-- <classPathEntry location= "D:\Java\m2\repository\com\oracle\ojdbc14\10.2.0.1.0\ojdbc14-10.2.0.1.0.jar" /> --> <!-- MySQL數(shù)據(jù)驅(qū)動包 --> <!-- <classPathEntry location= "D:\JavaProject\generator\mysql-connector-java-5.1.34.jar" /> --> <!-- 此處指定生成針對MyBatis3的DAO--> <!-- id: 必須配置。這個上下文的惟一標識符。該值將被用在一些錯誤消息。 defaultModelType:用來定義生成模型類型策略。 1 .conditional 默認策略,為每個表生成一個Model class 2 .flat:將所有的表中生成一個Model class ,即這個類將保存所有表中字段 3 .hierarchical :如果表有一個主鍵,該模型將生成一個主鍵類,另一個類,用于容納任何BLOB列在表中,和另一個類,用于容納其余的字段。這個是一個適當(dāng)?shù)睦^承類之間的關(guān)系。 targetRuntime:此屬性用于指定運行時目標生成的代碼。 1 .MyBatis3 默認值 將生成對象兼容MyBatis版本 3.0 和更高版本,和JSE 5.0 和更高版本 (例如Java模型和mapper接口將使用泛型類型)。 “by example”方法在這些生成的對象支持幾乎無限的動態(tài)where子句。 此外,Java對象與這些生成器生成支持許多JSE 5.0 特性包括參數(shù)化的類型和注釋。 2 .Ibatis2Java2 3 .Ibatis2Java5 --> <context id= "MySQLTables" targetRuntime= "MyBatis3" defaultModelType= "conditional" > <!-- <plugin type= "org.mybatis.generator.plugins.EqualsHashCodePlugin" /> --> <!-- 用來生成注釋 1 . suppressAllComments 默認是 false 此屬性用于指定在生成的代碼是否將包括任何注釋。如果設(shè)置為 true 則不生成注釋 2 . suppressDate 默認是 false 此屬性用于指定在生成的注釋是否將包括MBG代時間戳。 --> <commentGenerator> <property name= "suppressAllComments" value= "true" /> </commentGenerator> <!-- 數(shù)據(jù)庫鏈接URL、用戶名、密碼 --> <!-- MySQL數(shù)據(jù)庫鏈接URL、用戶名、密碼 --> <!-- <jdbcConnection driverClass= "com.mysql.jdbc.Driver" connectionURL= "jdbc:mysql://127.0.0.1:3310/test" userId= "test" password= "1234" > </jdbcConnection> --> <!-- Oracle數(shù)據(jù)庫鏈接URL、用戶名、密碼 --> <!-- <jdbcConnection driverClass= "oracle.jdbc.driver.OracleDriver" connectionURL= "jdbc:oracle:thin:@127.0.0.1:1521:orcl" userId= "test" password= "1234" > </jdbcConnection> --> <!-- SQL Server數(shù)據(jù)庫鏈接URL、用戶名、密碼 --> <jdbcConnection driverClass= "com.microsoft.sqlserver.jdbc.SQLServerDriver" connectionURL= "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test" userId= "test" password= "1234" > </jdbcConnection> <!-- H2 <entry key= "jdbc.url" >jdbc:h2:tcp: //localhost/test</entry> <entry key= "jdbc.driver" >org.h2.Driver</entry> --> <!-- SQLServer2000 <entry key= "jdbc.url" >jdbc:microsoft:sqlserver: //localhost:1433;DatabaseName=[database]</entry> <entry key= "jdbc.driver" >com.microsoft.jdbc.sqlserver.SQLServerDriver</entry> --> <!-- SQLServer2005 <entry key= "jdbc.url" >jdbc:sqlserver: //192.168.0.98:1433;DatabaseName=[database]</entry> <entry key= "jdbc.driver" >com.microsoft.sqlserver.jdbc.SQLServerDriver</entry> --> <!-- JTDs for SQLServer <entry key= "jdbc.url" >jdbc:jtds:sqlserver: //192.168.0.102:1433/[database];tds=8.0;lastupdatecount=true</entry> <entry key= "jdbc.driver" >net.sourceforge.jtds.jdbc.Driver</entry> --> <!-- PostgreSql <entry key= "jdbc.url" >jdbc:postgresql: //localhost/[database]</entry> <entry key= "jdbc.driver" >org.postgresql.Driver</entry> --> <!-- Sybase <entry key= "jdbc.url" >jdbc:sybase:Tds:localhost: 5007 /[database]</entry> <entry key= "jdbc.driver" >com.sybase.jdbc.SybDriver</entry> --> <!-- DB2 <entry key= "jdbc.url" >jdbc:db2: //localhost:5000/[database]</entry> <entry key= "jdbc.driver" >com.ibm.db2.jdbc.app.DB2Driver</entry> --> <!-- HsqlDB <entry key= "jdbc.url" >jdbc:hsqldb:mem:generatorDB</entry> <entry key= "jdbc.driver" >org.hsqldb.jdbcDriver</entry> --> <!-- Derby <entry key= "jdbc.url" >jdbc:derby: //localhost/databaseName</entry> <entry key= "jdbc.driver" >org.apache.derby.jdbc.ClientDriver</entry> --> <!-- java類型解析器 可選配置 --> <!-- <javaTypeResolver type= "" > type屬性: 這可用于指定一個用戶提供的Java類型解析器。這個類必須實現(xiàn)接口org.mybatis.generator.api。 JavaTypeResolver,必須有一個公共的默認構(gòu)造函數(shù)。屬性還可以接受特殊的值默認在這種情況下,將使用默認的實現(xiàn)(這同樣的效果不指定類型)。 該標簽支持的屬性: forceBigDecimals:默認是 false 是否強制使用BigDecimal來表示所有的十進制和數(shù)值字段。 •如果規(guī)模很大,長度大于 18 ,將使用BigDecimal類型。 •如果其長度為 10 到 18 ,則Java類型解析器將java.lang.Long來代替了。 •如果長度為 5 到 9 ,然后Java類型解析器將替換為一個Java.lang.integer。 •如果其長度小于 5 ,則Java類型解析器將以java.lang.Short替代。 --> <javaTypeResolver> <property name= "forceBigDecimals" value= "false" /> </javaTypeResolver> <!-- 生成vo對象 --> <!-- < javaModelGenerator >元素用于定義Java模型生成的屬性。 Java模型生成器建立主鍵類,記錄類,和查詢示例類相匹配的表進行自省。這個元素是所需的子元素<上下文>元素。 支持的屬性: constructorBased: 此屬性用于選擇是否MyBatis生成器將生成一個類的構(gòu)造函數(shù),它接受一個值類中的每個字段。同時,SQL結(jié)果地圖將建成投入使用構(gòu)造函數(shù)而不是“setter”每個字段。 這個屬性是只適用于MyBatis3和將被忽略了iBATIS2。 默認值是 false 。 immutable: 不可變,此屬性用于選擇是否MyBatis生成器將產(chǎn)生不可變模型類——這意味著類不會有“setter”方法和構(gòu)造函數(shù)會接受類中每個字段的值。默認為 false 。 trimStrings: 此屬性用于選擇MyBatis生成器是否添加代碼來修剪的字符字段從數(shù)據(jù)庫返回的空白空間。 這很有用,如果您的數(shù)據(jù)庫將數(shù)據(jù)存儲在字符字段而不是VARCHAR字段。MyBatis生成器將插入代碼來削減字符字段。 默認值是 false 。 --> <!-- 生成實體類的包名和位置,這里配置將生成的實體類放在com.ouc.model這個包下 --> <javaModelGenerator targetPackage= "com.ouc.model" targetProject= "D:\JavaProject\generator\src" > <property name= "enableSubPackages" value= "true" /> <property name= "trimStrings" value= "true" /> </javaModelGenerator> <!-- 生成用于查詢的mapping對象 --> <!-- 生成的SQL映射文件包名和位置,這里配置將生成的SQL映射文件放在com.ouc.mapping這個包下 --> <sqlMapGenerator targetPackage= "com.ouc.mapping" targetProject= "D:\JavaProject\generator\src" > <property name= "enableSubPackages" value= "true" /> </sqlMapGenerator> <!-- 生成DAO的類文件以及配置文件 --> <!-- < javaClientGenerator >元素是用來定義Java客戶機代碼生成器的屬性。 Java客戶機生成器用來建立Java接口和類,以便可以方便地使用生成的Java模型和XML映射文件。 對于iBATIS2目標環(huán)境,這些生成的對象采用形式的DAO接口和實現(xiàn)類。 對于MyBatis,生成的對象采用mapper形式的接口。 這個元素是一個可選的子元素。 如果你不指定這個元素,MyBatis生成器(MBG)不會生成Java客戶端接口和類。 其中的type屬性: 如果targetRuntime 為MyBatis3 XMLMAPPER:生成的對象將Java接口MyBatis 3 .x mapper基礎(chǔ)設(shè)施。接口將會依賴生成的XML映射器文件。一般都是使用這個XMLMAPPER. --> <!-- 生成DAO的包名和位置,這里配置將生成的dao類放在com.ouc.dao這個包下 --> <javaClientGenerator type= "XMLMAPPER" targetPackage= "com.ouc.dao" targetProject= "D:\JavaProject\generator\src" > <property name= "enableSubPackages" value= "true" /> </javaClientGenerator> <!-- <table>元素用于選擇數(shù)據(jù)庫中的一個表。選擇的表將導(dǎo)致為每個表生成以下對象: •一個MyBatis / iBATIS•格式化的SQL的映射文件 •一組類,形成了“模型”表包括: •一個類來匹配•表的主鍵(如果表有一個主鍵)。 •表中字段匹配的,不是在主鍵,而非BLOB字段。這個類將擴展主鍵,如果有一個。 •一個類來持有任何表中的BLOB字段(如果有的話)。這個類將擴展其中一個的前面兩個類取決于表的配置。 •一個類,用于生成動態(tài)where子句,在不同的“by Example”方法(selectByExample,deleteByExample)。 •(可選)DAO接口和類 tableName:必須配置 指定表的名稱 domainObjectName:生成javabean對象的基本名稱。如果未指定,MBG將自動基于表名生成。 這個名字(無論是在這里指定,或自動生成)將被用來作為域類名和DAO類的名字。 enableInsert:是否生成插入語句。默認是 true enableSelectByPrimaryKey:是否通過主鍵生成選擇語句。不管是否有這種設(shè)置,如果該表沒有一個主鍵將不會生成。 enableUpdateByPrimaryKey:是否通過主鍵生成更新語句。如果該表沒有主鍵,不管是否設(shè)置該屬性,語句將不會生成。 enableDeleteByPrimaryKey:是否通過主鍵生成刪除語句。如果該表沒有主鍵,不管這種設(shè)置該屬性,語句將不會生成。 enableDeleteByExample:是否通過example對象生成刪除語句。這個聲明使得許多不同的動態(tài)刪除在運行時生成。 enableCountByExample:是否通過example對象生成計算行數(shù)語句。該語句將返回一個表中的行數(shù)相匹配的example。 enableUpdateByExample:是否通過example對象生成更新語句。該語句將更新一個表中相匹配的記錄。 selectByPrimaryKeyQueryId:這個值將被添加到選擇列表中選擇通過主鍵的聲明在本表格:“' <值>作為QUERYID”。這可以用于識別查詢在DBA在運行時跟蹤工具。如果你需使用,你應(yīng)該指定一個唯一的id為每個不同的查詢生成MBG。 selectByExampleQueryId:這個值將被添加到選擇列表中選擇通過例子的聲明在本表格:“' <值>作為QUERYID”。這可以用于識別查詢在DBA在運行時跟蹤工具。如果你需使用,你應(yīng)該指定一個唯一的id為每個不同的查詢生成MBG。 enableSelectByExample:是否應(yīng)該生成通過example的選擇語句。這個聲明使得許多不同的動態(tài)查詢是在運行時生成。 modelType:此屬性用于覆蓋默認的模型類型,如果你想對這張表這么做。如果未指定,MBG將生成的域?qū)ο蠡谏舷挛哪J的模型類型。 該模型類型定義了如何將生成MBG域類。 一些模型類型MBG將生成一個單一的域類為每個表,和其他可能產(chǎn)生不同的類MBG取決于表的結(jié)構(gòu)。 escapeWildcards:排除通配符。這意味著無論SQL通配符( ' _ ' 和 ' % ' )的模式和表名都應(yīng)該避免在搜尋列。 這是一些驅(qū)動要求如果模式或表包含一個SQL通配符(例如,如果一個表的名字是MY_TABLE,一些驅(qū)動要求的下劃線字符進行轉(zhuǎn)義)。 --> <!-- 要生成那些表(更改tableName和domainObjectName就可以) --> <table tableName= "V_SupplyUser" domainObjectName= "VSupplyUser" enableCountByExample= "false" enableUpdateByExample= "false" enableDeleteByExample= "false" enableSelectByExample= "false" selectByExampleQueryId= "false" /> <table tableName= "WJ_GateList" domainObjectName= "WJGateList" enableCountByExample= "false" enableUpdateByExample= "false" enableDeleteByExample= "false" enableSelectByExample= "false" selectByExampleQueryId= "false" /> </context> </generatorConfiguration> |
打開cmd命令行,轉(zhuǎn)到配置文件所在的文件下,執(zhí)行如下生成語句:
1
|
java -jar mybatis-generator-core- 1.3 . 2 .jar -configfile generator.xml -overwrite |
命令執(zhí)行完畢,可以看到對應(yīng)路徑下生成dao包,model包和mapper包文件。
2.MyBatis框架整合
1)MyBatis使用參數(shù)配置:sqlMapConfig.xml。
① 緩存配置(Cache):cacheEnabled:全局開關(guān):默認是true,如果它配成false,其余各個Mapper XML文件配成支持cache也沒用。
② 延遲加載:
lazyLoadingEnabled:true使用延遲加載,false禁用延遲加載,默認為true,當(dāng)禁用時, 所有關(guān)聯(lián)對象都會即時加載。
aggressiveLazyLoading:true啟用時,當(dāng)延遲加載開啟時訪問對象中一個懶對象屬性時,將完全加載這個對象的所有懶對象屬性。false,當(dāng)延遲加載時,按需加載對象屬性(即訪問對象中一個懶對象屬性,不會加載對象中其他的懶對象屬性)。默認為true。
③ multipleResultSetsEnabled:允許和不允許單條語句返回多個數(shù)據(jù)集(取決于驅(qū)動需求)。默認為true。
④ useColumnLabel:使用列標簽代替列名稱。不同的驅(qū)動器有不同的做法。參考一下驅(qū)動器文檔,或者用這兩個不同的選項進行測試一下。
⑤ useGeneratedKeys:允許JDBC生成主鍵。需要驅(qū)動器支持。如果設(shè)為了true,這個設(shè)置將強制使用被生成的主鍵,有一些驅(qū)動器不兼容不過仍然可以執(zhí)行。
⑥ autoMappingBehavior:指定MyBatis 是否并且如何來自動映射數(shù)據(jù)表字段與對象的屬性。PARTIAL將只自動映射簡單的,沒有嵌套的結(jié)果。FULL 將自動映射所有復(fù)雜的結(jié)果。
⑦ defaultExecutorType:配置和設(shè)定執(zhí)行器,SIMPLE執(zhí)行器執(zhí)行其它語句。REUSE執(zhí)行器可能重復(fù)使用prepared statements語句,BATCH執(zhí)行器可以重復(fù)執(zhí)行語句和批量更新。
⑧ defaultStatementTimeout:設(shè)置一個時限,以決定讓驅(qū)動器等待數(shù)據(jù)庫回應(yīng)的多長時間為超時。
完整sqlMapConfig.xml配置文件如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
<?xml version= "1.0" encoding= "UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" > <configuration> <settings> <setting name= "cacheEnabled" value= "true" /> <setting name= "lazyLoadingEnabled" value= "true" /> <setting name= "multipleResultSetsEnabled" value= "true" /> <setting name= "useColumnLabel" value= "true" /> <setting name= "useGeneratedKeys" value= "false" /> <setting name= "autoMappingBehavior" value= "PARTIAL" /> <setting name= "defaultExecutorType" value= "SIMPLE" /><!-- SIMPLE REUSE BATCH --> <!-- <setting name= "defaultExecutorType" value= "BATCH" /> --> <setting name= "defaultStatementTimeout" value= "" /> <setting name= "safeRowBoundsEnabled" value= "false" /> <setting name= "mapUnderscoreToCamelCase" value= "false" /> <setting name= "localCacheScope" value= "SESSION" /> <!-- <setting name= "jdbcTypeForNull" value= "OTHER" /> --> <setting name= "jdbcTypeForNull" value= "NULL" /> <setting name= "lazyLoadTriggerMethods" value= "equals,clone,hashCode,toString" /> </settings> <typeAliases> <!-- 模塊 --> <typeAlias alias= "User" type= "com.ouc.mkhl.platform.authority.model.User" /> <typeAlias alias= "Role" type= "com.ouc.mkhl.platform.authority.model.Role" /> <typeAlias alias= "Equipment" type= "com.ouc.mkhl.platform.basedata.model.Equipment" /> <typeAlias alias= "Factory" type= "com.ouc.mkhl.platform.basedata.model.Factory" /> </typeAliases> <typeHandlers> <typeHandler handler= "com.ouc.openplatform.dao.mybatis.SerializableTypeHandler" /> </typeHandlers> </configuration> |
序列化特殊值處理:SerializableTypeHandler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package com.ouc.openplatform.dao.mybatis; import java.io.Serializable; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; /** * @author WuPing */ public class SerializableTypeHandler extends BaseTypeHandler<Serializable> { @Override public void setNonNullParameter(PreparedStatement ps, int i, Serializable parameter, JdbcType jdbcType) throws SQLException { ps.setObject(i, parameter); } @Override public Serializable getNullableResult(ResultSet rs, String columnName) throws SQLException { return (Serializable)rs.getObject(columnName); } @Override public Serializable getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return (Serializable)rs.getObject(columnIndex); } @Override public Serializable getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return (Serializable)cs.getObject(columnIndex); } } |
2)結(jié)果集resultMap:
MyBatis中在查詢進行select映射的時候,返回類型可以用resultType,也可以用resultMap,resultType是直接表示返回類型的,而resultMap則是對外部ResultMap的引用,但是resultType跟resultMap不能同時存在。在MyBatis進行查詢映射的時候,其實查詢出來的每一個屬性都是放在一個對應(yīng)的Map里面的,其中鍵是屬性名,值則是其對應(yīng)的值。當(dāng)提供的返回類型屬性是resultType的時候,MyBatis會將Map里面的鍵值對取出賦給resultType所指定的對象對應(yīng)的屬性。所以其實MyBatis的每一個查詢映射的返回類型都是ResultMap,只是當(dāng)我們提供的返回類型屬性是resultType的時候,MyBatis對自動的給我們把對應(yīng)的值賦給resultType所指定對象的屬性,而當(dāng)我們提供的返回類型是resultMap的時候,因為Map不能很好表示領(lǐng)域模型,我們就需要自己再進一步的把它轉(zhuǎn)化為對應(yīng)的對象,這常常在復(fù)雜查詢中很有作用。
示例:UserBaseResultMap
1
2
3
4
5
6
7
8
9
10
|
<resultMap id= "UserBaseResultMap" type= "User" > <id column= "id" property= "id" jdbcType= "INTEGER" /> <result column= "userName" property= "userName" jdbcType= "VARCHAR" /> <result column= "password" property= "password" jdbcType= "VARCHAR" /> <result column= "email" property= "email" jdbcType= "VARCHAR" /> <result column= "trueName" property= "trueName" jdbcType= "VARCHAR" /> <result column= "sex" property= "sex" jdbcType= "VARCHAR" /> <result column= "age" property= "age" jdbcType= "INTEGER" /> <result column= "telephone" property= "telephone" jdbcType= "VARCHAR" /> </resultMap> |
model類:User
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
package com.ouc.mkhl.platform.authority.model; import java.io.Serializable; //用戶信息 public class User implements Serializable { private static final long serialVersionUID = 1098321123L; private Integer id; //用戶Id private String userName; //用戶名 private String password; //未加密密碼 private String email; //郵箱 private String trueName; //真實姓名 private String sex; //性別 private Integer age; //年齡 private String telephone; //手機 public Integer getId() { return id; } public void setId(Integer id) { this .id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this .userName = userName == null ? null : userName.trim(); } public String getPassword() { return password; } public void setPassword(String password) { this .password = password == null ? null : password.trim(); } public String getEmail() { return email; } public void setEmail(String email) { this .email = email == null ? null : email.trim(); } public String getTrueName() { return trueName; } public void setTrueName(String trueName) { this .trueName = trueName == null ? null : trueName.trim(); } public String getSex() { return sex; } public void setSex(String sex) { this .sex = sex == null ? null : sex.trim(); } public Integer getAge() { return age; } public void setAge(Integer age) { this .age = age; } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this .telephone = telephone == null ? null : telephone.trim(); } } |
3)增刪改查:
(1)select查詢:
① id:在這個模式下唯一的標識符,可被其它語句引用。
② parameterType:傳給此語句的參數(shù)的完整類名或別名。
③ resultType:語句返回值類型的整類名或別名。注意,如果是集合,那么這里填寫的是集合的項的整類名或別名,而不是集合本身的類名。(resultType 與resultMap 不能并用)
④ resultMap:引用的外部resultMap名。結(jié)果集映射是MyBatis 中最強大的特性。許多復(fù)雜的映射都可以輕松解決。(resultType 與resultMap 不能并用)
⑤ flushCache:如果設(shè)為true,則會在每次語句調(diào)用的時候就會清空緩存。select語句默認設(shè)為false。
⑥ useCache:如果設(shè)為true,則語句的結(jié)果集將被緩存。select語句默認設(shè)為false。
⑦ timeout :設(shè)置驅(qū)動器在拋出異常前等待回應(yīng)的最長時間,默認為不設(shè)值,由驅(qū)動器自己決定。
示例:查詢所有用戶信息:selectUsers
1
2
3
|
<select id= "selectUsers" resultMap= "UserBaseResultMap" > select id,userName,email from user </select> |
(2) insert插入:saveUser
此處數(shù)據(jù)庫表使用主鍵自增,主鍵為id。
① fetchSize:設(shè)置一個值后,驅(qū)動器會在結(jié)果集數(shù)目達到此數(shù)值后,激發(fā)返回,默認為不設(shè)值,由驅(qū)動器自己決定。
② statementType:statement,preparedstatement,callablestatement。預(yù)準備語句、可調(diào)用語句。
③ useGeneratedKeys:使用JDBC的getGeneratedKeys方法來獲取數(shù)據(jù)庫自己生成的主鍵(MySQL、SQLSERVER等關(guān)系型數(shù)據(jù)庫會有自動生成的字段)。
④ keyProperty:標識一個將要被MyBatis設(shè)置進getGeneratedKeys的key所返回的值,或者為insert語句使用一個selectKey子元素。
1
2
3
4
5
6
|
<insert id= "saveUser" parameterType= "User" > insert into user (userName, password, email, trueName, sex, age, telephone) values (#{userName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}, #{trueName,jdbcType=VARCHAR}, #{sex,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, #{telephone,jdbcType=VARCHAR}) </insert> |
(3)update更新:動態(tài)更新SQL:updateUser
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<update id= "updateUser" parameterType= "User" > update user <set > < if test= "userName != null" > userName = #{userName,jdbcType=VARCHAR}, </ if > < if test= "password != null" > password = #{password,jdbcType=VARCHAR}, </ if > < if test= "email != null" > email = #{email,jdbcType=VARCHAR}, </ if > < if test= "trueName != null" > trueName = #{trueName,jdbcType=VARCHAR}, </ if > < if test= "sex != null" > sex = #{sex,jdbcType=VARCHAR}, </ if > < if test= "age != null" > age = #{age,jdbcType=INTEGER}, </ if > < if test= "telephone != null" > telephone = #{telephone,jdbcType=VARCHAR}, </ if > </set> where id = #{id,jdbcType=INTEGER} </update> |
(4)delete刪除:deleteUser
1
2
3
4
|
<delete id= "deleteUser" parameterType= "Integer" > delete from user where id = #{id,jdbcType=INTEGER} </delete> |
(5)sql: Sql元素用來定義一個可以復(fù)用的SQL語句段,供其它語句調(diào)用。
1
2
3
4
5
6
7
8
|
<sql id= "UserBaseColumnList" > userName, password, email, telephone </sql> <select id= "getUsers" resultMap= "UserBaseResultMap" > select <include refid= "UserBaseColumnList" /> from user </select> |
(6)參數(shù):parameters:MyBatis可以使用基本數(shù)據(jù)類型和Java的復(fù)雜數(shù)據(jù)類型。
基本數(shù)據(jù)類型,String,int,date等。
使用基本數(shù)據(jù)類型,只能提供一個參數(shù),所以需要使用Java實體類,或Map類型做參數(shù)類型。通過#{}可以直接得到其屬性。
① 基本數(shù)據(jù)類型參數(shù):String
1
2
3
4
|
<select id= "getUserByName" resultType= "User" parameterType= "String" > select id, userName, email from user where userName = #{userName,jdbcType=VARCHAR} </select> |
Java代碼:
1
|
public User getUserByName(String name); // 根據(jù)用戶名獲取用戶信息 |
② Java實體類型參數(shù):User
1
2
3
4
5
6
|
<insert id= "saveUser" parameterType= "User" > insert into user (userName, password, email, trueName, sex, age, telephone) values (#{userName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{email,jdbcType=VARCHAR}, #{trueName,jdbcType=VARCHAR}, #{sex,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER}, #{telephone,jdbcType=VARCHAR}) </insert> |
Java代碼:
1
|
public int saveUser(User user); // 插入用戶信息 |
③ Map參數(shù):Map<String, Object> recordMap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<select id= "selectChildGroupTotalNum" resultType= "Integer" > select count(*) from groupinfo <trim prefix= "WHERE" prefixOverrides= "AND|OR" > and id in <foreach collection= "idStr" item= "ids" open= "(" separator= "," close= ")" > #{ids} </foreach> < if test= "name!= null and name!='' " > and name LIKE CONCAT(CONCAT( '%' , #{name}), '%' ) </ if > < if test= "description!= null and description!='' " > AND description LIKE CONCAT(CONCAT( '%' , #{description}), '%' ) </ if > < if test= "type != null and type!=-1 " > AND type = #{type,jdbcType=INTEGER} </ if > < if test= "category != null and category!=-1 " > AND category = #{category,jdbcType=INTEGER} </ if > </trim> </select> |
Java代碼:
1
2
3
4
5
6
7
8
9
|
//獲取子組總記錄數(shù) public int selectChildGroupTotalNum(Map<String, Object> recordMap); Map<String, Object> recordMap = new HashMap<String, Object>(); recordMap.put( "idStr" , group.getChildgroupids().split( "," )); recordMap.put( "name" , name); recordMap.put( "description" , description); recordMap.put( "type" , - 1 ); recordMap.put( "category" , - 1 ); childGroupTotalNum = groupDao.selectChildGroupTotalNum(recordMap); |
④ 多參數(shù):
方法一:按順序傳遞參數(shù)。
1
2
3
4
5
|
<!-- 根據(jù)參數(shù)名查詢參數(shù) --> <select id= "selectSensorNobySensorName" resultType= "Integer" useCache= "false" flushCache= "true" > select SensorNo from sensorconfig where Name = #{ 0 } and TestunitNo = #{ 1 } and LABCODE = #{ 2 } </select> |
Java代碼:
1
2
|
//根據(jù)參數(shù)名查詢參數(shù)ID public int selectSensorNobySensorName(String sensorName, int testUnitNo, String labCode); |
方法二:接口參數(shù)上添加@Param注解。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<select id= "selectByUserNameAndVCode" resultMap= "UserBaseResultMap" > select id, userName from user <trim prefix= "WHERE" prefixOverrides= "AND|OR" > < if test= "userName!= null and userName!='' " > and userName LIKE CONCAT(CONCAT( '%' , #{userName}), '%' ) </ if > < if test= "supplierno!= null and supplierno!='' " > and supplierNo LIKE CONCAT(CONCAT( '%' , #{supplierno}), '%' ) </ if > and supplierNo != 'test' </trim> LIMIT #{startIndex},#{pageSize} </select> |
Java代碼:
1
2
3
4
5
|
// 根據(jù)用戶名和V碼查詢用戶信息 public List<User> selectByUserNameAndVCode( @Param ( "userName" ) String userName, @Param ( "supplierno" ) String supplierno, @Param ( "startIndex" ) int startIndex, @Param ( "pageSize" ) int pageSize); |
4)動態(tài)SQL語句:
selectKey標簽,if標簽,if + where的條件判斷,if + set的更新語句,if + trim代替where/set標簽,trim代替set,choose (when, otherwise),foreach標簽。動態(tài)SQL語句算是MyBatis最靈活的部分吧,用好了非常方便。
示例:selectTotalNumByAccountType
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<select id= "selectTotalNumByAccountType" resultType= "Integer" > select count(*) from user <trim prefix= "WHERE" prefixOverrides= "AND|OR" > and id not in <foreach collection= "idStr" item= "ids" open= "(" separator= "," close= ")" > #{ids} </foreach> < if test= "userName!= null and userName!='' " > and userName LIKE CONCAT(CONCAT( '%' , #{userName}), '%' ) </ if > < if test= "supplierno!= null and supplierno!='' " > and supplierNo LIKE CONCAT(CONCAT( '%' , #{supplierno}), '%' ) </ if > < if test= "trueName!= null and trueName!='' " > and trueName LIKE CONCAT(CONCAT( '%' , #{trueName}), '%' ) </ if > AND accountType = #{accountType} </trim></select> |
以上所述是小編給大家介紹的MyBatis持久層框架的用法知識小結(jié),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對服務(wù)器之家網(wǎng)站的支持!