`
txf2004
  • 浏览: 7039931 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多

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

  • 分享到:
    评论

    相关推荐

      jsp操作SqlServer数据库

      在实际项目中,为了提高代码的可维护性和避免SQL注入,通常会推荐使用DAO(Data Access Object)模式和存储过程,或者更高级的ORM框架,如Hibernate或MyBatis。然而,对于学习和简单的应用,上述JDBC基础已经足够。 ...

      Service层和DAO层解析

      例如,如果需要对查询结果进行修改,只需在DAO层更改SQL,Service层相应地调整调用,改动范围较小,降低了影响范围。 在实际开发中,不必拘泥于严格的分层数量,关键在于如何有效地组织代码以适应项目需求。有时候...

      mybatis_genertor逆向工程自动生成pojo dao层等类

      6. **整合到项目中**:将生成的文件添加到项目中,配置好MyBatis的环境,就可以直接使用这些类和接口进行数据库操作,无需手动编写大量重复的代码。 MBG的优势在于: - **提高开发效率**:避免了手动创建大量的...

      mybatis自动生成代码 eclipse插件

      MBG可以根据数据库中的表信息生成Java实体类、Mapper接口、Mapper XML文件以及Service和DAO接口的实现类,从而减少了手动编写这些重复性代码的工作量。 **二、Eclipse插件Generator的安装与配置** 1. 下载...

      Oracle代码生成器V1.0.zip

      它通过解析Oracle数据库中的表结构,自动生成Java、C#或其他编程语言的实体类、DAO层、Service层以及对应的XML配置文件等,大大减轻了手动编写这些基础代码的工作量。 首先,让我们深入了解一下Oracle数据库。...

      Ibatis+Oracle(含对应数据库sql) 源码

      在实践中,你可以期待找到如何创建Oracle数据库表的SQL脚本,如何配置Ibatis以连接Oracle,如何编写和执行SQL语句,以及如何在Java代码中调用这些操作的示例。 总的来说,这个资源将帮助学习者理解以下几个关键知识...

      mysql代码生成器

      - XML配置文件:如MyBatis的Mapper XML,包含SQL语句,与DAO接口对应。 - 其他:可能还包括Controller层、VO/DTO对象、测试类等,具体取决于工具的功能和你的选择。 4. 实际开发中的应用: - 快速原型开发:在项目...

      Mybatis 28道面试题及答案.docx

      1. 需要手动编写SQL,当涉及复杂的表关联和多字段时,工作量可能会增加。 2. SQL语句高度依赖特定数据库,降低了数据库的移植性。 Mybatis适用于对性能要求高、需求变化频繁的项目,比如互联网项目,因为它提供了...

      mybatis自动生成代码所需的jar及模板(lib目录)

      MyBatis Generator(MBG)是一款强大的工具,用于自动生成MyBatis的SQL映射文件、Java模型类以及DAO接口。这个压缩包“mybatis-generator-core-1.3.2”正是MBG的核心库,包含了运行MBG所需的所有组件。 1. **...

      基于泛型与反射的万能数据库操作代码

      在Java编程语言中,泛型和反射是两个非常重要的特性,它们在开发...在实际应用中,可能还需要考虑更多的细节,比如事务管理、错误处理以及性能优化等,但这个基础框架已经足够展示泛型与反射在数据库操作中的强大功能。

      关于代码自动生成的项目demo

      这个项目“关于代码自动生成的项目demo”提供了一个实际操作的平台,帮助开发者理解和应用代码自动生成技术,提升开发效率,减少手动编写重复代码的工作量。通过深入学习和实践,可以更好地理解如何配置和定制代码...

      MybatisCodeHelperNew

      MybatisCodeHelperNew是一款针对Mybatis框架的代码生成工具,旨在提高开发效率,减少手动编写重复的 CRUD(创建、读取、更新、删除)操作代码。这款工具通过自定义模板和配置,能够根据数据库表结构自动生成Mybatis...

      mybatis逆向工程

      MyBatis逆向工程是MyBatis框架提供的一项强大功能,它可以帮助开发者自动化地生成POJO(Plain Old Java Object)类、Mapper接口以及相应的XML映射文件,极大地提高了开发效率,减轻了手动编写这些基础代码的工作量。...

      spring boot框架继承代码生成以及mybatis以及shiro登录.rar

      3. **代码生成器**: 在Spring Boot项目中,我们可以使用诸如MyBatis Generator这样的工具自动生成DAO层、Service层、Mapper XML文件等,减少手动编写重复代码的工作量。 4. **MyBatis-Spring-Boot-Starter**: 这是...

      iBatis net版中文 1.6的

      - 编写DAO(数据访问对象):展示如何创建和使用Mapper接口,以及如何调用SQL命令。 -事务管理:讨论如何在iBatis .NET中处理事务,包括手动和自动事务控制。 - 故障排查:提供常见问题的解决方案和最佳实践。 通过...

      mybatis 逆向生成工具

      开发者只需要配置好数据库连接信息,选择需要生成的表,工具就能完成大部分基础代码的编写。 3. **支持的数据库** MyBatis逆向生成工具兼容多种数据库系统,包括MySQL、SQL Server等。这些数据库在企业级应用中...

      SSM简单搭建,清晰明了,适用于初学者

      在实际开发中,你可能还需要配置日志、异常处理、国际化、安全控制等模块,但这个基础框架已经足够让你开始进行业务开发了。记得实践是检验真理的唯一标准,多动手操作,遇到问题及时查阅文档和搜索解决方案,相信你...

      mybatis-generator-core-1.3.5

      在使用Mybatis Generator时,还需要注意数据库权限问题,确保执行代码生成的用户具有足够的权限读取和解析数据库表结构。同时,如果数据库中存在复杂的数据类型或自定义的SQL函数,可能需要在配置文件中做额外的处理...

      Maven+spring+springMVC+mybatis 项目简单例子

      在IT行业中,构建Java Web应用程序是一项常见的任务,而"Maven+spring+springMVC+mybatis"是一...在实际开发中,还需要考虑更多的细节,如安全性、性能优化、异常处理等,但这个基本的构架已经足够展示它们的核心功能。

      eclipse MyBatis Generator 1.3.2 离线安装包

      这些源代码包括了Mapper接口、XML映射文件、实体类以及DAO接口,使得开发人员可以更专注于业务逻辑的实现,而非重复性的基础代码编写。 在使用Eclipse MyBatis Generator 1.3.2之前,你需要确保已经安装了Eclipse或...

    Global site tag (gtag.js) - Google Analytics