MyBatis增强工具pndao-帮你自动写SQL

deuso 7年前
   <p>pndao是我们团队在使用的MyBatis增强工具,它可以根据一些方法约定,自动生成SQL。它在实际生产中减少了80%以上的重复SQL编写工作。</p>    <h2><strong>起因</strong></h2>    <p>作为Java后端开发,写DAO是个日常的不能再日常的工作。MyBatis“非常Java”的接口声明式DAO符合很多团队的选型标准。我用过很久MyBatis(iBatis),其实它从最开始到现在已经有不小的进步,但是仍然会被大量的复制字段、SQL拼写错误、记不得一些繁琐的语法困扰。</p>    <p>之前我也写过一版daogen,大概是根据Table的schema,一次性生成DAO以及SQL。不过维护成本依然比较高,每次增减字段都需要手动改。</p>    <p>有一些新的框架,例如jFinal,其实已经集成了常用SQL生成这样的功能,但是一般会绑定自己的框架,使用成本高,迁移更加迁不动。</p>    <p>目前使用的这个版本的daogen是@恩泽同学开发的,支持MyBatis,并且能生成常用SQL,经过一年的使用,基本上常用功能都已经能够覆盖。都是吃自己狗粮出来的,专为解决问题而生,没有半点花架子。</p>    <h2><strong>原理</strong></h2>    <p>pndao的原理并不复杂,是基于MyBatis的方法命名约定来生成SQL,并且写入MyBatis需要的XML。</p>    <p>写之前会判断是否已经存在XML或者注解,如果已经存在则略过此方法。有一点不同的是,这个是基于jsr269的编译期注解处理来实现的,所以其实整个方案跟MyBatis并没有强绑定,基于这种思路还可以做出其他很多有用的东西来。</p>    <p>以下是一个常见的DAO功能:</p>    <pre>  <code class="language-java">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);      }  }</code></pre>    <p>基于pndao,所有需要开发的DAO只有这些:</p>    <pre>  <code class="language-java">@DaoGen  public interface UserDao {        int updateForUserName(@Param("userName") String userName, @Param("id") int id);        int insert(User t);        User findById(int id);    }</code></pre>    <p>结合建表语句生成插件 pngen ,大部分场景只需编写一个模型类即可完成DAO层工作。</p>    <p> </p>    <p> </p>    <p>来自:http://piaoniu.io/pndaokai-yuan-liao/</p>    <p> </p>