這兩天開始了壹個新項目,因為項目組成員壹直在用mybatis。雖然我更喜歡jpa的極簡模式,但是為了保持項目技術選擇的統壹性,我還是決定用mybatis。在網上找了壹些關於spring boot和mybatis組合的資料。形式多樣,人也累。結合mybatis的官方demo和文檔,終於找到了最簡單的兩種模式,花了壹天時間總結分享。
orm框架的本質是簡化編程中操作數據庫的編碼。到現在基本只剩下兩個了,壹個是hibernate,號稱不用寫壹句sql,另壹個是mybatis,可以靈活調試動態SQL。兩者各有特點,在企業級系統開發中可以根據需求靈活使用。我們發現壹個有趣的現象:傳統企業大多喜歡用hibernate,互聯網行業通常用mybatis。
hibernate的特點是所有的sql都是Java代碼生成的,不需要跳出程序寫(讀)sql,具有編程的完整性。最上面是spring data jpa的模式,基本上可以根據方法名生成對應的sql。了解不多的,請看我上壹篇文章spring boot(V):spring data JPA的使用。
Mybatis在前期使用起來比較麻煩,需要各種配置文件、實體類、dao層映射關聯,以及大量其他配置。當然,mybatis也發現了這個弊端。前期開發生成器是根據表格結果自動生成實體類、配置文件和dao層代碼,可以減少壹部分開發。後期做了很多優化,可以用註釋。可以自動管理dao層和配置文件。在頂部,今天將討論這種模式。mybatis-spring-boot-starter就是springboot+mybatis,不需要配置文件就可以完全註釋,或者簡單配置就可以輕松使用。
現在想想彈簧靴太棒了,任何與彈簧靴相關的東西都被簡化了。
my batis-彈簧靴-起動器
官方描述:我的巴蒂斯彈簧啟動將幫助您使用我的巴蒂斯與Spring Boot
其實myBatis在看到溫泉開機如何之後,已經開發了壹套解決方案來湊熱鬧,不過這個解決方案真的解決了很多問題,用起來真的流暢很多。Mybatis-spring-boot-starter主要有兩種解決方案,壹種是使用註釋解決所有問題,另壹種是簡化的舊傳統。
當然任何模式都需要先導入mybatis-spring-boot-starter的pom文件,現在最新版本是1.1.1(差不多是雙11:)了
& lt依賴性& gt
& ltgroupId & gtorg . my batis . spring . boot & lt;/groupId & gt;
& ltartifactId & gtmy batis-spring-boot-starter & lt;/artifact id & gt;
& lt版本& gt1.1.1 & lt;/version & gt;
& lt/dependency & gt;1234512345
好了,下面分別介紹兩種開發模式。
不帶配置文件的註釋版本
所有的事情都是通過註釋來完成的。
1添加相關maven文件
& lt依賴關系& gt
& lt依賴性& gt
& ltgroupId & gtorg . spring framework . boot & lt;/groupId & gt;
& ltartifactId & gt彈簧靴起動器& lt/artifact id & gt;
& lt/dependency & gt;
& lt依賴性& gt
& ltgroupId & gtorg . spring framework . boot & lt;/groupId & gt;
& ltartifactId & gt彈簧啟動起動器測試& lt/artifact id & gt;
& lt範圍& gt測試& lt/scope & gt;
& lt/dependency & gt;
& lt依賴性& gt
& ltgroupId & gtorg . spring framework . boot & lt;/groupId & gt;
& ltartifactId & gtspring-boot-starter-web & lt;/artifact id & gt;
& lt/dependency & gt;
& lt依賴性& gt
& ltgroupId & gtorg . my batis . spring . boot & lt;/groupId & gt;
& ltartifactId & gtmy batis-spring-boot-starter & lt;/artifact id & gt;
& lt版本& gt1.1.1 & lt;/version & gt;
& lt/dependency & gt;
& lt依賴性& gt
& ltgroupId & gtmysql & lt/groupId & gt;
& ltartifactId & gtMySQL-connector-Java & lt;/artifact id & gt;
& lt/dependency & gt;
& lt依賴性& gt
& ltgroupId & gtorg . spring framework . boot & lt;/groupId & gt;
& ltartifactId & gtspring-boot-devtools/artifact id & gt;
& lt可選& gttrue & lt/可選& gt
& lt/dependency & gt;
& lt/dependencies & gt;1234567891011121314151617181920212223242526272829123456789106 5438+01121314151617181920212223242526272829
這裏就不貼完整的pom包了。我們直接看源代碼。
2.向application.properties添加相關配置
my batis . type-aliases-package = com . neo . entity
spring . data source . driver class name = com . MySQL . JDBC . driver
spring . data source . URL = JDBC:MySQL://localhost:3306/test 1?useUnicode = true & amp字符編碼=utf-8
spring.datasource .用戶名= root
spring . data source . password = root 123456123456
Springboot會自動加載spring.datasource.*的配置,數據源會自動註入sqlSessionFactory,sqlSessionFactory會自動註入Mapper。對了,什麽都不用管,拿起來用就行了。
將掃描映射器包@ Mappers Scan添加到啟動類。
@SpringBootApplication
@MapperScan("com.neo.mapper ")
公共類應用程序{
公共靜態void main(String[] args) {
spring application . run(application . class,args);
}
}1234567812345678
或者直接在Mapper類上添加comments @ Mapper。建議用上面那個,不然給每個映射器加註釋挺麻煩的。
3.開發映射器
第三步是最關鍵的壹步,sql制作都在這裏了。
公共接口用戶映射程序{
@Select("SELECT * FROM users ")
@結果({
@Result(property = "userSex ",column = "user_sex ",javaType = UserSexEnum.class),
@Result(property = "nickName ",column = "nick_name ")
})
列表& lt用戶實體& gtget all();
@ Select(" Select * FROM users WHERE id = # { id } ")
@結果({
@Result(property = "userSex ",column = "user_sex ",javaType = UserSexEnum.class),
@Result(property = "nickName ",column = "nick_name ")
})
UserEntity getOne(長id);
@ Insert(" Insert INTO users(userName,passWord,user_sex)值(#{userName},#{passWord},#{userSex})")
void insert(UserEntity用戶);
@Update("更新用戶設置用戶名= # {用戶名},昵稱= # {昵稱},其中id =#{id} ")
void更新(UserEntity用戶);
@Delete("從id =#{id} "的用戶中刪除")
void delete(長id);
}12345678910111213141516171819202122232425261234567891065438+ 01121314151617181920212223242526
為了更貼近生產,我特意在數據庫中給user_sex和nick_name兩個屬性加了下劃線,這兩個屬性和實體類的屬性名不壹致,另外user_sex用了枚舉。
@Select是查詢類的註釋,所有查詢都使用它。
@Result修飾返回的結果集,關聯的實體類屬性與數據庫字段壹壹對應。如果實體類屬性和數據庫屬性名稱壹致,則不需要修飾該屬性。
@Insert插入數據庫使用。直接傳入實體類會自動將屬性解析為相應的值。
@Update負責修改,也可以直接傳入對象。
@delete負責刪除
了解有關屬性的更多信息,請參考此處。
請註意使用#符號和$符號的區別:
//此示例創建壹個準備好的語句,類似於select * from teacher where name =?;
@ Select(" Select * from teacher where name = # { name } ")
教師selectteachforleavenname(@ Param(" name ")字符串名);
//此示例創建壹個n內聯語句,類似於select * from teacher where name = ' someName ';
@ Select(" Select * from teacher where name = ' $ { name } ' ")
教師selectteachforleavenname(@ Param(" name ")字符串名);12345671234567
4.使用
以上三步基本完成了相關道層的開發,使用時作為普通類註入就可以了。
@RunWith(SpringRunner.class)
@SpringBootTest
公共類UserMapperTest {
@自動連線
專用用戶映射程序用戶映射程序;
@測試
public void testInsert()引發異常{
UserMapper.insert(新用戶實體(" aa "," a123456 ",UserSexEnum。MAN));
UserMapper.insert(新用戶實體(" bb "," b123456 ",UserSexEnum。女));
UserMapper.insert(新用戶實體(" cc "," b123456 ",UserSexEnum。女));
Assert.assertEquals(3,UserMapper.getAll()。size());
}
@測試
公共void testQuery()引發異常{
列表& lt用戶實體& gtusers = user mapper . get all();
system . out . println(users . tostring());
}
@測試
public void testUpdate()引發異常{
user entity user = user mapper . get one(3l);
system . out . println(user . tostring());
user . set nickname(" neo ");
UserMapper.update(用戶);
assert . assert true((“neo”。equals(UserMapper.getOne(3l))。get nickname()))));
}
}123456789101112131415161718192021222324252627282930311234567 8910111213141516171819202122232425262728293031
源代碼中的controler層有完整的增刪改,這裏就不貼了。
源代碼在這裏spring-boot-mybatis-annotation
極簡xml版本
極簡的xml版本保持了映射文件的老傳統,優化主要體現在:是實現層不需要實現dao,系統會根據方法名自動在映射文件中找到對應的sql。
1,配置
pom文件與以前的版本相同,只是在application.properties中添加了以下配置
mybatis . config-locations = class path:mybatis/mybatis-config . XML
mybatis . mapper-locations = class path:mybatis/mapper/* . XML 1212
指定了mybatis基本配置文件和實體類映射文件的地址。
Mybatis-config.xml配置
& lt配置& gt
& lttypeAliases & gt
& lttype alias alias = " Integer " type = " Java . lang . Integer "/& gt;
& lttype alias alias = " Long " type = " Java . lang . Long "/& gt;
& lttype alias alias = " HashMap " type = " Java . util . HashMap "/& gt;
& lttype alias alias = " linked hashmap " type = " Java . util . linked hashmap "/& gt;
& lttype alias alias = " ArrayList " type = " Java . util . ArrayList "/& gt;
& lttype alias alias = " linked list " type = " Java . util . linked list "/& gt;
& lt/type aliases & gt;
& lt/configuration & gt;1234567891012345678910
妳也可以在這裏添加壹些mybatis的基本配置。
2.添加用戶的映射文件。
& ltmapper namespace = " com . neo . mapper . user mapper " & gt;
& ltresult map id = " base result map " type = " com . neo . entity . user entity " & gt;
& ltid column = " id " property = " id " JDBC type = " BIGINT "/& gt;
& lt結果column = " userName " property = " userName " JDBC type = " VARCHAR "/& gt;
& lt結果column = " passWord " property = " passWord " JDBC type = " VARCHAR "/& gt;
& ltresult column = " user _ sex " property = " user sex " Java type = " com . neo . enums . usersexenum "/& gt;
& lt結果column = " nick _ name " property = " nickName " JDBC type = " VARCHAR "/& gt;
& lt/result map & gt;
& ltsql id="Base_Column_List " >
id、用戶名、密碼、用戶性別、昵稱
& lt/SQL & gt;
& ltselect id = " get all " result map = " base result map " & gt;
挑選
& ltinclude refid = " Base _ Column _ List "/& gt;
來自用戶
& lt/select & gt;
& ltselect id = " getOne " parameter type = " Java . lang . long " result map = " base result map " & gt;
挑選
& ltinclude refid = " Base _ Column _ List "/& gt;
來自用戶
其中id = #{id}
& lt/select & gt;
& ltinsert id = " insert " parameter type = " com . neo . entity . user entity " & gt;
插入
用戶
(用戶名、密碼、用戶性別)
價值觀念
(# {用戶名}、# {密碼}、# {用戶性別})
& lt/insert & gt;
& ltupdate id = " update " parameter type = " com . neo . entity . user entity " & gt;
更新
用戶
設置
& ltif test="userName!= null " >用戶名= # {用戶名},& lt/if & gt;
& ltif test="passWord!= null " >passWord = #{passWord},& lt/if & gt;
尼克名= # {昵稱}
在哪裏
id = #{id}
& lt/update & gt;
& ltdelete id="delete "參數type = " Java . lang . long " & gt;
從中刪除
用戶
在哪裏
id =#{id}
& lt/delete & gt;
& lt/mapper & gt;1234567891011121314151617181920212223242526272829303132333435363738 3940414243444546474849505152123456789101112131415161718192021 22232425262728293031323334353637383940414243444546474849505152
事實上,上壹版本中mapper的sql被移到了這裏的xml中。
3.寫道層的代碼。
公共接口用戶映射程序{
列表& lt用戶實體& gtget all();
UserEntity getOne(長id);
void insert(UserEntity用戶);
void更新(UserEntity用戶);
void delete(長id);
}1234567891011121312345678910111213
與上壹步相比,這裏只剩下接口方法了。
4.使用
使用和上壹個版本沒有區別。讓我們看看代碼。
Xml配置版本
如何選擇
兩種模式各有特點,註釋版適合簡單快速模式。其實像這種流行的微服務模式,壹個微服務會對應自己的數據庫,多表連接查詢的需求會大大降低,會越來越適合這種模式。
舊的傳統模式更適合大型項目,可以靈活動態地生成SQL,方便SQL的調整,也有寫SQL快樂而華麗的感覺。
太極拳的招式很多,最熟悉的就是推手。推手四兩下總容易把對方擊退。這是長期實踐的結果。那麽在打太極拳的時候如何才能利用好自己的力量和力道呢?跟我壹起來看看吧!
太極拳力量與實力的釋放
力量與力量的關系是武術中長期爭論的焦點,眾說紛紜。我認為“力”和“勁”既有聯系又有區別——力和勁的來源,力是時間上協調力量的積累,是力量在運動中的運用。推手