當前位置:吉日网官网 - 傳統節日 - 如何優雅地使用mybatis

如何優雅地使用mybatis

如何優雅地使用mybatis

這兩天開始了壹個新項目,因為項目組成員壹直在用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快樂而華麗的感覺。

  • 上一篇:太極拳的力度和力量分布是怎樣的?

    太極拳的招式很多,最熟悉的就是推手。推手四兩下總容易把對方擊退。這是長期實踐的結果。那麽在打太極拳的時候如何才能利用好自己的力量和力道呢?跟我壹起來看看吧!

    太極拳力量與實力的釋放

    力量與力量的關系是武術中長期爭論的焦點,眾說紛紜。我認為“力”和“勁”既有聯系又有區別——力和勁的來源,力是時間上協調力量的積累,是力量在運動中的運用。推手

  • 下一篇:如何在美術教學中培養學生的審美能力
  • copyright 2024吉日网官网