`
mmdev
  • 浏览: 13303551 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

还需要编写DAO代码吗?SQL+接口就足够了!(Part 1)

阅读更多

标准的Java DAO写法:

  1. 定义DAO接口;
  2. 编写DAO实现类;
  3. 在实现类中编写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

    分享到:
    评论

    相关推荐

      JavaWeb开发典型模块大全源代码(第二部分)..part1.rar

      这份源代码集合很可能是对以上各种技术的具体实现,包括但不限于配置文件、Servlet、JSP页面、模型类、DAO接口及其实现、Spring Bean定义等。通过研究这些示例,开发者可以更好地理解各模块间的交互,学习如何将理论...

      J2EE开源编程精要15讲源代码part2

      源代码(part2)中可能包含各种配置文件(如struts-config.xml、hibernate.cfg.xml、spring配置文件)、实体类、DAO(数据访问对象)层、Service层、Action类以及JSP视图文件等,这些文件共同构成了一个完整的Java ...

      spring part 4

      1. **JPA集成**:Spring Data JPA允许开发者通过简单的注解驱动的方式实现对数据库的CRUD操作,无需手动编写DAO层代码。它支持Repository接口,只需定义基本的查询方法,底层就会自动生成对应的SQL语句。 2. **自动...

      Visual C++数据库开发经典实例精解源码Part1

      Part1部分的源码提供了初学者和进阶开发者深入理解如何在C++环境中构建数据库应用的基础。以下是对这部分源码所涵盖的知识点的详细解释: 1. **MFC(Microsoft Foundation Classes)框架**:Visual C++中的MFC是...

      spring part 2.2

      - 实现:Spring Data会自动为你生成实现,无需手动编写DAO层代码。 5. **案例分析**: - 使用JPA Repository,你可以定义一个简单的`PersonRepository`接口,如`List&lt;Person&gt; findByLastName(String lastName)`,...

      mybatis-generator-core-1.3.2

      1. **生成Dao层**:DAO(Data Access Object)层是数据库操作的接口,Mybatis-Generator可以根据数据库表自动生成相应的Mapper接口。这些接口包含了基本的CRUD(Create、Read、Update、Delete)方法,以及一些其他...

      Servlet JSP登陆注册Part2

      Servlet和JSP是Java Web开发中的核心技术,常用于构建动态网页应用。... 1. **Servlet基础**:Servlet是...不过,实际项目中还需要考虑更多的细节,如权限控制、验证码、异常处理策略等,以提升系统的健壮性和用户体验。

      MLDN+李兴华+Java+Web开发实战经典.part3.rar )

      第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应用—part2

      在MFC中,可以使用CRecordView或CDocument/CDocTemplate等类来实现与数据库的交互,如ODBC或DAO接口来连接SQL Server、Access等数据库。 2. **读者管理模块**:用于管理读者信息,包括注册、注销、借阅记录等。同样...

      javaweb_part21

      通过Hibernate,开发者可以使用面向对象的方式来操作数据库,避免了繁琐的SQL语句编写,提高了开发效率。 在"javaweb_part21"这个主题中,我们可能深入学习如何将这三大框架整合到一个JavaWeb项目中。这通常涉及...

      Access 2000中文版高级编程(part1)

      第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数据库项目开发宝典(part2)"中,我们继续深入探讨如何使用Struts与数据库进行交互,以实现动态、数据驱动的Web应用程序。 首先,`META-INF`目录在Java项目中扮演着重要角色,它是Java存档(JAR)文件的...

      126个 JAVA EE 项目源码下载.part13

      3. **Hibernate**:Hibernate是一个优秀的ORM框架,它允许开发者用Java对象来操作数据库,减少了SQL的编写工作,使得应用程序更加面向对象。Hibernate通过映射机制将Java类与数据库表关联,提供了对象的持久化服务,...

      javaweb_part16

      6. 编写Hibernate的DAO接口和实现,利用Session进行CRUD操作。 7. 将Struts2、Spring、Hibernate整合,配置web.xml和struts.xml,使它们协同工作。 8. 创建JSP页面,使用Struts2的标签库展示数据,实现用户界面。 9....

      Spring3.x企业应用开发实战(完整版) part1

      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 ...

      javaweb_part20

      开发者可以使用面向对象的方式来操作数据库,而无需编写大量的SQL语句。Hibernate支持HQL(Hibernate Query Language),一种类似SQL的语言,用于查询对象。 在实际项目开发中,SSH的整合使用通常包括以下步骤: -...

      JSP教学管理系统(源代码+论文).zip

      8. **文件上传与下载**:系统中的资源上传功能可能利用了Servlet的`Part`接口和`HttpServletRequest`的`getParts()`方法,同时需考虑文件大小限制、类型检查和存储路径安全等问题。 9. **毕业设计流程**:作为毕业...

      SSM框架常用核心接口和类.txt

      - **功能**: 提供对SqlSession的支持,简化DAO层代码编写。 - **应用场景**: 在DAO实现类中继承该类,便于获取SqlSession实例。 **MapperFactoryBean** - **功能**: MyBatis的映射器工厂,用于创建映射器接口的...

      javaDemo

      工厂层用于返回dao层对象,在传统的岁月里,还没有spring的控制反转的特性,暂且用工厂类替代spring生成对象 服务层用于编写具体逻辑 serlvet层编写接口 前端webapp Part-EL表达式,过滤器的简单使用 任务:使用...

      Spring.3.x企业应用开发实战(完整版).part2

      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 ...

    Global site tag (gtag.js) - Google Analytics