MyBatis增強工具pndao-幫你自動寫SQL
pndao是票牛技術團隊在使用的MyBatis增強工具,它可以根據一些方法約定,自動生成SQL。它在實際生產中減少了80%以上的重複SQL編寫工作。
起因
作為Java後端開發,寫DAO是個日常的不能再日常的工作。
這方面有很多工具,有重量級的Hibernate,輕量級的DbUtils、Spring JDBC等。其中MyBatis以介面宣告來生成DAO,實現了介面與實現分離,並約定POJO來作為實體類,同時提供一些便捷的指令碼擴充套件,是一套規範性和靈活性並存的方案,已經成為很多團隊的首選。我用過很久MyBatis(iBatis),其實它從最開始到現在已經有不小的進步,但是仍然會被大量的複製欄位、SQL拼寫錯誤、記不得一些繁瑣的語法困擾。
相信很多人都基於MyBatis寫過daogen,MyBatis也提供了官方的外掛MyBatis Generator,但是這些工具都是一次性生成DAO以及SQL,後期維護成本依然比較高,每次增減欄位都需要手動改,如果有手寫的SQL還要手動DIFF,也比較麻煩。
有一些新的框架,例如jFinal,其實已經集成了常用SQL生成這樣的功能,但是一般會繫結自己的框架,使用成本比較高,遷移也很困難。
目前使用的這個版本的daogen支援MyBatis,並且能生成常用SQL,並且每次編譯都會重新生成SQL,不僅省去一次性編碼,也解決了維護的問題。經過一年的使用,基本上常用功能都已經能夠覆蓋。都是吃自己狗糧出來的,專為解決問題而生,沒有半點花架子。
原理
pndao的原理並不複雜,是基於MyBatis的方法命名約定來生成SQL,並且寫入MyBatis需要的XML。
寫之前會判斷是否已經存在XML或者註解,如果已經存在則略過此方法,所以無論是註解還是XML方式配置SQL都是相容的。
有一點不同的是,這個是基於jsr269的編譯期註解處理來實現的,所以其實整個方案跟MyBatis並沒有強繫結,基於這種思路還可以做出其他很多有用的東西來。
以下是一個常見的DAO功能:
public class UserDaoTest extends AbstractTest{
public static final int USER_ID = 1;
@Autowired
private UserDao userDao;
@Test
public void testInsertUser() throws Exception {
User user = initUser();
assertThat(userDao.insert(user)).isEqualTo(1);
}
@Test
public void testFindUserById() throws Exception {
User user = userDao.findById(USER_ID);
assertThat(user).isNotNull();
}
@Test
public void testUpdateUserName() throws Exception {
assertThat(userDao.updateForUserName("使用者13700000001",USER_ID)).isEqualTo(1);
}
}
基於pndao,所有需要開發的DAO只有這些:
@DaoGen
public interface UserDao {
int updateForUserName(@Param("userName") String userName, @Param("id") int id);
int insert(User t);
User findById(int id);
}
結合建表語句生成外掛pngen,大部分場景只需編寫一個模型類即可完成DAO層工作。
更多的東西可以看專案,地址:http://git.oschina.net/piaoniu/pndao。