标准的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接口的实例,通过该实例,直接操作数据库!