天天看点

还需要编写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接口的实例,通过该实例,直接操作数据库!