天天看點

還需要編寫DAO代碼嗎?SQL+接口就足夠了!

标準的java dao寫法:

定義dao接口;

編寫dao實作類;

在實作類中編寫jdbc代碼。

寫jdbc代碼非常枯燥而且容易出錯,是以,增強的dao可以用類似spring的jdbctemplate簡化jdbc代碼,不過仍然需要大量的connectioncallback,preparedstatementcallbac等。

如果僅定義dao接口,并利用java 5 annotation寫好sql語句,其餘的工作全部由底層架構完成:

自動将接口方法的參數綁定到sql的參數;

自動将resultset映射到object;

...

現在,利用express persistence,完全可以實作!

讓我們用express persistence實作一個完整的dao:

假定資料庫表user包含字段如下:

id varchar(32) primary key,

name varchar(50) not null,

gender bit not null,

age int not null.

并且定義好javabean testuser:

public class testuser {

  private string id;

  private string name;

  private boolean gender;

  private int age;

  // getters and setters here...

}

現在,我們就可以定義testuserdao接口了:

public interface testuserdao {

    @unique

    @mappedby(testuserrowmapper.class)

    @query("select * from user u where u.id=:id")

    testuser querybyid(@param("id") string id);

    @query("select * from user u order by u.id")

    list<testuser> queryall();

    list<testuser> queryfrom(@firstresult int first);

    list<testuser> querymax(@maxresults int max);

    list<testuser> queryrange(@firstresult int first, @maxresults int max);

    @update("insert into user(id, name, gender, age) values(:id, :name, :gender, :age)")

    void createuser(@param("id") string id, @param("name") string name, @param("gender") boolean gender, @param("age") int age);

    @update("update user set name=:name where id=:id")

    int updateusername(@param("id") string id, @param("name") string name);

    @update("delete from user where id=:id")

    int deleteuser(@param("id") string id);

注意到@query和@update,sql語句直接寫在裡面。為了讓sql參數和方法參數綁定,必須使用:xxx标記sql參數,并為方法參數标記對應的@param("xxx")。(有點麻煩,難道不能直接通過方法參數名字綁定?哈哈,編譯後的.class就隻有類型沒有名字了)

例如,更新username的sql語句:

update user set name=:name where id=:id

對應的綁定參數是:name和:id,是以方法參數要這麼寫:

int updateusername(@param("id") string id, @param("name") string name);

沒有實作類?沒錯,不需要實作類,我們就可以直接使用:

public static void main(string[] args) throws exception {

    // get data source from somewhere:

    datasource datasource = ...

    // create transactionmanager and daofactory:

    jdbctransactionmanager txmanager = new jdbctransactionmanager(datasource);

    jdbcdaofactory daofactory = new jdbcdaofactory(new hsqldbdialect());

    // now create dao:

    testuserdao dao = daofactory.createdao(testuserdao.class, txmanager);

    // ok, now we can do crud by dao now, but need transaction support:

    transaction tx = txmanager.begintransaction();

    try {

        // create 10 user:

        for (int i=0; i<10; i++)

            dao.createuser("123456789012345678901234567890f" + i, "name-" + i, true, 20 + i);

        // query users with offset and limit:

        list<testuser> users = dao.queryrange(3, 5);

        // print user name, the output should be:

        // name-3

        // name-4

        // name-5

        // name-6

        // name-7

        for (testuser user : users)

            system.out.println(user.getname());

        // delete user with name 'name-3':

        int n = dao.deleteuser(users.get(0).getid());

        system.out.println(n + " user deleted.");

        tx.commit();

    }

    catch(exception e) {

        if (! tx.isrollbackonly())

            tx.rollback();

    catch(error e) {

核心代碼:

testuserdao dao = daofactory.createdao(testuserdao.class, txmanager);

通過daofactory,我們得到一個實作了testuserdao接口的執行個體,通過該執行個體,直接操作資料庫!