`

SQL+接口编写DAO代码

阅读更多

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

 

分享到:
评论

相关推荐

    Mybatis代码生成工具(model+sql+dao)

    Mybatis是一款著名的Java持久层框架,它提供了灵活的SQL映射功能,使开发者可以自由地编写SQL语句,同时避免了传统的DAO层繁琐的手动编码。"Mybatis代码生成工具"是为了提高开发效率,减少重复劳动而设计的实用工具...

    JSP+Servlet+AJAX的dao设计模式

    - **实现DAO接口**:在实现类中编写具体的SQL语句或使用ORM框架如Hibernate执行数据库操作。 - **创建Service层**:在Service层中调用DAO方法,处理业务逻辑。 - **Servlet处理请求**:Servlet接收用户请求,调用...

    mybatis映射文件xml+bean+dao自动构建

    - **Mapper XML文件生成**:为每个DAO接口生成对应的XML映射文件,包含SQL语句和结果映射配置。 - **Service层代码生成**:虽然没有直接提及,但通常这类工具也会提供生成Service层代码的选项,以便于实现业务逻辑。...

    mybatis最终工具+pojo+dao+mapper一键生成

    在MyBatis中,DAO接口定义了对数据库的操作方法,而这些方法的具体实现则由MyBatis的动态SQL完成。使用此工具,我们可以自动生成这些接口,减少编码工作量。 3. **Mapper**:Mapper是MyBatis的核心组件之一,它是一...

    基于JSP+Servlet+Dao实现的贫困认定管理系统.zip

    Dao层是系统与数据库之间的接口,通过它来执行SQL语句,实现数据的增删改查。在Java中,通常使用MyBatis或Hibernate等持久层框架来简化Dao的编写,提高开发效率。在本系统中,Dao层可能包含了针对贫困认定信息的...

    ibatis开发包(common+sqlmap+dao)

    通过Mapper接口,开发者可以使用方法名来执行对应的SQL,提高了代码的可读性。 在实际开发中,使用这三个组件,开发者可以构建出一套完整的数据访问层。首先,通过`SqlSessionFactoryBuilder`创建`...

    springMVC+mybatis+sqlservers代码

    MyBatis允许开发者编写SQL语句,将SQL与Java代码分离,提高了代码的可读性和可维护性。它通过XML或注解来配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。...

    spring3.0 + ibatis+jquery+注解建立dao、service类

    4. **创建DAO接口**:使用`@Repository`注解,定义SQL查询方法。 5. **实现Mapper XML文件**:在资源目录下创建对应的XML文件,编写SQL语句。 6. **创建Service接口和实现**:使用`@Service`注解,实现业务逻辑,...

    JSP+MVC+DAO+Ajax实现的网上书城完全版

    3. **DAO(Data Access Object)**:DAO模式是一种用于封装对数据库操作的接口,将数据库访问逻辑与业务逻辑解耦。在这个网上书城中,DAO类负责执行SQL查询,如添加书籍、获取书籍列表、处理用户订单等。DAO使得代码...

    ibatis SQL映射文件、DAO、model自动生成工具源码

    用户只需要提供表名、数据库连接信息以及生成代码的目标路径,工具就会自动生成对应的SQL映射文件、DAO接口和Model类。这种简化的配置方式降低了学习成本,使得开发者可以快速上手。 总的来说,这个Ibatis生成工具...

    java 代码生成器 能自动生成sql语句和dao

    2. DAO接口与实现类生成:基于生成的SQL语句,代码生成器会创建相应的DAO接口,包括方法签名和注解,以及对应的实现类,包含具体的数据访问逻辑。 3. Entity模型类:根据数据库表字段,代码生成器会生成Java Bean类...

    基于DAO设计模式的新闻发布系统

    2. 数据库操作:DAO模式通常涉及SQL查询的编写,用于从数据库中读取、插入、更新和删除数据。这些操作可以通过预编译的SQL语句或者ORM(Object-Relational Mapping)框架如Hibernate或MyBatis来实现,以提高性能并...

    struts+hibernate留言板代码

    9. **测试**:为了确保代码的正确性,开发者可能会编写JUnit测试用例来验证Action类和Service类的方法。 总的来说,"struts+hibernate留言板代码"是一个很好的学习实例,它展示了如何利用这两个框架协同工作,构建...

    仓库管理系统(SQL+VC++6.0)

    在这个仓库管理系统中,开发者可能通过DAO(Data Access Objects)或ODBC(Open Database Connectivity)来连接和操作SQL Server数据库,实现数据的增删改查。同时,可能存在库存预警、报表生成、库存盘点等功能模块...

    mybatis-generator生成sqlserver数据库Bean、Dao、Mapper代码工具

    MyBatis Generator(MBG)是一款强大的自动化代码生成工具,主要针对MyBatis框架,能够帮助开发者自动生成Java Bean、DAO层以及Mapper XML文件,极大地提高了开发效率,减少了手动编写这些重复性工作的时间。在SQL ...

    spring boot+beetl+beetlsql源代码

    7. **创建Service层**:实现业务逻辑,使用BeetlSQL的DAO操作数据库,返回数据给Controller层。 8. **Controller层**:在Controller中,通过模板引擎渲染视图,将数据传递给Beetl模板,生成最终的HTTP响应。 9. **...

    DAO实训例子

    DAO模式的核心思想是将业务逻辑与数据访问逻辑分离,提供一个独立的接口来操作数据,这样可以使得代码更易于测试、维护和扩展。在Java或其它面向对象语言中,DAO通常包含以下组件: 1. **数据访问接口**:这是DAO的...

    idea 14 ssm 全注解框架+log4j+事物控制+mybatis基础Dao配置

    通过`@Mapper`接口,我们可以编写简洁的DAO层代码,比如`@Select`、`@Insert`、`@Update`和`@Delete`注解分别对应SQL查询、插入、更新和删除操作。 Log4j是一个强大的日志处理工具,它允许开发者记录应用程序运行时...

    springboot+mybatisPlus的源代码

    基于MVC架构实现,Dao数据持久层为数据库访问操作,本文未编写自定义的mapper.xml文件,而是通过mybatis提供的API直接访问数据3. test模块的单元测试,可以用来调试程序4. User.sql是初始化数据库脚本sql文件,调试...

Global site tag (gtag.js) - Google Analytics