Matrix Java 大讲坛:DAO 模式的应用(Matrix 朱世杰)


( 农民 - Javen) 19:46:46

时间到了,现在开始吧!


大家欢迎 朱世杰 给我们讲解 DAO 模式的应用!


(_阿古) 19:46:57

欢迎

( 农民 - Javen) 19:47:02

还是老习惯,请大家用普通字体、颜色。 主讲使用红色

(杨树) 19:47:04

啪啪啪啪,鼓掌

(_阿古) 19:47:16


(朱世杰℡) 19:47:18

大家好,呵呵,很荣幸能和大家交流一下

( foxcrane) 19:47:18


(&咚咚响) 19:47:19

.

(山鬼的情人) 19:47:27


( foxcrane) 19:47:28


(ThinkInJava) 19:47:33

( 农民 - Javen) 19:47:34

(聊且一笑) 19:47:42


(朱世杰℡) 19:47:48

开始吧?

( 农民 - Javen) 19:48:11

好的! 现在开始!

(郁也风) 19:48:15


(_阿古) 19:48:28


(朱世杰℡) 19:48:35

DAO模式大家都熟悉的,就是数据访问对象

(朱世杰℡) 19:49:17

本来这部分是CHAR来讲的,现在我和大家先交代一下,这些官方的语言我不太会说

(朱世杰℡) 19:50:00

大家觉得有必要在讲DAO的含义吗,我想直接讲方案好了,时间不够

(朱世杰℡) 19:50:19

DAO的包装现在已经发展的很成熟了

(郁也风) 19:50:22


(杨树) 19:50:28


(朱世杰℡) 19:50:47

我一会给大家介绍一个方案

(朱世杰℡) 19:50:55

先说说它的特点吧

(朱世杰℡) 19:51:46

1,传统的分层结构,和一些数据库隔离等等

(朱世杰℡) 19:52:20

这些我不多说了。2,以接口来编程

(朱世杰℡) 19:52:37

大家可以随时提问

(朱世杰℡) 19:53:10

接口编程不是大家通常说的,而是你在新加一个实体以后,所做的只是CODE一个接口

(&咚咚响) 19:53:23

不应该说是用接口而以..

(朱世杰℡) 19:53:31

也就是用了反射和代理

(&咚咚响) 19:53:31

基类才是用接口..

(&咚咚响) 19:53:49

具体的还是类,而不是接口吧..

(朱世杰℡) 19:54:02

呵呵,是接口,所以我觉得它特别

(朱世杰℡) 19:54:13

不需要你实现它

( foxcrane) 19:54:20

你说的这个接口编程和大家通常说的 有什么区别

你用DAO接口来解决多数据库支持的问题么

(冰云) 19:54:22

是通过接口方法名调用named query哪个吗?

(朱世杰℡) 19:54:54

TO FOXCRANE

(&咚咚响) 19:55:19

DAO是封装了data source怎么可能是接口的呢..我还是不明白啊

(朱世杰℡) 19:55:26

你还没理解我的意思,是说只做接口,程序会代理它的实现的

(朱世杰℡) 19:55:42

TO 冰云

(朱世杰℡) 19:56:20

你说的这个在后面我会谈到,不过现在,只是谈到这个CRUD

(拓拔涛) 19:56:27

程序会代理它的实现的?

(朱世杰℡) 19:56:41

也就是动态代理了。

(拓拔涛) 19:56:58

恩,继续~

( foxcrane) 19:57:03

哦,好象很有趣,关注

(朱世杰℡) 19:57:27

普通的SAVE ADD 等等,这些是可以代理的

(朱世杰℡) 19:58:08

但是具有业务特色的查询怎么办?只有自己来做了

(&咚咚响) 19:58:37

那其实只要在DAO之前加一个service就可以了..

(朱世杰℡) 19:58:37

自己做也并不意味着要写那么多代码的复杂实现

(聊且一笑) 19:59:52

好,有意思,动态代理

(朱世杰℡) 20:00:17

因为HIBERNATE是有NAMED QUERY的,所以我们也可以用代理的方法,分2步,1,先在那个实体接口里加上自己的业务方法

(朱世杰℡) 20:00:55

2,在实体配置里加上NAMED QUERY

(朱世杰℡) 20:01:22

这样比直接用HIBERNATENAMDE QUERY也方便很多

(朱世杰℡) 20:01:43

我们要做的就这2

(朱世杰℡) 20:02:32

还有问题吗

(朱世杰℡) 20:02:56

这部分是比较难理解的

( 农民 - Javen) 20:03:02

举例? 问题多了,没有明白!

(聊且一笑) 20:03:23

这个举个例子

(朱世杰℡) 20:03:33

OK

(拓拔涛) 20:04:01

所有的都要到配置里面处理?

(朱世杰℡) 20:04:10

public interface UserMgr {

public void add(User user) throws PersistenceException;

public void update(User user) throws PersistenceException;

public void remove(User user) throws PersistenceException;

public User findByPrimaryKey(Long id) throws LookupException;

public Collection findAll() throws LookupException;

}

(朱世杰℡) 20:04:47

如果只是简单的CRUD,那么我们在新加了一个实体以后,要做的就是这么多

( 农民 - Javen) 20:05:39

你说的这个实体,是另外的 POJO ?还是实现 POJO 还加上实现这个接口?

(朱世杰℡) 20:05:52

就是HIBERNATE里的PO

(朱世杰℡) 20:06:20

(朱世杰℡) 20:06:59

意思就是简化我们的CODE

(&咚咚响) 20:07:26

那就是把一个PO变成一个BO

(朱世杰℡) 20:08:18

按我的理解,在这里,还只是PO

(&咚咚响) 20:08:42

可是你的PO已经加了业务逻辑啊..比如add()..update之类的啊

(朱世杰℡) 20:09:11

不是的,POUSER,刚才贴的是USERMGR

(ThinkInJava) 20:09:19

在PO里面是不用加业务逻辑的吧

(郁也风) 20:09:30

set&get

(朱世杰℡) 20:09:33

大家可能理解错了

(朱世杰℡) 20:09:45

我是在PO外面加了一层

(&咚咚响) 20:09:45

应该是DAO来实现你的那个UserMgr接口

(&咚咚响) 20:10:04

而不是实体..

(朱世杰℡) 20:10:20

TO 咚咚响:

(拓拔涛) 20:10:36

老朱,到底怎么实现的动态代理~?

(朱世杰℡) 20:10:38

可能是我讲的太乱了,你误会了

(朱世杰℡) 20:10:48

这样讲吧

(郁也风) 20:11:06

老朱把UserMgr名字换成UserDAO,把实现称为UserDAOImpl也许就清楚了:)

(&咚咚响) 20:11:20

..

(朱世杰℡) 20:11:47

我之所以没把MGR换成DAO来写,是因为外面还有一层

(&咚咚响) 20:12:02

..那是哪一层啊

(拓拔涛) 20:12:03

还有一层 ?

(_阿古) 20:12:27

service?>

(&咚咚响) 20:12:37

应该是了吧..

(拓拔涛) 20:12:38

建议,

先说完吧,然后咱们再提问~?

(朱世杰℡) 20:13:01

业务里对数据的包装,事务也在这里加进去

(朱世杰℡) 20:13:11

错了,是数据的处理

(朱世杰℡) 20:13:36

简单的CRUD不算DAO

(朱世杰℡) 20:14:36

如果你在逻辑层里调这个MGR,那事务就跑到逻辑层里面了,违反原则了

(朱世杰℡) 20:15:26

业务数据类---MGR-----PO,其中MGR是个接口,我们不实现它

(朱世杰℡) 20:16:18

简单的CRUD可以直接写,复杂的查询和更新,自己在配置文件里搞定一个HQL,也不用实现

(朱世杰℡) 20:16:50

不过前提是你的自定义的查询方法名要和配置文件里对应起来

(朱世杰℡) 20:17:15

语文不好,大家不明白提问好了,我给个例子大家

(共筑佳话) 20:17:53

一对多,多对多的不通过配置文件可行不?

(朱世杰℡) 20:18:48

这个数据ORM部分,和DAO这里的处理没多大关系,到DAO这里就已经都是PO

(朱世杰℡) 20:19:09

看你的需要,可以1对多

(朱世杰℡) 20:19:17

public Collection findProductByName(String name) throws LookupException;

(朱世杰℡) 20:19:28

上面这个是自己定义的方法

(朱世杰℡) 20:20:06

<query name="com.ociweb.domain.UserMgr.findUserById"><![CDATA[

from zzks.hibernate.User as user

where user.id = ?]]>

</query>

(朱世杰℡) 20:20:14

HIBERNATE里类似这样

(朱世杰℡) 20:20:50

大家有问题问吧,时间不多了

(朱世杰℡) 20:20:58

后面还有很多

( 农民 - Javen) 20:21:31

要不你先讲完吧! 之后一起提问也可以

(朱世杰℡) 20:21:41

好的

(_阿古) 20:21:47

老朱要急着见GF?〉

(朱世杰℡) 20:22:00

不是规定1个小时么

(朱世杰℡) 20:22:32

今天大家是来听模式的吧

( 农民 - Javen) 20:22:35

没有这个规定啊。 大多数是 2 个小时

(朱世杰℡) 20:22:56

下面说说这个方案里,是如何处理的

(朱世杰℡) 20:23:12

如何处理事务,代理,等等。

(朱世杰℡) 20:23:44

这里的代理用了COMMAND模式

(朱世杰℡) 20:24:07

我个大家个代码

(朱世杰℡) 20:24:57

class AddCommand extends TransactionalCommand {

protected Object command(Object[] args, net.sf.hibernate.Session session) throws Exception {

try {

return session.save(args[0]);

} catch (HibernateException e) {

throw new PersistenceException("Unable to add new object to the datastore", e);

}

}

}

(朱世杰℡) 20:25:39

这东西是是老外总结的,只是没有完善,甚至没法编译,我把它改了一部分

(朱世杰℡) 20:26:30

之所以EXTENDS一个事务COMMAND

(冰云) 20:26:52

嘿嘿,这个好

(朱世杰℡) 20:27:12

用了模板模式(好象,我也不太清楚这些名词)

(冰云) 20:27:24

我认为在使用hibernate的情况下,最好是使用Command模式,而不是DAO

(_阿古) 20:27:48

等老朱讲完嘛:)

(朱世杰℡) 20:28:16

TO 冰云:我的理解是DAO比较广,COMMADN只是被包装的东西

(朱世杰℡) 20:28:43

大家看看:

(朱世杰℡) 20:28:46

abstract class TransactionalCommand implements Command {


public Object execute(java.lang.reflect.Method method, Object[] args, Session session) throws Exception {

if (args == null || args[0] == null) {

throw new PersistenceException("Null target record cannot be added, updated, or removed");

}

Transaction txn = session.beginTransaction();

try {

Object result = command(args, session);

txn.commit();

return result;

} finally {

if (!txn.wasCommitted()) {

txn.rollback();

}

}

}


protected abstract Object command(Object[] args, Session session) throws Exception;

}

(冰云) 20:28:52

对~ 

(朱世杰℡) 20:29:58

这是一个抽象类,本来CHAR在,他想顺便讲一下这些个模式的,结果只有我来含糊过去了

(朱世杰℡) 20:31:21

用这个模板把事务包起来了。

(朱世杰℡) 20:31:37

有问题吗

(朱世杰℡) 20:32:28

这个是普通的CRUD的实现举例

(朱世杰℡) 20:32:59

NAMED QUERY也有一个对应的COMMAND

(朱世杰℡) 20:33:23

这样所有的操作都有了自己的COMMAND

(朱世杰℡) 20:33:56

下面说一下SESSION的处理

(朱世杰℡) 20:34:37

这里就老掉牙了,呵呵,也用的是ThreadLocal

(朱世杰℡) 20:35:04

我在MATRIX里发过一个文章,说这个的。

(朱世杰℡) 20:34:37

这里就老掉牙了,呵呵,也用的是ThreadLocal

(朱世杰℡) 20:35:04

我在MATRIX里发过一个文章,说这个的。

(朱世杰℡) 20:35:53

SESSION是保存在ThreadLocal里的

(朱世杰℡) 20:36:03

产生可以用工厂模式实现

(朱世杰℡) 20:36:48

有问题吗

(朱世杰℡) 20:37:03

没有下面说一下代理

(朱世杰℡) 20:37:59

刚才不是谈了,说我们只做接口,不做实现吗

(朱世杰℡) 20:38:15

那我们如何调用呢?

(朱世杰℡) 20:38:52

这里用SERVICELOCATE

(朱世杰℡) 20:39:41

public interface ServiceLocator {

Object getDomainObjectManager(Class managerClass)

(朱世杰℡) 20:41:00

在这里调MGR

( 农民 - Javen) 20:42:16

那实现在哪里?

(朱世杰℡) 20:42:17

具体的实现在

(朱世杰℡) 20:42:19

public Object getDomainObjectManager(Class managerClass) throws ServiceLocatorException {

validate(managerClass);

return Proxy.newProxyInstance(managerClass.getClassLoader(), new Class[]{managerClass},

new ManagerDelegate());

}

(朱世杰℡) 20:42:49

就是这里用代理了

(朱世杰℡) 20:44:06

private static class ManagerDelegate implements InvocationHandler {

private Logger log = LogManager.getLogger(getClass());


public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

Command command = resolveCommand(method);

if (command == null) {

throw new UnsupportedOperationException();

}

try {

return command.execute(method, args, getSession());

} catch (Exception e) {

invalidateSession();

throw e;

}

}

(朱世杰℡) 20:44:40

这里不好一步步讲了,这里还是以提问为主吧

(郁也风) 20:45:51

说说这样作的好处吧,代码比较离散,看起来有点累

(朱世杰℡) 20:46:07

( 农民 - Javen) 20:46:16

我是还不太懂! DAO 也能这么复杂,目的好像是减少代码量

(朱世杰℡) 20:46:40

看来我的语文太差了,呵呵,我来解释一下。

( 农民 - Javen) 20:46:44

我现在写 DAO ,特别是用 jdbc ,代码量的确是太大了。 也在思考办法

(朱世杰℡) 20:47:10

拿农民来举例吧

(朱世杰℡) 20:47:45

你是不是写一个DAO,都要自己来写一个个的ADDUPDATEDELFIND等等

( 农民 - Javen) 20:48:23

是啊。 然后是加 N query ,根据业务的复杂度

(朱世杰℡) 20:48:36

那每个实体的这些操作,除了实体名字不一样以外,HQL都一样吧

(郁也风) 20:49:01

基本上了

( 农民 - Javen) 20:49:29

嗯,先把 query 放在一边。另外再说。 CRUD 是基本上一样的

(郁也风) 20:49:34

我想采取的方法是写个简单的代码生成工具,把这些都实现了

(朱世杰℡) 20:50:13

代码生成工具也是要实现代码的,:),何不写个接口,用代理来实现它?

(朱世杰℡) 20:50:35

农民,现在就谈CRUD

(&咚咚响) 20:51:17

用接口..好主意啊..

(Join) 20:51:36

cdt太爽了

(朱世杰℡) 20:52:09

CDT是啥?

( 农民 - Javen) 20:52:13

join: 现在是讲座时间

(朱世杰℡) 20:52:37

农民,理解没。

(Join) 20:53:05

sorry

(朱世杰℡) 20:53:36

农民刚才说把QUERY放一边,那现在说说QUERY

( 农民 - Javen) 20:53:52

呵呵,实际上动态代理我没有明白。 得之后仔细研究一下了。


好像动态代理可以做很多事情,比如 spring 实现 AOP 好像都是用的动态代理?

(朱世杰℡) 20:54:27

反射和代理确实很方便

(朱世杰℡) 20:55:23

比如,代理先查看你调用的ADD方法,然后根据ADD这个字符来找ADDCOMMAND这个类

(朱世杰℡) 20:55:57

然后执行ADDCOMMANDEXECUTE方法

(朱世杰℡) 20:56:29

EXECUTE里传的还有你的UserMgrUSER

( 农民 - Javen) 20:57:05

service 里,你需要做的动作是?

(朱世杰℡) 20:57:23

你说的SERVICE是?

( 农民 - Javen) 20:58:21

你现在说的不是 DAO 吗? 我在 service / business 里,要调用这个 DAO User 存到数据库。 具体代码?

(朱世杰℡) 20:59:55

UserMgr thh=(UserMgr)GlobalServiceLocator.get().

(朱世杰℡) 21:00:22

UserMgr thh=(UserMgr)GlobalServiceLocator.get().

getDomainObjectManager(th);

(朱世杰℡) 21:00:59

然后用这个MGR.add()

(朱世杰℡) 21:01:58

用的SERVICELOCATOR

(&咚咚响) 21:02:44

我认为应该是servicelocator来调用service的啊

(郁也风) 21:03:07

嗯,看上去很美的说。UserMgr thh=(UserMgr)GlobalServiceLocator.get(). 这儿如果用spring的话,可以在bean里面配置一下,然后只要重新实现command和这个locator就可以转换具体的实现了

(&咚咚响) 21:03:23

因为只有servicelocator才知道service在那里啊..

(朱世杰℡) 21:03:59

你说的SERVICE是业务数据处理对吗

(&咚咚响) 21:04:24

可是农民所说你应该就是吧

(郁也风) 21:04:27

不过下面回溯到那个事务处理的地方把,如果我add若干次,update若干次,del若干次,好像那个事务控制就有问题了

(朱世杰℡) 21:04:38

呵呵,对

(郁也风) 21:04:51

因为你只是针对crud来作事务处理的

(朱世杰℡) 21:05:17

这个我前几天还在这里讨论过,有的说事务镶套

(朱世杰℡) 21:05:30

后来总结出来

(郁也风) 21:05:49

我觉得事务应该在service / business里面处理才对啊

(朱世杰℡) 21:06:05

听我说完吧

(朱世杰℡) 21:06:18

我也考虑这个好久了

(郁也风) 21:06:51

呵呵,我洗耳朵去:)

(朱世杰℡) 21:06:56

该用单独JTA,还是HIBERNATE的自己的事务控制,还是EJB的事务

(&咚咚响) 21:07:25

如果在Spring里面的话..

(&咚咚响) 21:08:03

JTA来还是比较好吧...

(朱世杰℡) 21:08:10

如果没有用EJB,那事务处理也要放在SERVICE层。

(朱世杰℡) 21:08:52

之所以我不想把HIBERNATE的事务带到SERVICE

(朱世杰℡) 21:09:05

因为这样2层之间偶合比较大

(&咚咚响) 21:09:12

事务处理的话..那也就是说整个的业务处理也在service里面了

( 农民 - Javen) 21:09:31

如果用 spring ,用哪种事务处理都可以,配置就好了。 他有个事务抽象层。 介绍说里,这是它的优势之一

(朱世杰℡) 21:10:37

TO 咚咚响,不该说全部,应该是一个业务对实体的处理

(朱世杰℡) 21:11:08

可能还有会有其他JMS的处理

(&咚咚响) 21:11:30

..我还没有考虑到JMS..呵呵..

(朱世杰℡) 21:11:32

多个FACADE呵呵

(朱世杰℡) 21:12:14

事务处理没问题了吧

(&咚咚响) 21:12:19

如果没有ejb的话..我觉没有用facade的必要吧..

(char) 21:12:52

大家好...

(char) 21:13:12

讲到什么问题啦...

( 农民 - Javen) 21:13:18

终于来了哦! ;char 讲解一下这里用到的模式吧

(朱世杰℡) 21:13:36

TO 咚咚响,这个改日谈吧,超纲了,呵呵

(char) 21:13:47

农民能不能发个刚才的记录过来先呀...

(&咚咚响) 21:13:49

..不好意思了..

(方片) 21:14:05

在我这里,等下

(朱世杰℡) 21:14:18

CHAR

(char) 21:14:24

不好意思,下次有机会,我会再补充gof,这次还是先围着DAO

(char) 21:14:37

世杰,

(朱世杰℡) 21:14:46

就是我和你说的那些

(朱世杰℡) 21:14:56

你讲讲吧

( 农民 - Javen) 21:15:39

动态代理。 关于 QUERY 的处理。

(char) 21:15:40

继续我来讲,就开头讲吧,我可能跟世杰的DAO接不上...

(char) 21:15:51

要先贴几个图吗?

( 农民 - Javen) 21:16:00

好! 欢迎欢迎

( 农民 - Javen) 21:16:19

可以贴图啊。

(char) 21:16:31

(char) 21:16:47

gof最基本的东西...

(char) 21:17:28

所有模式都是基本几个原则的:

(char) 21:17:53

( 农民 - Javen) 21:18:08

可能服务器太慢,我收不到图片!

(朱世杰℡) 21:18:17

我也是

(char) 21:18:42

(char) 21:19:08

不是吧,那么不贴图了...

(共筑佳话) 21:19:18

(ThinkInJava) 21:19:24

(char) 21:19:37


(char) 21:19:43

能看吗?

(ThinkInJava) 21:19:49

可以

(朱世杰℡) 21:19:50

KEYI

(泥娃娃) 21:20:09

char,厉害哟,

找到这么多好图片:)

(char) 21:20:13

(共筑佳话) 21:20:19

好。

( 农民 - Javen) 21:20:23

char : 把你的字体换成 红色

(char) 21:20:28

不是找的。用mindmanger,前几天准备的

(郁也风) 21:21:02

晕倒,我咋看不见泥:(

(郁也风) 21:21:06

速度太慢

(char) 21:21:27

我用这个色吧,以与世杰主角的颜色,区别...

(ThinkInJava) 21:21:51

要不直接把MINDMANGER的那个文件共享?

(char) 21:22:02

如何共享?

(char) 21:22:15

好,这个明天发给大家

(泥娃娃) 21:22:26

好好好,还是char

(郁也风) 21:22:45

发给我吧,我开个服务,大家下载

(char) 21:23:14

世杰,你先继续。我先看看你前面说的东西。

(朱世杰℡) 21:24:19

好吧

(朱世杰℡) 21:24:40

农民,继续你刚才不懂的

(朱世杰℡) 21:24:48

QUERY问题

(朱世杰℡) 21:25:23

HIBERNATE里有一个NAMED QUERY,是以这个为基础的

(朱世杰℡) 21:26:23

大家不说,我不知道是不是该在这里继续解释?

(郁也风) 21:26:42

呵呵,听着呢:)

(&咚咚响) 21:26:44

说好了..

(朱世杰℡) 21:27:34

NAMED QUERY的目的就是想能把HQL独立在配置文件里,这样DBA优化起来,也不用再CODE

( 农民 - Javen) 21:27:44

不好意思,因为我对 hibernate NAMED QUERY 也不熟悉。   看来有点落伍了......

(朱世杰℡) 21:28:50

简单说吧,就是把以前写在类里的SQL语言,写在XML文件里了,好改而已

(朱世杰℡) 21:30:10

不是落伍了,只是你别的太强了,呵呵

(朱世杰℡) 21:30:44

NAMED QUERY就是这个意思

(朱世杰℡) 21:30:54

一般不用DAO

(朱世杰℡) 21:31:32

就是直接使用HIBERNATENAMED QUERY,在这个方案里面,包装了一下

(朱世杰℡) 21:32:25

我们调用自己定义的QUERY时,代理会帮我们把处理交给HIBERNATE来做,我们只要结果

(dfdfswsw) 21:32:53

You may even define a named query in the mapping document.


Named Query =SQL XML map ..

( 农民 - Javen) 21:33:03

会后,能不能共享个 demo 出来?    小朱?

(char) 21:33:11

基本上我感觉 DAO 是现行比较好的设计框架.

(dfdfswsw) 21:33:15

<query name="eg.DomesticCat.by.name.and.minimum.weight"><![CDATA[

from eg.DomesticCat as cat

where cat.name = ?

and cat.weight > ?

] ]></query>

(dfdfswsw) 21:33:22

Query q = sess.getNamedQuery("eg.DomesticCat.by.name.and.minimum.weight");

q.setString(0, name);

q.setInt(1, minWeight);

List cats = q.list();

(char) 21:33:49

农民,应该说DAO的一个很好的例子可以找appfuse 来看看.

(朱世杰℡) 21:33:53

1167374举的很对

( 农民 - Javen) 21:34:08

DAO 应该是用得最多的设计模式之一了。   关键现在想更抽象、更省力些地用

(朱世杰℡) 21:34:27

只是方案里可以做的更简单

(char) 21:34:34

我介绍一下appfuse的层次:

dao

service

view

(dfdfswsw) 21:34:54

对不起大家忙cnnic 域名去了。


jms讨论没有做。。。sry

(char) 21:35:29

totodo翻译的一篇文章很详细的说了domain对象,与3个不同层的关系.

( 农民 - Javen) 21:35:56

dfdf 我们确定个时间,你来讲讲 jms 啊。  现在是在讲 DAO 与模式  这个话题

(dfdfswsw) 21:36:28

知道。。我在听。。^0^

(&咚咚响) 21:36:43

..我也大概看了appfuse..

( 农民 - Javen) 21:37:04

domain 应该是各不同层间共享数据,可以传递到不同的层。  简单点就是 POJO

( 农民 - Javen) 21:37:46

现在 世杰的 方案是在说, 通过动态代理,大大地减少 DAO 层的代码量

(朱世杰℡) 21:38:17

( 农民 - Javen) 21:38:21

service 层对简单的应用来说, 会很简单。    view 方案大家就可熟悉了,好像 

( 农民 - Javen) 21:39:44

char: 继续, DAO 层用到的设计模式!  

(朱世杰℡) 21:40:17

要不等我说完他在说吧

(char) 21:40:28

好,继续

(朱世杰℡) 21:40:33

刚才说到NAMED QUERY

(char) 21:40:35

世杰,请继续

(朱世杰℡) 21:40:50

大家理解了,那就可以继续了

(朱世杰℡) 21:41:18

每个操作,不管是CRUD,还是自己的QUERY

(朱世杰℡) 21:41:50

都是用COMMAND来包装

(朱世杰℡) 21:42:03

里面都有自己的EXECUTE方法

(朱世杰℡) 21:42:26

代理就是根据名字来调对应的EXECUTE方法的

(朱世杰℡) 21:43:16

有不理解的吗

(朱世杰℡) 21:43:32

我是很希望大家能明白我的意思的,真的

( 农民 - Javen) 21:43:32

除了一样的包装外(事务), 好像主要也是调用的 hibernate 的对应方法

(朱世杰℡) 21:43:55

对,农民说的对

(朱世杰℡) 21:44:08

DAO只是个包装

( 农民 - Javen) 21:44:23

会后能不能共享一个 demo 出来, demo 一下这个比较特别的 DAO 的实现

(朱世杰℡) 21:44:25

我说的只是个在HIBERNATE外的一层包装

(朱世杰℡) 21:45:11

这个包装和别的包装不同,不需要实现代码,就写个接口,包括你要用到的方法

(dfdfswsw) 21:45:14

比如abc 就是abcEXECTUTE?

就象STRUTSXX.do或者xx.xx 一样?

(朱世杰℡) 21:46:27

DEMO我想过,做DEMO不如做个JAR放在MARTIX

( 农民 - Javen) 21:47:04

已经有了吗?  我会把它放到这个 会议记录一起,供大家方便下载

(朱世杰℡) 21:47:26

我已经在用了

(朱世杰℡) 21:47:42

这个会后说

( 农民 - Javen) 21:48:37

UserMgr thh=(UserMgr)GlobalServiceLocator.get().

getDomainObjectManager(th);

实际上,我还是没有明白, 这个 UserMgr 的实现在哪里?     实现类都没有?

(朱世杰℡) 21:48:53

是没有实现类的

(朱世杰℡) 21:49:10

所以才简单,减少代码量

( 农民 - Javen) 21:49:48

大家还有什么问题吗?   二个小时了,看来 char 的设计模式下次集中再讲吧? 

(朱世杰℡) 21:49:52

新加一个实体PO,就只要加个接口(MGR

(char) 21:50:09

其实世杰说的DAO模式和spring的实现的概念是很相似的.

( 农民 - Javen) 21:50:26

嗯。 迫切想看到这个 jar (源代码有吧?),看看到底神秘在哪里,呵呵

(朱世杰℡) 21:50:36

不象以前写,还要OPENSESSION之类的重复操作

(char) 21:50:37

世杰,应该是说新加一类实体PO,才需要加一个接口吧。

(朱世杰℡) 21:50:49

对,是一类

(char) 21:51:04

因为很多的时候,涉及到一对一,一对多的时候,只需要一个DAO,就可以解决瓿了。

( 农民 - Javen) 21:51:17

与 spring 的 template 的确有些像

(朱世杰℡) 21:51:58

相似是因为都是用到了反射

(char) 21:52:43

其实是一个概念,好的框架都是基于相同的原则来设计,因为会很有多地方相同,

就像hibentatejdo,strutswebwork一样,

因为都是基于比较好的设计原则,才会让人容易接受.

( 农民 - Javen) 21:53:14

 总结得好! 

(log4u) 21:53:48

这样学起来也快

(朱世杰℡) 21:54:24

这次讲的挺失败,都没让大家搞明白

( 农民 - Javen) 21:55:04

没有啊。 只是这个地方的确是比较复杂的。  什么动态代理,我是一直没有太明白,哈哈

( 农民 - Javen) 21:55:17

好了,今天就到这里吧!  非常感谢 朱世杰 共享自己的知识!  也欢迎 char 不久的将来分享对设计模式的研究! 

( 农民 - Javen) 21:55:33

  

(朱世杰℡) 21:55:39

谢谢,客气了

(_阿古) 21:56:02


(郁也风) 21:56:05

呵呵,期待源码:)

(char) 21:56:20

辛苦世杰了

(朱世杰℡) 21:56:21

题外话:农民,我把这个会做个包的,给大家用

( 农民 - Javen) 21:56:39

我会尽快整理好彩色版的记录供大家下载。 以及世杰贡献出的源代码!   再次感谢 世杰! 

(朱世杰℡) 21:56:59

太客气了

( 农民 - Javen) 21:57:36

我是认为非常成功: 因为给大家提供了一个新的思路! 说实话,我刚开始认为 DAO 好像没有太多的内容, 世杰给我了惊喜

(dfdfswsw) 21:57:38

其实我想应该不只用到hibentate上面

包括其他的都可以自己去实现这个接口

就是用一个Serivce得到一个OjbectManager

然后就直接对一个ojbect (bean)操作


(郁也风) 21:58:16

呵呵,我的思路一直在代码生成工具上徘徊:)

( 农民 - Javen) 21:58:31

spring 是针对每种 persistence 方案,都有 template ,如 jdbcTemplate hibernateTemplate

我们也可以研究一下这个方案与 spring 的异同

(char) 21:58:52

roller里面有个很灵活的实现

就是很rollerDAO层是可以随时转换hibernate或者castor jdo

( 农民 - Javen) 21:58:59

to : 郁也风   这个地方用代码生成,感觉还没有 这种方案来得简单。  

(char) 21:59:19

这个正是世杰所说的动态代理的巧妙和灵活的地方..

(郁也风) 21:59:19

是啊:)

( 农民 - Javen) 21:59:38

char: 我也研究了。  但感觉他的那个 condition 比较复杂,有点晕。  就是 query 功能

(char) 21:59:45

这个是什么意思?

( 农民 - Javen) 21:58:59

to : 郁也风   这个地方用代码生成,感觉还没

(dfdfswsw) 22:00:19

我用了

ibatis这个之后一般应用都用它了。


还是哪位推荐的。谢谢哈

( 农民 - Javen) 22:00:22

to : 郁也风   这个地方用代码生成,感觉还没有 这种方案来得简单。 

这个动态代理的方案

(郁也风) 22:00:44

我感觉ibatis还是比较合适在公司引用的:)

(char) 22:00:48

代码生成,用什么代码生成?

( 农民 - Javen) 22:00:52

dfdf 说一直在用 ibatis ? 

(dfdfswsw) 22:00:58

不是一直

( 农民 - Javen) 22:01:20

郁也风说: 用代码生成 DAO   生成器当然是想自己写

(dfdfswsw) 22:01:31

以前用 HIBERNATE


后来加了这个群才开始用ibatis

( 农民 - Javen) 22:01:51

你的感觉: 他们的优劣在哪里?

( 农民 - Javen) 22:01:58

因为你都有实际应用经验了

(dfdfswsw) 22:02:04

cnnic项目里面我仿照webwork做了一个小mvc框架

(char) 22:02:12

哦,这个很容易吧,用xdoclet写个模板,可以把所有的页面,包括struts, dao,jsp全部生成...

(dfdfswsw) 22:02:45

正确的描述ibatis 不是一个O/R MAP


只是一个SQL<->XML MAP

( 农民 - Javen) 22:02:48

char: 你写出来吗?我到是有兴趣看看。 哈哈

(char) 22:03:18

生成jsp那个代码appfuse上面有。

(char) 22:03:28

改几下就可以生成别的了。

( 农民 - Javen) 22:03:33

dfdf 在做 cnnic 啊?  厉害

(dfdfswsw) 22:03:51

不是呀。。是CNNIC的域名系统。。


(自己公司用的。)误会了

( 农民 - Javen) 22:03:58

to char : 我真是没有太注意看。  

(char) 22:03:59

简单点不用xdoclet可以用velocity.

(dfdfswsw) 22:04:06

velocity 好用

(dfdfswsw) 22:04:32

我自己的小框架+velocity+ibatis

(char) 22:04:56

我现在是用velocity做模板,

不过,还没有在生成类,jsp上面试过.

(郁也风) 22:05:16

我原本考虑velocity的:)

(dfdfswsw) 22:05:23

我不是生成jsp..直接用它生成输出

(郁也风) 22:05:56

可以通过velocity+sitemesh啊,方便很多的

(dfdfswsw) 22:06:33

自己设计一个bean 接口有一个boolean checkForm方法

然后自己设计一个ActionRouter(参考其他mvc

模式

然后也是一个Action接口


(char) 22:07:14

???

(char) 22:07:25

郁也风已经用过sitemesh啦?

(dfdfswsw) 22:07:57

sitemesh 我用得不太熟悉只跑了一个example.


( 农民 - Javen) 22:08:07

to : 郁也风   这个地方用代码生成,感觉还没有 这种方案来得简单。   有兴趣看看怎么样用的。 

(郁也风) 22:08:21

我也只是看了个demo而已,不过感觉比tile舒服了:)

( 农民 - Javen) 22:08:24

晕,我发错了。  

(郁也风) 22:09:06

不过tile我也没用:)我们公司有一套模板解决方案了,呵呵,直接套用而已,不需要这些东西了

(dfdfswsw) 22:09:09

我感觉sitemesh 还不如一套完善的MVC


然后V采用velocity

(char) 22:09:10

对了,也风,xloadtree的大bug,是什么意思?

( 农民 - Javen) 22:09:36

velocity 与 sitemesh 好像比较类似的哦, 都是模板输出 view 吧? 

(郁也风) 22:09:44

sitemesh好像不是个mvc的解决方案啊,它只是对include的增强而已

(dfdfswsw) 22:09:48

然后自己定义一套见到的模板变量。

(char) 22:10:03

sitemeshtiles的替代品

(dfdfswsw) 22:10:05

恩。sitemesh不是View

(郁也风) 22:10:14

xloadtree:其实不是它的bug,是我没有看仔细源码而已

(郁也风) 22:10:50

sitemesh最吸引我的一点就是它不会把页面搞的支离破碎

(char) 22:11:03

有没有试过用xloadtree显示文件系统

(郁也风) 22:11:35

呵呵,当初我的机器上曾经跑过我自己写的一个demo,用来给另一个群的朋友作演示:)

(郁也风) 22:11:47

就是用来显示的文件系统

(char) 22:11:48

发给我

(郁也风) 22:12:04

老大,很久之前的东西了,早没了

(dfdfswsw) 22:12:13

比如公司的新闻系统模块


NewsAction里面就有list,find,create,update


等方法,使用一个javabean 传出1个或几个给

velocity显示

(朱世杰℡) 22:16:46

不懂那么多,我用STRUTS,功能好象够了。

转载自: http://www.matrix.org.cn

<script src="../article_review.asp?id=1023"></script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值