1. 程式人生 > >MyBatis增強工具pndao-幫你自動寫SQL

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。