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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章