使用MyBatis Plus後如何設計Dao層Service層?
之前一直用MyBatis,Dao層寫各種SQL語句,Service層寫業務,其中會呼叫到Dao層。
轉MyBatis Plus後,我對此產生了困惑。因為Dao層的方法可能會被不止一個Service層的方法呼叫,但是使用MyBatisPlus的話可以在業務層方法中直接傳入QueryWrapper來使用,這樣如果業務層別的方法也需要使用此方法的話只能重新寫一遍嗎?
例如:根據年齡查詢使用者,使用MyBatis Plus只需要在業務層呼叫userMapper.selectOne(new QueryWrapper().eq("user_age", age)); 而業務層的其他方法也可能需要根據年齡查詢使用者,這時我只能再寫一遍userMapper.selectOne(new QueryWrapper().eq("user_age", age)); 語句嗎?
我應該為每一個需要使用的SQL語句在Service層定義一個方法嗎?
還是說我原本的分層模式就有問題?
回覆列表
-
1 # 聽道說途
-
2 # 李米子666
這個問題,我也是一直在糾結。 如樓上所說,儘量高內聚,不能高類內聚,我選擇引入service,而不是注入mapper,保證同一個service只有自己的原配mapper(或者直接使用繼承父類的basemapper)
-
3 # 啊哈哈叫啊
說明你還沒了解mybatisplus,mybatisplus除了多表連表查詢能夠完成所有crud,多表連表則單獨service和mapper好了,寫在已有繼承的base類裡面也可以,不過我更喜歡將這類複雜查詢與單表查詢分開命名,這樣更清晰一點,我甚至會把不復雜數量不多的非涉及使用者和產品的多表查詢拆成多service查詢寫在controller裡面,現在好久沒用,不知道有沒有實現多表的查詢了,分頁查詢他能做到直接修改sql語句,多表沒理由做不到,多看文件能找到答案
-
4 # 哈K的視角
根據MyBatis-Plus的設計模式,那些接受條件Conditional或則和Wrapper的引數的方法,Conditional或者Wrapper物件本省就是引數!
你例子中:
userMapper.selectOne(new QueryWrapper<User>().eq("user_age", age));
這個Mapper方法算是DAO層的,它接受一個來自Service層傳遞的物件 QueryWrapper。你思維定勢,認為userMapper.selectOne(new QueryWrapper<User>().eq("user_age", age)); 才是一個DAO方法整體,不是的!!
所以就算別的Servcie再呼叫這個
userMapper.selectOne(),你只需要定製建立的Wrapper物件就可以啦。
記住:方法入參就是入參,其他什麼也不是。
為常用的sql查詢在service建一個方法,然後就可以在別的service裡呼叫該方法了,這樣重複程式碼少,而且service只和對應dao曾互動,內聚性更高,是比較新的思想。具體看自己的選擇,我喜歡對應的思想