标準的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接口的執行個體,通過該執行個體,直接操作資料庫!