`
z283464598
  • 浏览: 22921 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论
阅读更多
s2dao是基于seasar2的orm框架,使用简单且功能比较强大。官方网站为http://s2dao.seasar.org/,中英日文档皆有。
如果对hibernate望而生畏,而只是寻找一个替代jdbc的工具的话,s2dao算是一个不错的选择。某种程度上来讲,s2dao可能会比较像ibatis(笔者没有使用过ibatis)。

具体编码来说,基本上是一个interface(相当于DAO)对应一个javabean。这里的javabean不是pojo,不具备持久性,只是作为dao方法返回值的容器,所以可以很方便的实现复杂的多表检索。
interface的具体方法体不用自己手写,通过系统的interceptor可自动填充并实现。

下面对使用做具体介绍。本文使用的s2dao版本为1.0.49。
DB中有三个表:


1.单表

Example.java为Example表的容器类(s2dao习惯称之为DTO,虽然这个称呼不是很恰当)
1 package com.hg.s2dao.dto;
2
3 import org.seasar.dao.annotation.tiger.Bean;
4
5 @Bean(table = "EXAMPLE")
6 public class Example {
7
8     private String id;
9     private String name;
10
11     public String getId() {
12         return id;
13     }
14
15     public void setId(String id) {
16         this.id = id;
17     }
18
19     public String getName() {
20         return name;
21     }
22
23     public void setName(String name) {
24         this.name = name;
25     }
26
27     public String toString() {
28         return "id: " + id + " name: " + name;
29     }
30
31 }使用@Bean注释表明此DTO所对应的DB表名,剩下的就是字段和getter、setter了。
※注:当进行多表检索时,@Bean指定其中的一个table即可。

接下来是DAO,代码大体比较易懂。
1 package com.hg.s2dao.dao;
2
3 import java.util.List;
4
5 import org.seasar.dao.annotation.tiger.Arguments;
6 import org.seasar.dao.annotation.tiger.Query;
7 import org.seasar.dao.annotation.tiger.S2Dao;
8 import org.seasar.dao.annotation.tiger.Sql;
9
10 import com.hg.s2dao.dto.Example;
11
12 @S2Dao(bean = Example.class)
13 public interface ExampleDao {
14
15     // C////////////////////////////////////
16     /** insert multi */
17     int insertExamples(java.util.List<Example> exps);
18
19     /** insert single */
20     int insertExample(Example exp);
21
22     // R////////////////////////////////////
23     /** search all */
24     List<Example> findAll();
25
26     /** sql command */
27     @Sql("SELECT MAX(E.ID) FROM EXAMPLE E ")
28     String findIDMax();
29
30     /** contains condition */
31     @Query("ID = ? AND NAME = ?")
32     Example findAllByIdAndName(String id, String name);
33
34     /** when multi use or self-define order */
35     @Arguments( { "id1", "id2" })
36     @Query("ID = /*id2*/ OR ID = /*id1*/ ")
37     List<Example> findAllById(String id1, String id2);
38
39     /** list param */
40     @Arguments( { "ids" })
41     @Query("ID IN /*ids*/('') ")
42     List<Example> findAllByIdList(List<String> ids);
43
44     /** param condition */
45     @Arguments( { "ids" })
46     @Query("1 != 0 " //
47             + "/*IF ids != null && ids.size() > 0*/" //
48             + "AND ID IN /*ids*/('') " //
49             + "/*END*/")
50     List<Example> findAllByIdListAdv(List<String> ids);
51
52     // U////////////////////////////////////
53     /** update */
54     int updateExample(Example exp);
55
56     /** object param */
57     @Sql("UPDATE EXAMPLE SET NAME = /*exp.name*/ ")
58     int updateExampleName(Example exp);
59
60     // D////////////////////////////////////
61     /** delete */
62     int deleteExample(Example exp);
63
64     /** delete by param */
65     @Query("ID = ?")
66     int deleteExampleById(String id);
67 }@S2Dao指明了检索对应的数据承接类。
从几个检索函数可以看出,s2dao基本能实现所有种类的检索。
@Query为条件注释(如findAllByIdAndName),相当于where后面的。
当检索条件的参数需要反复使用或颠倒顺序等的时候(如findAllById),需要添加@Arguments注释。
@Sql则为原生态无污染的SQL代码注释(如findIDMax)。
可以对输入参数进行条件控制(如findAllByIdListAdv)。

测试程序:
1 private static void testBase() {
2
3     ExampleDao dao = getComponent(ExampleDao.class);
4
5     // C///////////////////////////////
6     Example exp = new Example();
7     exp.setId("1");
8     exp.setName("a");
9     System.out.println(dao.insertExample(exp));
10     exp = new Example();
11     exp.setId("2");
12     exp.setName("b");
13     System.out.println(dao.insertExample(exp));
14
15     // R///////////////////////////////
16     System.out.println(dao.findAll());
17     System.out.println(dao.findAllByIdAndName("1", "a"));
18     System.out.println(dao.findAllById("1", "2"));
19     System.out.println(dao.findIDMax());
20
21     List<String> ids = new ArrayList<String>();
22     ids.add("1");
23     ids.add("2");
24     System.out.println(dao.findAllByIdList(ids));
25     System.out.println(dao.findAllByIdListAdv(null));
26     System.out.println(dao.findAllByIdListAdv(ids));
27
28     // U///////////////////////////////
29     exp = new Example();
30     exp.setId("1");
31     exp.setName("c");
32     System.out.println(dao.updateExample(exp));
33     exp = new Example();
34     exp.setName("haha");
35     System.out.println(dao.updateExampleName(exp));
36
37     // D///////////////////////////////
38     exp = new Example();
39     exp.setId("1");
40     exp.setName("a");
41     System.out.println(dao.deleteExample(exp));
42     exp = new Example();
43     exp.setId("2");
44     System.out.println(dao.deleteExample(exp));
45 }
46
47 public static <T> T getComponent(final Class<T> clazz) {
48     final S2Container container = SingletonS2ContainerFactory.getContainer();
49     final Object o = container.getComponent(clazz);
50     final T bean = clazz.cast(o);
51     return bean;
52 }※注:在执行测试前,需要进行框架的初始化,其实就是一行:
SingletonS2ContainerFactory.init();

执行结果当然是OK,控制台LOG就不贴了,贴一下生成的DB LOG,按测试代码中调用dao函数的顺序一一对应:
1 INSERT INTO EXAMPLE (id, name) VALUES ('1', 'a')
2 INSERT INTO EXAMPLE (id, name) VALUES ('2', 'b')
3 SELECT EXAMPLE.id, EXAMPLE.name FROM EXAMPLE
4 SELECT EXAMPLE.id, EXAMPLE.name FROM EXAMPLE WHERE ID = '1' AND NAME = 'a'
5 SELECT EXAMPLE.id, EXAMPLE.name FROM EXAMPLE WHERE ID = '2' OR ID = '1'
6 SELECT MAX(E.ID) FROM EXAMPLE E
7 SELECT EXAMPLE.id, EXAMPLE.name FROM EXAMPLE WHERE ID IN ('1', '2')
8 SELECT EXAMPLE.id, EXAMPLE.name FROM EXAMPLE WHERE 1 != 0
9 SELECT EXAMPLE.id, EXAMPLE.name FROM EXAMPLE WHERE 1 != 0 AND ID IN ('1', '2')
10 UPDATE EXAMPLE SET name = 'c' WHERE id = '1'
11 UPDATE EXAMPLE SET NAME = 'haha'
12 DELETE FROM EXAMPLE WHERE id = '1'
13 DELETE FROM EXAMPLE WHERE id = '2'
2.多表

1 package com.hg.s2dao.dto;
2
3 import org.seasar.dao.annotation.tiger.Bean;
4
5 @Bean(table = "FATHER")
6 public class Father {
7
8     private String id;
9     private String name;
10
11     public String getId() {
12         return id;
13     }
14
15     public void setId(String id) {
16         this.id = id;
17     }
18
19     public String getName() {
20         return name;
21     }
22
23     public void setName(String name) {
24         this.name = name;
25     }
26
27 }
1 package com.hg.s2dao.dto;
2
3 import org.seasar.dao.annotation.tiger.Bean;
4 import org.seasar.dao.annotation.tiger.Relation;
5
6 @Bean(table = "CHILD")
7 public class Child {
8
9     private String id;
10     private String name;
11     private Father father;
12     /* s2dao do not support cascade CUD but only R,so need field 'fId' */
13     private String fId;
14
15     public String getId() {
16         return id;
17     }
18
19     public void setId(String id) {
20         this.id = id;
21     }
22
23     public String getName() {
24         return name;
25     }
26
27     public void setName(String name) {
28         this.name = name;
29     }
30
31     public String getFId() {
32         return fId;
33     }
34
35     public void setFId(String id) {
36         fId = id;
37     }
38
39     @Relation(relationNo = 0, relationKey = "F_ID:ID")
40     public Father getFather() {
41         return father;
42     }
43
44     /* cannot del this method */
45     public void setFather(Father father) {
46         this.father = father;
47     }
48
49 }Father和Child存在一对多/一对一关联,Child中维持着与Father的关系。
看到这你可能会很奇怪,为什么要存在fId字段?不是有Father类了么?遗憾的是,目前s2dao不支持级联的插入更新删除(CUD),只支持级联检索。fId是为了CUD而存在的。
实现级联检索的是Child.java中的getFather方法,@Relation指明了其关系。relationNo为是第几个外键关联的序号,relationKey为主外键名称声明。

1 package com.hg.s2dao.dao;
2
3 import org.seasar.dao.annotation.tiger.S2Dao;
4
5 import com.hg.s2dao.dto.Father;
6
7 @S2Dao(bean = Father.class)
8 public interface FatherDao {
9
10     /** insert single */
11     int insert(Father f);
12
13     /** delete */
14     int delete(Father c);
15 }
1 package com.hg.s2dao.dao;
2
3 import org.seasar.dao.annotation.tiger.Query;
4 import org.seasar.dao.annotation.tiger.S2Dao;
5
6 import com.hg.s2dao.dto.Child;
7
8 @S2Dao(bean = Child.class)
9 public interface ChildDao {
10
11     /** insert single */
12     int insert(Child c);
13
14     /** contains condition */
15     // cannnot only write: @Query("ID = ?")
16     @Query("CHILD.ID = ?")
17     Child findAllById(String id);
18
19     /** update */
20     int update(Child c);
21
22     /** delete */
23     int delete(Child c);
24
25 }
测试程序:
1 private static void testRelation() {
2
3     FatherDao daoF = getComponent(FatherDao.class);
4     ChildDao daoC = getComponent(ChildDao.class);
5
6     // C///////////////////////////////
7     Father popeye = new Father();
8     popeye.setId("1");
9     popeye.setName("Popeye");
10     System.out.println(daoF.insert(popeye));
11
12     Child pipeye = new Child();
13     pipeye.setId("1");
14     pipeye.setName("Pipeye");
15     pipeye.setFId(popeye.getId());
16     System.out.println(daoC.insert(pipeye));
17
18     Child pupeye = new Child();
19     pupeye.setId("2");
20     pupeye.setName("Pupeye");
21     pupeye.setFId(popeye.getId());
22     System.out.println(daoC.insert(pupeye));
23
24     // R///////////////////////////////
25     // pipeye.getFather() is null,so need search again
26     Child pipeyeNew = daoC.findAllById(pipeye.getId());
27     System.out.println(pipeyeNew.getFather());
28
29     // U///////////////////////////////
30     pipeyeNew.setName("pipeyeNew");
31     System.out.println(daoC.update(pipeyeNew));
32
33     // D///////////////////////////////
34     System.out.println(daoC.delete(pipeye));
35     System.out.println(daoC.delete(pupeye));
36     System.out.println(daoF.delete(popeye));
37 }
执行结果DB LOG:
1 INSERT INTO FATHER (id, name) VALUES ('1', 'Popeye')
2 INSERT INTO CHILD (id, f_id, name) VALUES ('1', '1', 'Pipeye')
3 INSERT INTO CHILD (id, f_id, name) VALUES ('2', '1', 'Pupeye')
4 SELECT CHILD.id, CHILD.f_id, CHILD.name, father.id AS id_0, father.name AS name_0 FROM CHILD, FATHER father WHERE CHILD.F_ID = father.ID(+) AND CHILD.ID = '1'
5 UPDATE CHILD SET f_id = '1', name = 'pipeyeNew' WHERE id = '1'
6 DELETE FROM CHILD WHERE id = '1'
7 DELETE FROM CHILD WHERE id = '2'
8 DELETE FROM FATHER WHERE id = '1'


除以上功能,s2dao还可以调用存储过程,这里就不再介绍了。

0
0
分享到:
评论

相关推荐

    seasar框架S2Dao使用指南

    【S2Dao简介及特征】 S2Dao是Seasar2框架的一个重要组成部分,作为一个轻量级的持久化解决方案,它的主要特点是简化了Object-Relational Mapping(O/R映射)的过程,无需繁琐的XML配置。S2Dao的核心优势在于: 1. ...

    S2DAO源码

    S2DAO,全称为Seasar2 Data Access Object,是一个在日本广泛应用的开源数据库操作工具包,主要为Java开发者提供简化数据库访问的功能。S2DAO作为Seasar项目的一部分,旨在提高开发效率,通过自动化处理常见的数据库...

    S2dao架包集合

    **S2dao框架详解** S2dao,全称为Simple Data Access Object,是一个源自日本的轻量级开源框架,主要用于简化Java应用中的数据访问层(DAO)操作。它以高效、简洁为设计理念,提供了丰富的功能,使得开发人员可以...

    S2Dao说明文档

    **S2Dao** 是一个基于Java的持久层框架,它为开发者提供了简洁、高效的数据库操作方式。本说明文档将深入探讨S2Dao的核心概念、功能特性、安装与配置、使用方法以及常见问题解决策略。 首先,S2Dao的命名来源于...

    日本S2DAO技术框架

    【标题】:“日本S2DAO技术框架” 【描述】:“S2DAO,全称为Simple and Smart Data Access Object,是一款源自日本的开源数据访问框架。它为Java开发人员提供了一种简单而智能的方式来处理数据库操作,简化了传统...

    一个日系seasar框架Demo:S2Containor+S2Dao+SAStruts+mayaa

    在这个“S2Containor+S2Dao+SAStruts+mayaa”的Demo中,我们将逐一探讨这些关键组件。 首先,S2Container是Seasar框架的核心,它是一个轻量级的IoC(Inversion of Control)容器。IoC容器负责管理和装配对象,使得...

    S2DAO开发实例(附有全部代码以及开发官方文档)

    详细描述S2DAO的开发实例,附有全部代码以及开发官方文档。

    s2-dao-1.0.49.zip

    在压缩包内的文件名称列表中,我们看到了“s2dao”、“s2dao-tiger”以及“doc”。这些文件可能包含以下内容: 1. "s2dao":这个目录很可能包含了Seasar2 DAO框架的核心库,包括必要的Java类和接口,使得开发者可以...

    s2-dao-1.0.50.zip

    - **s2dao-tiger**:这可能是针对特定JDBC驱动(如Oracle、MySQL等)或Java版本的扩展库,提供了针对不同数据库特性的定制化功能。 - **doc**:文档文件,可能包含S2-DAO的用户手册、API参考、教程或者示例代码,是...

    seasar2 samples

    Seasar2是一个开源的Java应用框架,而S2DAO是其数据库访问组件,它提供了简单易用的接口来处理数据库操作。然而,你提到的是"seasar2 samples",但结合描述,似乎这里指的是.NET环境下的一个类似实现,可能是基于C#...

    s2hibernate

    Seasar 是一个日本开发的开源Java框架,它包含了一系列的组件,如S2Container、S2Action、S2Dao等,旨在简化企业级应用的开发工作。本文将深入探讨S2Hibernate的相关知识点,包括其核心功能、如何使用以及与Seasar...

    Seasar2.3全

    Seasar框架的核心组件包括S2Container、S2DAO、S2Action、S2JDBC等,它们协同工作以实现高效、灵活的开发流程。以下是对这些主要组件的详细解释: 1. **S2Container**:它是Seasar的依赖注入(DI)容器,负责管理...

    seasar2.3

    2. **S2DAO**: 数据库访问对象,简化了数据库操作,通过ORM(对象关系映射)技术将Java对象与数据库表关联起来,减少了手动编写SQL的需要。 3. **S2DBC**: 数据库连接池管理,负责数据库连接的创建、分配和回收,...

    Seasar2最新版

    Seasar2框架包含多个组件,如S2Container(容器)、S2DAO(数据访问对象)、S2Action(动作)以及S2Remoting(远程调用)等。这些组件相互协作,构建出一个强大的企业级应用开发环境。 1. S2Container:作为Seasar2...

    s2axis2 实例

    Seasar2的核心组件包括S2Container,它负责管理应用程序的生命周期,以及S2DAO、S2Action等,分别用于数据访问和业务逻辑处理。 2. **Axis2 Web服务引擎**:Axis2是Apache的下一代Web服务引擎,它在处理SOAP消息...

    Seasar小例子

    - 数据库连接和S2DAO的使用:演示如何配置数据源,以及如何通过S2DAO执行SQL查询和更新操作。 - 视图的呈现:可能使用了JSP或其他模板技术来展示Action返回的数据,实现前端与后端的交互。 - 可能还包含了运行和测试...

    seasar

    数据访问对象(DAO)模式是数据库操作的标准设计模式,Seasar的S2DAO模块实现了这一模式,提供了一种统一的方式来处理各种数据库操作。它封装了SQL的编写和执行,减轻了开发者的工作负担。S2DAO支持多种数据库,包括...

    java seasar docment

    S2Dao是Seasar2提供的持久层解决方案,它支持SQL语句的编写和执行,并提供了简单的对象关系映射功能。通过S2Dao,开发者可以轻松地操作数据库而无需关心底层细节。 #### 3. S2Logic S2Logic主要用于定义业务逻辑...

    seasar2 官方例子代码

    Seasar2的核心组件包括S2Container、S2DAO、S2JUnit等,这些组件共同构建了一个完整的开发环境,使得开发者可以更加高效地编写和管理Java应用程序。 标题“seasar2 官方例子代码”意味着这个压缩包中包含的是Seasar...

Global site tag (gtag.js) - Google Analytics