您的位置:首页 > 编程语言 > Java开发

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

2004-10-10 12:40 417 查看
( 农民 - 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
这样比直接用HIBERNATE的NAMDE 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
不是的,PO是USER,刚才贴的是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,都要自己来写一个个的ADD,UPDATE,DEL,FIND等等
( 农民 - 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
然后执行ADDCOMMAND的EXECUTE方法
(朱世杰℡) 20:56:29
EXECUTE里传的还有你的UserMgr的USER
( 农民 - 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
就是直接使用HIBERNATE的NAMED 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?
就象STRUTS的XX.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
其实是一个概念,好的框架都是基于相同的原则来设计,因为会很有多地方相同,
就像hibentate和jdo,struts和webwork一样,
因为都是基于比较好的设计原则,才会让人容易接受.
( 农民 - 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里面有个很灵活的实现
就是很roller的DAO层是可以随时转换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
sitemesh是tiles的替代品
(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: