标准的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);
@MappedBy(TestUserRowMapper.class)
@Query("select * from User u order by u.id")
List<TestUser> queryAll();
@MappedBy(TestUserRowMapper.class)
@Query("select * from User u order by u.id")
List<TestUser> queryFrom(@FirstResult int first);
@MappedBy(TestUserRowMapper.class)
@Query("select * from User u order by u.id")
List<TestUser> queryMax(@MaxResults int max);
@MappedBy(TestUserRowMapper.class)
@Query("select * from User u order by u.id")
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) {
if (! tx.isRollbackOnly())
tx.rollback();
}
}
核心代码:
TestUserDao dao = daoFactory.createDao(TestUserDao.class, txManager);
通过DaoFactory,我们得到一个实现了TestUserDao接口的实例,通过该实例,直接操作数据库!
下载:http://code.google.com/p/express-me/downloads/list
文档:http://code.google.com/p/express-me/wiki/ExpressPersistence
分享到:
相关推荐
这份源代码集合很可能是对以上各种技术的具体实现,包括但不限于配置文件、Servlet、JSP页面、模型类、DAO接口及其实现、Spring Bean定义等。通过研究这些示例,开发者可以更好地理解各模块间的交互,学习如何将理论...
源代码(part2)中可能包含各种配置文件(如struts-config.xml、hibernate.cfg.xml、spring配置文件)、实体类、DAO(数据访问对象)层、Service层、Action类以及JSP视图文件等,这些文件共同构成了一个完整的Java ...
1. **JPA集成**:Spring Data JPA允许开发者通过简单的注解驱动的方式实现对数据库的CRUD操作,无需手动编写DAO层代码。它支持Repository接口,只需定义基本的查询方法,底层就会自动生成对应的SQL语句。 2. **自动...
Part1部分的源码提供了初学者和进阶开发者深入理解如何在C++环境中构建数据库应用的基础。以下是对这部分源码所涵盖的知识点的详细解释: 1. **MFC(Microsoft Foundation Classes)框架**:Visual C++中的MFC是...
- 实现:Spring Data会自动为你生成实现,无需手动编写DAO层代码。 5. **案例分析**: - 使用JPA Repository,你可以定义一个简单的`PersonRepository`接口,如`List<Person> findByLastName(String lastName)`,...
1. **生成Dao层**:DAO(Data Access Object)层是数据库操作的接口,Mybatis-Generator可以根据数据库表自动生成相应的Mapper接口。这些接口包含了基本的CRUD(Create、Read、Update、Delete)方法,以及一些其他...
Servlet和JSP是Java Web开发中的核心技术,常用于构建动态网页应用。... 1. **Servlet基础**:Servlet是...不过,实际项目中还需要考虑更多的细节,如权限控制、验证码、异常处理策略等,以提升系统的健壮性和用户体验。
第1章 JAVA WEB开发简介 1.1、WEB发展历程 1.2、企业开发架构 1.3、JAVA EE架构 1.4、JAVA EE核心设计模式 1.5、Struts开发框架 1.6、本章摘要 1.7、开发实战讲解 第2章 HTML、JavaScript简介 2.1、...
在MFC中,可以使用CRecordView或CDocument/CDocTemplate等类来实现与数据库的交互,如ODBC或DAO接口来连接SQL Server、Access等数据库。 2. **读者管理模块**:用于管理读者信息,包括注册、注销、借阅记录等。同样...
通过Hibernate,开发者可以使用面向对象的方式来操作数据库,避免了繁琐的SQL语句编写,提高了开发效率。 在"javaweb_part21"这个主题中,我们可能深入学习如何将这三大框架整合到一个JavaWeb项目中。这通常涉及...
第1章 宏与代码 3 1.1 何时使用代码代替宏 4 1.1.1 何时用宏 4 1.1.2 何时用代码 4 1.2 宏到代码的转换 5 1.2.1 使用DoCmd对象 5 1.2.2 与宏命令等价的代码 7 1.3 将现有宏转换为代码 8 1.4 小 结 12 第2章...
在"Struts数据库项目开发宝典(part2)"中,我们继续深入探讨如何使用Struts与数据库进行交互,以实现动态、数据驱动的Web应用程序。 首先,`META-INF`目录在Java项目中扮演着重要角色,它是Java存档(JAR)文件的...
3. **Hibernate**:Hibernate是一个优秀的ORM框架,它允许开发者用Java对象来操作数据库,减少了SQL的编写工作,使得应用程序更加面向对象。Hibernate通过映射机制将Java类与数据库表关联,提供了对象的持久化服务,...
6. 编写Hibernate的DAO接口和实现,利用Session进行CRUD操作。 7. 将Struts2、Spring、Hibernate整合,配置web.xml和struts.xml,使它们协同工作。 8. 创建JSP页面,使用Struts2的标签库展示数据,实现用户界面。 9....
17.5.3 编写DAO测试基类 17.5.4 编写BoardDao测试用例 17.6 服务层开发 17.6.1 UserService的开发 17.6.2 ForumService的开发 17.6.3 服务类Bean的装配 17.7 对服务层进行测试 17.7.1 编写Service测试基类 17.7.2 ...
开发者可以使用面向对象的方式来操作数据库,而无需编写大量的SQL语句。Hibernate支持HQL(Hibernate Query Language),一种类似SQL的语言,用于查询对象。 在实际项目开发中,SSH的整合使用通常包括以下步骤: -...
8. **文件上传与下载**:系统中的资源上传功能可能利用了Servlet的`Part`接口和`HttpServletRequest`的`getParts()`方法,同时需考虑文件大小限制、类型检查和存储路径安全等问题。 9. **毕业设计流程**:作为毕业...
- **功能**: 提供对SqlSession的支持,简化DAO层代码编写。 - **应用场景**: 在DAO实现类中继承该类,便于获取SqlSession实例。 **MapperFactoryBean** - **功能**: MyBatis的映射器工厂,用于创建映射器接口的...
工厂层用于返回dao层对象,在传统的岁月里,还没有spring的控制反转的特性,暂且用工厂类替代spring生成对象 服务层用于编写具体逻辑 serlvet层编写接口 前端webapp Part-EL表达式,过滤器的简单使用 任务:使用...
17.5.3 编写DAO测试基类 17.5.4 编写BoardDao测试用例 17.6 服务层开发 17.6.1 UserService的开发 17.6.2 ForumService的开发 17.6.3 服务类Bean的装配 17.7 对服务层进行测试 17.7.1 编写Service测试基类 17.7.2 ...