用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
asklxf的公告
<br/> <div style='font-size:1.1em'> 我的博客已正式迁至:<br> <a href="http://www.liaoxuefeng.com">www.liaoxuefeng.com</a><br> 请访问新地址并从首页添加订阅,谢谢!<br> CSDN博客不保证实时更新。<br>&nbsp;<br> </div> <script language="javascript" src="http://www.shi-ci.com/embeded.do"></script> <hr size='1' width='100%'> <br/> <font size='+1'>新书上市:《<a href='http://www.livebookstore.net' target='_blank'><b>Spring 2.0核心技术与最佳实践</b></a>》!<br> 查看<a href='http://www.livebookstore.net/table.html' target='_blank'><b>目录</b></a><br>访问<a href='http://www.javaeedev.com/' target='_blank'><b>JavaEE开发网</b></a></font> <a href='http://www.livebookstore.net/' target='_blank'><img src='http://p.blog.csdn.net/images/p_blog_csdn_net/asklxf/15633/o_hot2.gif' border='0' width='160' height='263'></a> <hr size='1' width='100%'> <br/> <hr size='1' width='100%'> <b>自我介绍</b><br> <a href="mailto:asklxf@163.com">Xuefeng</a>,<a href="http://www.bupt.edu.cn" target="_blank">北京邮电大学</a>本科毕业,精通J2EE/J2ME,<a href="http://www.javasprite.com/" target="_blank">欢迎交流</a>!<br><br> <script type="text/javascript"><!-- google_ad_client = "pub-6727358730461554"; google_alternate_ad_url = "http://www.crackj2ee.com/ad_banner/banner.htm"; google_ad_width = 120; google_ad_height = 240; google_ad_format = "120x240_as"; google_ad_type = "text_image"; google_ad_channel =""; //--></script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"> </script> <script type="text/javascript"> _uacct = "UA-251595-2"; urchinTracker(); </script>
文章分类
Java站点
JavaEE开发网(RSS)
Live在线书店
中华诗词
存档

原创  还需要编写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

    发表于 @ 2009年06月17日 11:21:00 | 评论( loading... ) | 编辑| 举报| 收藏

    旧一篇:How to use OpenID to sign on with Google account | 新一篇:为什么主流Java MVC框架如此难以使用

    • 发表评论
    • 评论内容:
    •  
    Copyright © asklxf
    Powered by CSDN Blog