??xml version="1.0" encoding="utf-8" standalone="yes"?> Oracle 版本Q?span class="topstoryhead">Oracle Database 10g Release 2 (10.2.0.1) 下蝲地址Q?/p>
http://www.oracle.com/technology/software/products/database/oracle10g/htdocs/10201winsoft.html 安装讄Q?/p>
1Q这里的全局数据库名即ؓ你创建的数据库名Q以后在讉K数据Q创?#8220;本地Net服务?#8221;时用刎ͼ 2Q数据库口o在登录和创徏“本地Net服务?#8221;{地方会用到?br />
1Q通过【程序?》【Oracle - OraDb10g_home1?》【配|和UL工具?》【Net Configuration Assistant】,q行“|络配置助手”工具Q?/p>
2Q选择“本地 Net 服务名配|?#8221;Q?/p>
3Q这里的“Net 服务?#8221;我们输入安装数据库时?#8220;全局数据库名”Q?/p>
4Q主机名我们输入本机的IP地址Q?/p>
5Q测试数据库q接Q用户名/密码为:System/数据库口令(安装时输入的“数据库口?#8221;Q: 更改dQ输入正的用户?密码Q?/p>
试成功Q?/p>
输入正确的用户名/口oQ?/p>
成功登陆Q?/p>
打开sqlplus工具Q?br />
q行“P/L SQL Developer”工具Q以DBAQ用户名QSystemQ的w䆾dQ?/p>
输入新用L“用户?口o”Q?/p>
新用?#8220;testcamds”成功登陆Q?/p>
先运行cmd命oQ进入命令行模式Q{C面的目录QD:\oracle\product\10.2.0\db_1\BIN【该目录下有exp.exe文g?/p>
命o语法Q?br />
命o语法Q?br />
导入l果Q?/p>
下面pl说明TIMESTAMP列类?/strong> 1、虽然你时定义了列TIMESTAMP(8)Q但在你q行数据插入与更新时TIMESTAMP列实际上保存?4位的数据Q包括年月日时分U)Q只不过在你q行查询时MySQLq回l你的是8位的q月日数据。如果你使用ALTER TABLE拓宽一个狭H的TIMESTAMP列,以前?#8220;隐蔽”的信息将被显C? +----+----------------+ +----+----------------+ 自动更新W一个TIMESTAMP列在下列M条g下发生: +----+----------------+----------------+ +----+----------------+----------------+ +----+----------------+----------------+ +----+---------------------+---------------------+ +----+-------------+-------------+ DATETIMEcd用在你需要同时包含日期和旉信息的值时。MySQL索ƈ且以'YYYY-MM-DD HH:MM:SS'格式昄DATETIME|支持的范围是'1000-01-01 00:00:00'?9999-12-31 23:59:59'。(“支持”意味着管更早的值可能工作,但不能保证他们可以。) DATEcd用在你仅需要日期值时Q没有时间部分。MySQL索ƈ且以'YYYY-MM-DD'格式昄DATE|支持的范围是'1000-01-01'?9999-12-31'?/p>
TIMESTAMP列类型提供一U类型,你可以用它自动地用当前的日期和旉标记INSERT或UPDATE的操作。如果你有多个TIMESTAMP列,只有W一个自动更新?/p>
自动更新W一个TIMESTAMP列在下列M条g下发生: 列没有明地在一个INSERT或LOAD DATA INFILE语句中指定?/p>
列没有明地在一个UPDATE语句中指定且一些另外的列改变倹{(注意一个UPDATE讄一个列为它已经有的|q将不引起TIMESTAMP列被更新Q因为如果你讄一个列为它当前的|MySQLZ效率而忽略更攏V) 你明地讑֮TIMESTAMP列ؓNULL. 除第一个以外的TIMESTAMP列也可以讄到当前的日期和时_只要列设ؓNULLQ或NOW()?/p>
通过明确地设|希望的|你可以设|Q何TIMESTAMP列ؓ不同于当前日期和旉的|即对第一个TIMESTAMP列也是这栗例如,如果Q当你创Z个行Ӟ你想要一个TIMESTAMP被设|到当前的日期和旉Q但在以后无Z时行被更新时都不改变Q你可以使用q个属性: 让MySQL在行被创建时讄列,q将初始化它为当前的日期和时间?/p>
当你执行随后的对该行中其他列的更ҎQ明设定TIMESTAMP列ؓ它的当前倹{?/p>
另一斚wQ你可能发现Q当行被创徏q且q离随后的更ҎQ很Ҏ用一个你用NOW()初始化的DATETIME列?/p>
TIMESTAMP值可以从1970的某时的开始一直到2037q__ֺZU,其g为数字显C?/p>
在MySQL索ƈ且显CTIMESTAMP值取决于昄寸的格式如下表?#8220;完整”TIMESTAMP格式?4位,但是TIMESTAMP列可以用更短的显C尺寸创造: 列类型 昄格式 所有的TIMESTAMP列都有同L存储大小Q不考虑昄寸。最常见的显C尺寸是6??2、和14。你可以在表创徏旉指定一个Q意的昄寸Q但是?或比14大被强制?4。在??3范围的奇数值尺寸被强制Z一个更大的偶数?/p>
使用一个常用的格式集的M一个,你可以指定DATETIME、DATE和TIMESTAMP| 'YYYY-MM-DD HH:MM:SS'?YY-MM-DD HH:MM:SS'格式的一个字W串。允怸U?#8220;宽松”的语?-M标点可用作在日期部分和时间部分之间的分隔W。例如,'98-12-31 11:30:45'?98.12.31 11+30+45'?98/12/31 11*30*45'?98@12@31 11^30^45'是等L?/p>
'YYYY-MM-DD'?YY-MM-DD'格式的一个字W串。允怸U?#8220;宽松”的语法。例如,'98-12-31', '98.12.31', '98/12/31'?98@12@31'是等L?/p>
'YYYYMMDDHHMMSS'?YYMMDDHHMMSS'格式的没有Q何分隔符的一个字W串Q例如,'19970523091528'?970523091528'被解释ؓ'1997-05-23 09:15:28'Q但?971122459015'是不合法?它有毫无意义的分钟部?且变?0000-00-00 00:00:00'?/p>
'YYYYMMDD'?YYMMDD'格式的没有Q何分隔符的一个字W串Q如果字W串认ؓ是一个日期。例如,'19970523'?970523'被解释作?1997-05-23'Q但?971332'是不合法? 它有无意义的月和天部?且变?0000-00-00'?/p>
YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的一个数字,如果数字认ؓ是一个日期。例如,19830905132800?30905132800被解释作?1983-09-05 13:28:00'?/p>
YYYYMMDD或YYMMDD格式的一个数字,如果数字认ؓ是一个日期。例如,19830905?30905被解释作?1983-09-05'?/p>
一个返回值可以在一个DATETIME, DATE或TIMESTAMP上下文环境中接受的函敎ͼ例如NOW()或CURRENT_DATE?/p>
不合法DATETIME, DATE或TIMESTAMPD变换到适当cd?#8220;?#8221;?'0000-00-00 00:00:00', '0000-00-00'?0000000000000)?/p>
对于包括的日期部分分隔符的指定ؓ字符串的|不必要ؓ于10的月或天的值指?位数字,'1979-6-9'?1979-06-09'是一L。同? 对于包括的时间部分分隔符的指定ؓ字符串的|不必为小?0的小时、月或秒指定2位数字,'1979-10-30 1:2:3'?1979-10-30 01:02:03'是一L?/p>
指定为数字应该是6??2?4位长。如果数字是8?4位长Q它被假定以YYYYMMDD或YYYYMMDDHHMMSS格式q且q䆾由头4位数字给出。如果数字是6?2位长Q它被假定是以YYMMDD或YYMMDDHHMMSS格式且年份由?位数字给出。不是这些长度之一的数字通过填补前头的零到最接近的长度来解释?/p>
指定为无分隔W的字符串用它们l定的长度来解释。如果字W串长度??4个字W,q䆾被假定头4个字W给出,否则q䆾被假定由?个字W给出。对于字W串中呈现的多个部分Q字W串从左到右边被解释Q以扑ևq、月、日、小时、分钟和U|q意味着Q你不应该用少?6 个字W的字符丌Ӏ例如,如果你指?9903'Q认为将代表1999q?月,你会发现MySQL把一?#8220;?#8221;日期插入C的表中,q是因ؓq䆾和月份?9?3Q但是日期部分丢??Q因此该g是一个合法的日期?/p>
TIMESTAMP列用被指定的值的完整_ֺ的存储合法的|不考虑昄大小。这有几个含意: L指定q_月,和日Q即使你的列cd是TIMESTAMP(4)或TIMESTAMP(2)。否则,值将不是一个合法的日期q且0被存储?/p>
如果你用ALTER TABLE拓宽一个狭H的TIMESTAMP列,以前?#8220;隐蔽”的信息将被显C?/p>
同样Q羃一个TIMESTAMP列不会导致信息失去,除了感觉上值在昄Ӟ较少的信息被昄出?/p>
管TIMESTAMPD存储为完整精度,直接操作存储值的唯一函数是UNIX_TIMESTAMP()Q其他函数操作在格式化了的检索的gQ这意味着你不能用函C如HOUR()或SECOND()Q除非TIMESTAMP值的相关部分被包含在格式化的g。例如,一个TIMESTAMP列的HH部分部被昄Q除非显C大至是10Q因此在更短的TIMESTAMPg试试使用HOUR()产生一个无意义的结果?/p>
在某U程度上Q你可以把一U日期类型的Dl一个不同的日期cd的对象。然而,q可能值有一些改变或信息的损失: 如果你将一个DATEDl一个DATETIME或TIMESTAMP对象Q结果值的旉部分被设|ؓ'00:00:00'Q因为DATEg包含旉信息?/p>
如果你将一个DATETIME或TIMESTAMPDl一个DATE对象Q结果值的旉部分被删除,因ؓDATEcd不存储时间信息?/p>
CQ尽DATETIME, DATE和TIMESTAMP值全都可以用同样的格式集来指定,但所有类型不都有同样的D围。例如,TIMESTAMPg能比1970早或?037|晚Q这意味着Q一个日期例?1968-01-01'Q当作ؓ一个DATETIME或DATE值合法时Q它不是一个正TIMESTAMP|q且 如果赋值给q样一个对象,它将被变换到0?/p>
当指定日期值时Q当心某些缺P 允许作ؓ字符串指定值的宽松格式能被ƺ骗。例如,g?10:11:12'可能看v来像旉|因ؓ“:”分隔W,但是如果在一个日期中使用Q上下文作为年份被解释?2010-11-12'。?10:45:15'被变换?0000-00-00'Q因?45'不是一个合法的月䆾?/p>
?位数字指定的q值是模糊的,因ؓ世纪是未知的。MySQL使用下列规则解释2位年| ?0-69范围的年D变换?000-2069?/p>
?0-99范围的年D变换?970-1999?br />
本篇文章来源于:开发学?http://edu.codepub.com 原文链接Qhttp://edu.codepub.com/2009/1121/17945.php setMaxResultQ)讄q回的信息条敎ͼsetFirstResultQ)讄查询l果的初始位|,上面的程序段可以实现分页?/p>
在hibernate的Session里面使用createCriteria可以创徏一个Criteria实例帮助我们q行条g查询Q不用自׃hql语句Q很方便?br />
用法很简单,首先传Class实例创徏CriteriaQClass实例对应你想要查询的那个实体:2、创?#8220;本地Net服务?#8221;
默认的用户名/密码错误Q?
3、PLSQL Developer q接试
4、创I间
Sql代码 sqlplus /nolog
q接数据库:
Sql代码 conn /as sysdba
创徏表空_
Sql代码 create tablespace camds datafile 'D:\oracle\product\10.2.0\oradata\camds\camds.dbf' size 200m autoextend on next 10m maxsize unlimited;
5、创建新用户1Q新?#8220;UserQ用PQ?/strong>
2Q设|用户名、口令、默认表I间Q用上面新建的表空_和时表I间Q?/strong>
3Q设|角色权限:
4Q设|?#8221;pȝ权限“Q?/span>
5Q点d用后Q【应用】按钮变灎ͼ新用户创建成功:
6Q新用户d试Q?/span>
6、导入导出数据库
1Q导?/span>
Sql代码 imp userid/pwd@sid file=path/file fromuser=testcamds touser=userid
命o实例Q?br />
Sql代码 imp testcamds/123@camds file=c:\testcamds fromuser=testcamds touser=testcamds
导入l果Q?/p>
2Q导出:
Sql代码 exp userid/pwd@sid file=path/file owner=userid
命o实例Q?
]]>
你可以用TIMESTAMP列类?
TIMESTAMP列类?
TIMESTAMP值可以从1970的某时的开始一直到2037q__ֺZU,其g为数字显C?
TIMESTAMP值显C尺寸的格式如下表所C:
Q?
+---------------+----------------+
| 列类型 | 昄格式 |
| TIMESTAMP(14) | YYYYMMDDHHMMSS |
| TIMESTAMP(12) | YYMMDDHHMMSS |
| TIMESTAMP(10) | YYMMDDHHMM |
| TIMESTAMP(8) | YYYYMMDD |
| TIMESTAMP(6) | YYMMDD |
| TIMESTAMP(4) | YYMM |
| TIMESTAMP(2) | YY |
+---------------+----------------+
“完整”TIMESTAMP格式?4位,但TIMESTAMP列也可以用更短的昄寸创?
最常见的显C尺寸是6??2、和14?
你可以在创徏表时指定一个Q意的昄寸Q但是定义列长ؓ0或比14大均会被强制定义为列?4?
列长在从1?3范围的奇数值尺寸均被强制ؓ下一个更大的偶数?
列如Q?
定义字段长度 强制字段长度
TIMESTAMP(0) -> TIMESTAMP(14)
TIMESTAMP(15)-> TIMESTAMP(14)
TIMESTAMP(1) -> TIMESTAMP(2)
TIMESTAMP(5) -> TIMESTAMP(6)
所有的TIMESTAMP列都有同L存储大小Q?
使用被指定的时期旉值的完整_ֺQ?4位)存储合法的g考虑昄寸?
不合法的日期Q将会被强制?存储
q有几个含意Q?/strong>
2、同P~小一个TIMESTAMP列不会导致信息失去,除了感觉上值在昄Ӟ较少的信息被昄出?
3、尽TIMESTAMPD存储为完整精度,直接操作存储值的唯一函数是UNIX_TIMESTAMP()Q由于MySQLq回TIMESTAMP列的列值是q过格式化后的检索的|q意味着你可能不能用某些函数来操作TIMESTAMP列(例如HOUR()或SECOND()Q,除非 TIMESTAMP值的相关部分被包含在格式化的g。例如,一个TIMESTAMP列只有被定义为TIMESTAMP(10)以上Ӟ TIMESTAMP列的HH部分才会被显C,因此在更短的TIMESTAMPg使用HOUR()会生一个不可预知的l果?
4、不合法TIMESTAMPD变换到适当cd?#8220;?#8221;?00000000000000)。(DATETIME,DATE亦然Q
你可以用下列语句来验证Q?
INSERT INTO test SET id = 1;
SELECT * FROM test;
| id | date1 |
+----+----------------+
| 1 | 20021114 |
+----+----------------+
SELECT * FROM test;
| id | date1 |
+----+----------------+
| 1 | 20021114093723 |
+----+----------------+
你可以用TIMESTAMP列类型自动地用当前的日期和时间标记INSERT或UPDATE的操作?
如果你有多个TIMESTAMP列,只有W一个自动更新?/p>
1、列值没有明地在一个INSERT或LOAD DATA INFILE语句中指定?
2、列值没有明地在一个UPDATE语句中指定且另外一些的列改变倹{(注意一个UPDATE讄一个列为它已经有的|q将不引起TIMESTAMP列被更新Q因为如果你讄一个列为它当前的|MySQLZ效率而忽略更攏V)
3、你明确地设定TIMESTAMP列ؓNULL.
4、除W一个以外的TIMESTAMP列也可以讄到当前的日期和时_只要列设ؓNULLQ或NOW()?
'id' INT (3) UNSIGNED AUTO_INCREMENT,
'date1' TIMESTAMP (14),
'date2' TIMESTAMP (14),
PRIMARY KEY('id')
);
INSERT INTO test (id, date1, date2) VALUES (1, NULL, NULL);
INSERT INTO test SET id= 2;
| id | date1 | date2 |
+----+----------------+----------------+
| 1 | 20021114093723 | 20021114093723 |
| 2 | 20021114093724 | 00000000000000 |
+----+----------------+----------------+
->W一条指令因设date1、date2为NULL,所以date1、date2值均为当前时?
W二条指令因没有设date1、date2列|W一个TIMESTAMP列date1为更Cؓ当前旉Q?而二个TIMESTAMP列date2因日期不合法而变?#8220;00000000000000”
| id | date1 | date2 |
+----+----------------+----------------+
| 3 | 20021114094009 | 20021114093723 |
| 2 | 20021114093724 | 00000000000000 |
+----+----------------+----------------+
->q条指o没有明确地设定date2的列|所以第一个TIMESTAMP列date1被更新为当前时?
| id | date1 | date2 |
+----+----------------+----------------+
| 1 | 20021114094009 | 20021114094320 |
| 2 | 20021114093724 | 00000000000000 |
+----+----------------+----------------+
->q条指o因设定date1=date1Q所以在更新数据时date1列值ƈ不会发生改变
而因讑֮date2=NOW()Q所以在更新数据时date2列g被更Cؓ当前旉
此指令等效ؓ update test SET id= 1,date1=date1,date2=NULL WHERE id=3;
因MySQLq回?TIMESTAMP 列ؓ数字昄形式Q?
你可以用DATE_FROMAT()函数来格式化 TIMESTAMP ?
DATE_FORMAT(date2,'%Y-%m-%d %H:%i:%s') As date2 FROM test;
| id | date1 | date2 |
+----+---------------------+---------------------+
| 1 | 2002-11-14 09:40:09 | 2002-11-14 09:43:20 |
| 2 | 2002-11-14 09:37:24 | 0000-00-00 00:00:00 |
+----+---------------------+---------------------+
DATE_FORMAT(date2,'%Y-%m-%d') As date2 FROM test;
| id | date1 | date2 |
+----+-------------+-------------+
| 1 | 2002-11-14 | 2002-11-14 |
| 2 | 2002-11-14 | 0000-00-00 |
+----+-------------+-------------+
在某U程度上Q你可以把一U日期类型的Dl一个不同的日期cd的对象?
然而,而尤其注意的是:值有可能发生一些改变或信息的损失:
1、如果你一个DATEDl一个DATETIME或TIMESTAMP对象Q结果值的旉部分被设|ؓ'00:00:00'Q因为DATEg不包含有旉信息。
2、如果你一个DATETIME或TIMESTAMPDl一个DATE对象Q结果值的旉部分被删除,因ؓDATEcd不存储时间信息?
3、尽DATETIME, DATE和TIMESTAMP值全都可以用同样的格式集来指定,
但所有类型不都有同样的D围?
例如QTIMESTAMPg能比1970早,也不能比2037晚,
q意味着Q一个日期例?1968-01-01'Q当作ؓ一个DATETIME或DATE值时它是合法的,
但它不是一个正TIMESTAMP|q且如果这L一个对象赋值给TIMESTAMP列,它将被变换ؓ0?
当指定日期值时Q当心某些缺P
1、允怽为字W串指定值的宽松格式能被ƺ骗。例如,Q因?#8220;:”分隔W的使用Q?10:11:12'可能看v来像旉|但是如果在一个日期中使用Q上下文作为年份被解释?2010-11-12'。?10:45:15'被变换?0000-00-00'Q因?45'不是一个合法的月䆾?
2、以2位数字指定的q值是模糊的,因ؓ世纪是未知的。MySQL使用下列规则解释2位年| ?0-69范围的年D变换?000-2069?在范?0-99的年D变换?970-1999?/p>
TIMESTAMP(14) YYYYMMDDHHMMSS
TIMESTAMP(12) YYMMDDHHMMSS
TIMESTAMP(10) YYMMDDHHMM
TIMESTAMP(8) YYYYMMDD
TIMESTAMP(6) YYMMDD
TIMESTAMP(4) YYMM
TIMESTAMP(2) YY
]]>
问题原因Q?br />
1Qjs代码用了javas
4.上传囄时提C:Object doesn't support this property or method
原因Q服务器上安装的AspJpeg的版本低?.4版?br />
解决ҎQ安?.4或以上版本的AspJpeglg?
]]>
如果我们要查询User的所有信息我们可以如下用CriteriaQ?/p>
List users = crit.list();
for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {
User user = (User) iterator.next();
System.out.println("name: " + user.getName());
System.out.println("age: " + user.getAge());
}
我们要ؓ查询限定条gQ可以通过net.sf.hibernate.expression.Expression讄Expression有很多的条g查询Ҏ下面举一些例子:
crit.add(Expression.ge("age", new Integer(25)));
List users = crit.list();
geQ)表示大于{于Q即age大于{于25的user?/p>
crit.add(Expression.between("weight", new Integer(60)Q?/span>new Integer(80)));
List users = crit.list();
between表示weight?0?0之间?br />
crit.add(Expression.or(
Expression.eq("age", new Integer(20)),
Expression.isNull("age")
));
List users = crit.list();
eq表示age?0的user?br />
crit.setFirstResult(51);
crit.setMaxResult(50);
List users = crit.list();
然后调用Criteria的addҎ加入条gQRestrictionsQ。常用的条g有:
Ҏ说明Q?Restrictions.eq {于
Restrictions.allEq 使用MapQ用key/valueq行多个{于的对?br />
Restrictions.gt 大于 >
Restrictions.ge 大于{于 >=
Restrictions.lt 于 <
Restrictions.le 于{于 <=
Restrictions.between 对应SQL的BETWEEN子句
Restrictions.like 对应SQL的LIKE子句
Restrictions.in 对应SQL的in子句
Restrictions.and and关系
Restrictions.or or关系
Restrictions.sqlRestriction SQL限定查詢
例如Q我惌回Person实体里面q龄(age)大于20的记录,那么׃ؓCriteria加入Restrictions.gt条gQ?br />
Restrictions.and和Restrictions.or很有用,表示and查询q是or查询Q例如我要查询Person实体里面q龄(age)大于20Q或者性别 (sex)为man
的记录,那么׃ؓCriteria加入:
Restrictions.gt(“age”,new Integer(20)),
Restrictions.eq(“sex”,”man”)
)).list();
如果需要关联查询的话,可以使用Criteria的createCriteriaҎ创徏一个CriteriaQ例如部?Department)和h?Person)是一对多的关p,我要查询Person实体里面q龄(age)大于20Q性别 (sex)为manQ?br />
备注包含应届生,
且所在部?department)是开发部的记?
.add(Restrictions.eq(“sex”,”man”))
.add(Restrictions.like(“Memo”,”%应届?/span>%”))
.createCriteria(“department”)
.add(Restrictions.eq(“departmentname”,”开发部”))
.list();
其他条g的用法也很简单,׃列D了?br />
另外QHibernate3Z一个org.hibernate.criterion.DetachedCriteriaQ即ȝCriteriaQ它允许你可以先创徏DetachedCriteriaQ然后传到Session里面才真正返回一个CriteriaQ用法如下:
DetachedCriteria detchedCriteria = DetachedCriteria.forClass(Person.class); // 先徏立DetchedCriteria物g
detchedCriteria.add(Restrictions.ge("age",new Integer(25))); // 加入查询条g
Session session = sessionFactory.openSession();
Criteria criteria = detchedCriteria.getExecutableCriteria(session); // l定Session並返回一个Criteria实例List list = criteria.list();
最后,需要注意,Criteriaq提供了setFirstResult和setMaxResultsҎq行分页查询?br />
]]>
从一个最基本的对象关pL像自动化E序Q了解Hibernatel成的基本元素,q进一步了解Hibernate的基语义、配|等概念?/p>
1QO/R映像入门W一个HibernateE序很简单,一个对象映像至一个数据表
1Q?配置Hibernate
Hibernate是ORM的解x案,其底层对数据库的操作依赖于JDBCQ所以您必须先取得JDBC驱动E序Q在q边所使用的是MySQLQ所以您必须至MySQL®Connector/J取得MySQL的JDBC驱动E序?/p>
接下来至Hibernate官方|站取得hibernate 3.0?/p>
解开zip档案后,当中的hibernate3.jar是必要的Q而在lib目录中还包括了许多jar档案Q您可以在Hibernate 3.0官方的参考手册上扑ֈq些jar的相兌明,其中必要的是antlr、dom4j、CGLIB、asm、Commons Collections、Commons Logging?EHCacheQHibernate底层q需要Java Transaction APIQ所以您q需要jta.jarQ到q边为止Qd需要以下的jar档案Q?/p>
Hibernate可以q行于单Z上,也可以运行于Web应用E序之中Q如果是q行于单机,则将所有用到的jar档案Q包括JDBC驱动E序Q设定至CLASSPATH中,如果是运行于Web应用E序中,则将jar档案|放于WEB-INF/lib中?/p>
如果您还需要额外的LibraryQ再依需求加入,例如JUnit、Proxool{等Q接下来可以etc目录下的log4j.properties复制至Hibernate目的Classpath下,q修改一下当中的log4j.logger.org.hibernate为errorQ也是只在错误发生时显C必要的讯息?/p>
接着讄基本的Hibernate配置文gQ可以用XML或Properties档案Q这边先使用XMLQ档名预设ؓhibernate.cfg.xmlQ?/p>
hibernate.cfg.xml
配置文g中已l加上批注ؓ每一个项目作了说明,其中对象与数据库表格映像文gq有待加入?/p>
1Q?W一个Hibernate
q边以一个简单的单机E序来示范Hibernate的配|与功能Q首先作数据库的准备工作Q在MySQL中新增一个demo数据库,q徏立user表格Q?/p>
CreateUser2MySQL.sql
|
对于q个表格Q您有一个Usercd与之对应Q表g的每一个字D将对应至User实例上的Field成员?/p>
User.java
|
其中id是个Ҏ的属性,Hibernate会用它来作Z键识别,您可以定义主键生的方式Q这是在XML映像文g中完成,Z告诉Hibernate您所定义的User实例如何映像x据库表格Q您撰写一个XML映射文g档名是User.hbm.xmlQ如下所C:
User.hbm.xml
<class>h的name属性ؓ所映像的对象,而table为所映像的表|<id>中column属性指定了表格字段Q而type属性指定了User实例的中的id之型态,q边type中所讑֮的是直接指定Java中的对象型态,Hibernate也定义有自己的映像型态,作ؓJava对象与SQL型态的标准对应型态(因ؓ语言所提供的类型ƈ不一定与数据库的cd对应Q,q之后会再说明?/p>
#p#
<id>中主键的产生方式在这边设定ؓ"native"Q表CZ键的生成方式由HibernateҎ数据库Dialect的定义来军_Q之后还会介l其它主键的生成方式?/p>
同样的,<property>标签中的column与type都各自指明了表格中字D与对象中属性的对应?/p>
接着必须在Hibernate配置文ghibernate.cfg.xml中指明映像文件的位置Q如下加入映像文件位|:
hibernate.cfg.xml
接下来撰写一个测试的E序Q这个程序直接以Java E序设计人员熟悉的语法方式来操作对象Q而实际上也直接完成对数据库的操作Q程序将会将一W数据存入表g中:
FirstHibernate.java
|
如您所看到的,E序中只需要直接操作User 对象Qƈq行Session 与Transaction 的相x作,Hibernate ׃自动完成Ҏ据库的操作,您看不到M一行JDBC 或SQL 的陈qͼ撰写好以上的各个档案之后Q各档案的放|位|如下:
接着可以开始运行程序,l果如下Q?/p>
FirstHibernate执行l果
|
新增资料OK!请先用MySQL 观看l果Q?/p>
执行l果中显CZHibernate 所实际使用的SQLQ由于这个程序还没有查询功能Q所以要
q入MySQL 中看看新增的数据Q如下:
MySQL 中查询结?/strong>
|
Comments
W四D代码的标题应该是hibernate.cfg.xml
1Q? W二?Hibernate
?W一?Hibernate 中介l如何用Hibernate 在不使用SQL 的情况下Q以Java 中操作对象的习惯来插入数据至数据库中Q当然储存数据之后,更重要的是如何将资料dQHibernate 中也可以让您不写一句SQLQ而以Java 中操作对象的习惯来查询数据?/p>
直接来看个范例:
SecondHibernate.java
|
#p#
Criteria 对SQL q行装Q对于不甚了解SQL 的开发h员来_使用Criteria 也可以轻易的q行各种数据的检索,您也可以使用 Expression 讑֮查询条gQƈ之加入Criteria中对查询l果作限ӞExpression.eq()表示讑֮W合条g的查询,例如Expression.eq("name", "caterpillar")表示讑֮查询条g?name"字段中ؓ"caterpillar"的数据?/p>
先来看一下执行结果:
SecondHibernate 执行l果
|
Criteria 是对象导向式的查询方式,让不了解SQL 的开发h员也可以Lq行各项查询Q但Criteria 的API 目前q不是很完善Q而Hibernate 鼓励的查询方式,是透过HQLQHibernate Query LanguageQ来q行Q直接来看个实例Q?/p>
SecondHibernateUsingHQ.java
|
执行l果Q?/p>
SecondHibernateUsingHQ 执行l果
|
透过Query 接口Q您可以先设定查询参敎ͼ之后透过setXXX(){方法,指定的参数值填入,而不用每ơ都撰写完整的HQLQQuery 的setParameter()ҎW一个参数是指定?出现的位|,?0 开始,W二个参数则是设定查询条件?
#p#
二、简单的Hibernate E序
q边以一个简单的单机E序来示范Hibernate的配|与功能Q在q个例子中的一些操作,实际上会使用一些自动化工具来完成,而不一定亲自手动操作设定,q边完全手动的原因,在于让您可以知道Hibernate实际上会作那些动作,在进行范例之前,请先定前一个主题中的相关jar档案都已l设定在CLASSPATH中?br />
我们先作数据库的准备工作Q在MySQL中新增一个HibernateTest数据库,q徏立USER表格Q?
|
我们先撰写一个纯Java对象Q它U綷表示一个数据集合,待会我们会将之映像至数据库的表格上,E序如下Q?
User.java
|
其中id是个Ҏ的属性,Hibernate会用它来作Z键识别,我们可以定义主键产生的方式,q是在XML映像文g中完成,Z告诉Hibernate对象如何映像x据库表格Q我们撰写一个XML映射文g档名是User.hbm.xmlQ如下所C:
User.hbm.xml
q个XML文g定义了对象属性映像至数据库表格的关系Q您可以很简单的了解Ҏ的方法,像是User对象对应至USER表格Q其中我们?uuid.hex来定义主键的产生法QUUID法使用IP地址、JVM的启动时间、系l时间和一个计数值来产生主键。除了用uuid.hex之外Q我们还可以使用其它的方式来产生主键Q像是increment{,q可以在Hibernate参考手册中扑ֈ相关资料?/p>
<property>h用于定义Java对象的属性,而当中的<column/>h用于定义与数据库的对应,如果您是手工建立Java对象与数据库表格Q则在最单的情况下,可以只定?lt;property name="sex"/>q样的方式,而由Hibernate自动判断Java对象属性与数据库表格名U对应关p,?lt; property/>?lt;column/>标签上的额外讑֮Q像是not null、sql-type{)Q则可以用于自动产生Java对象与数据库表格的工具上?/p>
接下来我们定义Hibernate配置文gQ主要是q行SessionFactory配置QHibernate可以使用XML或属性文件来q行配置Q我 们这边先介绍如何使用XML配置Q这也是Hibernate所的配|方式,我们的文件名是hibernate.cfg.xmlQ如下:
hibernate.cfg.xml
接下来我们撰写一个测试的E序Q这个程序将直接以JavaE序设计人员熟悉的语法方式来操作对象Q而实际上也直接完成对数据库的操作Q程序将会将一W数据存入表g中:
HibernateTest.java
|
#p#
Configuration代表了Java对象x据库的映像设定,q个讑֮是从我们上面的XML而来Q接下来我们从Configuration取得SessionFactory对象Qƈ由它来开启一个SessionQ它代表对象与表格的一ơ会话操作,?Transaction则表CZl会话操作,我们只需要直接操作User对象Qƈq行Session与Transaction的相x作, Hibernate׃自动完成Ҏ据库的操作。这边对E序先只作简单的介绍Q之后再详加说明?/p>
所有的.java档案~译Qƈ两个XML档案攄在与HibernateTest相同的目录中Q也是档案位置如下Q?
|
OK!现在您可以执行HibernateTestQ程序将会出C下的讯息Q?
|
新增资料OK!请先用MySQL观看l果Q?/p>
q边只先q行数据的存入,要观看数据存入的l果的话Q请q入MySQL观看Q以下是数据库存入的l果Q?
|
public class Remote { public String getData(int index) { ... }}
<script type="text/javascript" src="[WEBAPP]/dwr/interface/Remote.js"> </script><script type="text/javascript" src="[WEBAPP]/dwr/engine.js"> </script>...function handleGetData(str) { alert(str);}Remote.getData(42, handleGetData);
Remote.getData(42, function(str) { alert(str); });
Remote.getData(42, { callback:function(str) { alert(str); }});
Remote.getData(42, { callback:function(str) { alert(str); }, timeout:5000, errorHandler:function(message) { alert("Oops: " + message); }});
Remote.method({ timeout:3 }, { errorHandler:somefunc });
public class Remote { public void setPerson(Person p) { this.person = p; }}
public Person { private String name; private int age; private Date[] appointments; // getters and setters ...}
var p = { name:"Fred Bloggs", age:42, appointments:[ new Date(), new Date("1 Jan 2008") ]};Remote.setPerson(p);
CODE:
long now = System.currentTimeMillis();
String s = String.format("%tR", now); // "15:12"
CODE:
// Current month/day/year
Date d = new Date(now);
s = String.format("%tD", d); // "07/13/04"
CODE:
s = String.format("%,d", Integer.MAX_VALUE); // "2,147,483,647"
CODE:
s = String.format("%05d", 123); // "00123"
是不是很方便Q让人动心啊Q哈哈,q有更多的效?
其实format函数有些cMc语言中printf函数Q一些格式字W串?C cMQ但已进行了某些定制Q以适应 Java 语言Qƈ且利用了其中一些特性。此Ҏ提供了对布局寚w和排列的支持Q以及对数倹{字W串和日?旉数据的常规格式和特定于语a环境的输出的支持。支持诸?byte、BigDecimal ?Calendar {常?Java cd?br />
产生格式化输出的每个Ҏ都需要格式字W串 和参数列表。格式字W串是一?StringQ它可以包含固定文本以及一个或多个嵌入的格式说明符。请考虑以下CZQ?br />
Calendar c = ...;
String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);
格式字符串是 format Ҏ的第一个参数。它包含三个格式说明W?"%1$tm"?%1$te" ?"%1$tY"Q它们指出应该如何处理参C及在文本的什么地Ҏ入它们。格式字W串的其余部分是包括 "Dukes Birthday: " 和其他Q何空格或标点W号的固定文本?参数列表׃递给位于格式字符串之后的Ҏ的所有参数组成。在上述CZ中,参数列表的大ؓ 1Q由新对?Calendar l成?br />
1.常规cd、字W类型和数值类型的格式说明W的语法如下Q?/strong>%[argument_index$][flags][width][.precision]conversion
可选的 argument_index 是一个十q制整数Q用于表明参数在参数列表中的位置。第一个参数由 "1$" 引用Q第二个参数?"2$" 引用Q依此类推?br />
可选的 flags 是修改输出格式的字符集。有效标志的集合取决于{换类型?br />
可?width 是一个非负十q制整数Q表明要向输Z写入的最字W数?br />
可?precision 是一个非负十q制整数Q通常用来限制字符数。特定行为取决于转换cd?br />
所需?conversion 是一个表明应该如何格式化参数的字W。给定参数的有效转换集合取决于参数的数据cd?br />
2.用来表示日期和时间类型的格式说明W的语法如下:
%[argument_index$][flags][width]conversion
可选的 argument_index?em>flags ?width 的定义同上?br />
所需?conversion 是一个由两字W组成的序列。第一个字W是 't' ?'T'。第二个字符表明所使用的格式。这些字W类g但不完全{同于那些由 GNU date ?POSIX strftime(3c) 定义的字W?
3.与参C对应的格式说明符的语法如下:
%[flags][width]conversion
可?flags ?width 的定义同上?br />
所需?conversion 是一个表明要在输Z所插内容的字符?
转换
转换可分Z下几c:
1. 常规 - 可应用于M参数cd
2. 字符 - 可应用于表示 Unicode 字符的基本类型:char、Character、byte、Byte、short ?Short。当 Character.isValidCodePoint(int) q回 true Ӟ可将此{换应用于 int ?Integer cd
3. 数?br />
1. 整数 - 可应用于 Java 的整数类型:byte、Byte、short、Short、int、Integer、long、Long ?BigInteger
2. 点 - 可用?Java 的Q点类型:float、Float、double、Double ?BigDecimal
4. 日期/旉 - 可应用于 Java 的、能够对日期或时间进行编码的cdQlong、Long、Calendar ?Date?br />
5. 癑ֈ?- 产生字面?'%' ('\u0025')
6. 行分隔符 - 产生特定于^台的行分隔符
下表ȝ了受支持的{换。由大写字符Q如 'B'?H'?S'?C'?X'?E'?G'?A' ?'T'Q表C的转换与由相应的小写字W的转换{同Q根据流行的 Locale 规则结果{换ؓ大写形式除外。后者等同于 String.toUpperCase() 的以下调?
转换 | 参数cd | 说明 |
'b', 'B' | 常规 | 如果参数 arg ?nullQ则l果?"false"。如?arg 是一?boolean 值或 BooleanQ则l果?String.valueOf() q回的字W串。否则结果ؓ "true"?/td> |
'h', 'H' | 常规 | 如果参数 arg ?nullQ则l果?"null"。否则,l果?Integer.toHexString(arg.hashCode()) 得到的结果?/td> |
's', 'S' | 常规 | 如果参数 arg ?nullQ则l果?"null"。如?arg 实现 FormattableQ则调用 arg.formatTo。否则,l果?arg.toString() 得到的结果?/td> |
'c', 'C' | 字符 | l果是一?Unicode 字符 |
'd' | 整数 | l果被格式化为十q制整数 |
'o' | 整数 | l果被格式化为八q制整数 |
'x', 'X' | 整数 | l果被格式化为十六进制整?/td> |
'e', 'E' | 点 | l果被格式化为用计算机科学记数法表示的十q制?/td> |
'f' | 点 | l果被格式化为十q制?/td> |
'g', 'G' | 点 | Ҏ_ֺ和舍入运后的|使用计算机科学记数Ş式或十进制格式对l果q行格式化?/td> |
'a', 'A' | 点 | l果被格式化为带有效位数和指数的十六q制点?/td> |
't', 'T' | 日期/旉 | 日期和时间{换字W的前缀。请参阅日期/旉转换?/td> |
'%' | 癑ֈ? | l果为字面?'%' ('\u0025') |
'n' | 行分隔符 | l果为特定于q_的行分隔W?/td> |
'H' | 24 时制的时Q被格式化ؓ必要时带前导零的两位敎ͼ?00 - 23?/td> |
'I' | 12 时制的时Q被格式化ؓ必要时带前导零的两位敎ͼ?01 - 12?/td> |
'k' | 24 时制的时Q即 0 - 23?/td> |
'l' | 12 时制的时Q即 1 - 12?/td> |
'M' | 时中的分钟Q被格式化ؓ必要时带前导零的两位敎ͼ?00 - 59?/td> |
'S' | 分钟中的U,被格式化为必要时带前导零的两位数Q即 00 - 60 Q?60" 是支持闰U所需的一个特D|?/td> |
'L' | U中的毫U,被格式化为必要时带前导零的三位数Q即 000 - 999?/td> |
'N' | U中的毫微秒Q被格式化ؓ必要时带前导零的九位敎ͼ?000000000 - 999999999?/td> |
'p' | 特定于语a环境?上午或下?/a> 标记以小写Ş式表C,例如 "am" ?"pm"。用{换前~ 'T' 可以此输出转换为大写Ş式?/td> |
'z' | 相对?GMT ?RFC 822 格式的数字时区偏U量Q例?-0800?/td> |
'Z' | 表示时区~写形式的字W串。Formatter 的语a环境取代参数的语言环境Q如果有Q?/td> |
's' | 自协调世界时 (UTC) 1970 q?1 ?1 ?00:00:00 至现在所l过的秒敎ͼ?Long.MIN_VALUE/1000 ?Long.MAX_VALUE/1000 之间的差倹{?/td> |
'Q' | 自协调世界时 (UTC) 1970 q?1 ?1 ?00:00:00 至现在所l过的毫U数Q即 Long.MIN_VALUE ?Long.MAX_VALUE 之间的差倹{?/td> |
'B' | 特定于语a环境?a target="_blank">月䆾全称Q例?"January" ?"February"?/td> |
'b' | 特定于语a环境?a target="_blank">月䆾U?/a>Q例?"Jan" ?"Feb"?/td> |
'h' | ?'b' 相同?/td> |
'A' | 特定于语a环境?a target="_blank">星期?/a>全称Q例?"Sunday" ?"Monday" |
'a' | 特定于语a环境?a target="_blank">星期?/a>Uͼ例如 "Sun" ?"Mon" |
'C' | 除以 100 的四位数表示的年份,被格式化为必要时带前导零的两位数Q即 00 - 99 |
'Y' | q䆾Q被格式化ؓ必要时带前导零的四位敎ͼ臛_Q,例如Q?092 {于格里高利历的 92 CE?/td> |
'y' | q䆾的最后两位数Q被格式化ؓ必要时带前导零的两位敎ͼ?00 - 99?/td> |
'j' | 一q中的天敎ͼ被格式化为必要时带前导零的三位数Q例如,对于格里高利历是 001 - 366?/td> |
'm' | 月䆾Q被格式化ؓ必要时带前导零的两位敎ͼ?01 - 13?/td> |
'd' | 一个月中的天数Q被格式化ؓ必要时带前导零两位数Q即 01 - 31 |
'e' | 一个月中的天数Q被格式化ؓ两位敎ͼ?1 - 31?/td> |
'R' | 24 时制的旉Q被格式化ؓ "%tH:%tM" |
'T' | 24 时制的旉Q被格式化ؓ "%tH:%tM:%tS"?/td> |
'r' | 12 时制的旉Q被格式化ؓ "%tI:%tM:%tS %Tp"。上午或下午标记 ('%Tp') 的位|可能与语言环境有关?/td> |
'D' | 日期Q被格式化ؓ "%tm/%td/%ty"?/td> |
'F' | ISO 8601 格式的完整日期,被格式化?"%tY-%tm-%td"?/td> |
'c' | 日期和时_被格式化?"%ta %tb %td %tT %tZ %tY"Q例?"Sun Jul 20 16:17:00 EDT 1969"?/td> |
标志 | 常规 | 字符 | 整数 | 点 | 日期/旉 | 说明 |
'-' | y | y | y | y | y | l果是左对齐的?/td> |
'#' | y1 | - | y3 | y | - | l果应该使用依赖于{换类型的替换形式 |
'+' | - | - | y4 | y | - | l果L包括一个符?/td> |
' ' | - | - | y4 | y | - | 对于正|l果中将包括一个前导空?/td> |
'0' | - | - | y | y | - | l果用零来填充 |
',' | - | - | y2 | y5 | - | l果包括特定于语言环境?a target="_blank">l分隔符 |
'(' | - | - | y4 | y5 | - | l果是用圆括号括v来的负数 |
Calendar c = ...;
String s1 = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);
String s2 = String.format("Duke's Birthday: %1$tm %<$te,%<$tY", c);
主要功能如下Q?
1?() 获得面参数?
2、addOptions and removeAllOptions 初始化下拉框
3、addRows and removeAllRows 填充表格
4、getText 取得text属性?
5、getValue 取得form表单?
6、getValues 取得form多个?
7、onReturn
8、selectRange
9、setValue
10、setValues
11、toDescriptiveString
12、useLoadingMessage
13、Submission box
1?();
功能 : 相当?document.getElementById(id);
参数 : id ?name 属性?;
?:
<script>
Var ele=$(txt_test);
Var str=DWRUtil.toDescriptiveString(ele,1)
DWRUtil.debug(str);
</script>
2。DWRUtil.getValue();
功能 : 获得指定元素 value ?
参数 : id ?name 属性?;
注意 : 该函数只能用于有 value 属性的元素
?:
<script>
var val=DWRUtil.getValue(“txt_test”);
DWRUtil.debug(val);
</script>
3?DWRUtil.getValues();
功能 : 获得一l指定元素的 value ?;
参数 :id ?name 构成的数l对?
?:
<script>
Var arr_=DWRUtil.getValues({“txt_name”:null,”txt_pswd”:null});
Var str=DWRUtil.toDescriptiveString(arr,1)
DWRUtil.debug(str);
</script>
4?/strong>DWRUtil.setValue();
功能 : 讄指定元素?value ?
参数 : id ?name 属性?
?:
<script>
DWRUtil.setValue(“txt_test”,”wiley”);
</script>
5?DWRUtil.setValues();
功能 : 讄一l指定元素的?
参数 : id ?name 构成的数l对?
?:
<script>
DWRUtil.setValues({“txt_name”:”wiley”,”txt_pswd”:”wiley”});
</script>
6?DWRUtil.getText();
功能 : 获得 select 元素的文本?
参数 : id ?name 属性?
?:
<script>
Var txt=DWRUtil.getText (“sel_test”);
Var val=DWRUtil.getValue(“sel_test”);
DWRUtil.debug(“Text:”+txt+”\tValue:”+val);
</script>
7。DWRUtil.addRows();
功能 : 指定表格d?
格式 :DWRUtil.addRows(id,items, functions);
参数 :
W一个参?:table ?tbody ?id 属性?
W二个参?: 数组或链?( 可能用词不是很适合 )
W三个参?: 函数链表
?
<script>
Var arr_={“wiley’s blog”,”wiley 中国 ”};
DWRUtil.addRows(“tby_test”,arr_,[function(arr_){return arr_}]);
</script>
<script>
Var items=[{“name”:”wiley 中国 ”,”add”:”wiley-cn.com”}];
DWRUtil.addRows(“tby_test”,items,[function(item){return item.name}, function(item){return item.add}]);
</script>
8。DWRUtil.romoveAllRows();
功能 : 删除指定表格?
参数 :table ?tbody ?id 属性?
<script>
DWRUtil.romoveAllRows(“tby_test”);// 每次d前将原有数据行删?, 防止数据重叠
Var items=[{“name”:”wiley 中国 ”,”add”:”wiley-cn.com”}];
DWRUtil.addRows(“tby_test”,items,[function(item){return item.name}, function(item){return item.add}]);
</script>
9。DWRUtil.addOptions();
功能 : d select 元素?option 子元?
格式 :DWRUtil.addOption(id,items) ?DWRUtil.addOption(id,items,valueProp,textProp);
参数 :
W一个参?:select ?id ?name 属性?
W二个参?: 数组或链?( 填充数据 )
W三、四个参?: 链表节点的属?, W三个填?value |W四个填?text ?
<script>
Var arr_={“wiley”,”wiley 中国 ”};
DWRUtil.addRows(“sel_test”,arr_);// 此时 value ?text 值相?
DWRUtil.romoveAllOptions(“sel_test”);
Var items=[{“name”:”wiley 中国 ”,”add”:”wiley-cn.com”}];
DWRUtil.addRows(“sel_test”,”add”,”name”);// 此时 value ?text 不相?
</script>
10。DWRUtil.romoveAllOptions();
功能 : 删除指定 select 元素?option 子元?
参数 :select 元素?id ?name 属性?
?: 前面例子有用?
11。DWRUtil.debug();
功能 : {h?alert()
?: 前面例子有用?
12。DWRUtil.toDescriptiveString();
功能Q将对象序列化成字符?, 主要用于调试
带debug信息的toStringQ第一个ؓ要debug的对象,W二个参Cؓ处理{。等U如下:
0: Single line of debug 单行调试
1: Multi-line debug that does not dig into child objects 不分析子元素的多行调?nbsp;
2: Multi-line debug that digs into the 2nd layer of child objects 最多分析到W二层子元素的多行调?
<input type="text" id="text">
DWRUtil.toDescrīptiveString("text",0);
13。DWRUtil.useLoadingMessage();
功能Q当发出ajaxh?面昄的提C等待信?
例:
function searchUser(){
var loadinfo = "loading....."
regUser.queryAllUser(userList);
DWRUtil.useLoadingMessage(loadinfo);
}