<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Michael.zhl</title>
    <description></description>
    <link>http://michael-zhl.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>原创 Struts Spring Hibernate (SSH) 整合实例</title>
        <author>Michael.zhl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://michael-zhl.javaeye.com">Michael.zhl</a>&nbsp;
          链接：<a href="http://michael-zhl.javaeye.com/blog/117807" style="color:red;">http://michael-zhl.javaeye.com/blog/117807</a>&nbsp;
          发表时间: 2007年08月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="COLOR: #0000ff">首选创建web.xml 主要是配置Struts的ActionServlet和Spring的字符过滤器</span><br /><br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;web-app xmlns="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>" xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>" version="2.4" xsi:schemaLocation="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>&nbsp;&nbsp; <a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>"&gt;<br />&nbsp; <br />&nbsp; &lt;filter&gt;<br />&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt;<br />&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt;<br />&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;encoding&lt;/param-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;UTF-8&lt;/param-value&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;forceEncoding&lt;/param-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />&nbsp; &lt;/filter&gt;<br />&nbsp; <br />&nbsp; &lt;filter-mapping&gt;<br />&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt;<br />&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&nbsp; &lt;/filter-mapping&gt;<br />&nbsp; <br />&nbsp; &lt;servlet&gt;<br />&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;<br />&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config&lt;/param-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts/struts.xml&lt;/param-value&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;3&lt;/param-value&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;detail&lt;/param-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;3&lt;/param-value&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;0&lt;/load-on-startup&gt;<br />&nbsp; &lt;/servlet&gt;<br />&nbsp; <br />&nbsp; &lt;servlet-mapping&gt;<br />&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br />&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />&nbsp; &lt;/servlet-mapping&gt;<br />&nbsp; <br />&nbsp; &lt;!-- session超时定义,单位为分钟 --&gt;<br />&nbsp; &lt;session-config&gt;<br />&nbsp;&nbsp;&nbsp; &lt;session-timeout&gt;10&lt;/session-timeout&gt;<br />&nbsp; &lt;/session-config&gt;<br />&nbsp; <br />&nbsp; &lt;!-- 默认首页定义 --&gt;<br />&nbsp; &lt;welcome-file-list&gt;<br />&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />&nbsp; &lt;/welcome-file-list&gt;<br />&nbsp; <br />&lt;/web-app&gt;</p>
<p>&nbsp;</p>
<p><span style="COLOR: #0000ff">然后创建struts.xml(String配置文件) 要注意这里集成了Spring插件,把全部Spring配置文件注入到ContextLoaderPlugIn中</span><br /><br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "<a href="http://struts.apache.org/dtds/struts-config_1_2.dtd">http://struts.apache.org/dtds/struts-config_1_2.dtd</a>"&gt;<br />&lt;struts-config&gt;</p>
<p>&nbsp; &lt;form-beans&gt;<br />&nbsp;&lt;form-bean name="loginVO" type="com.vo.LoginVO" /&gt;<br />&nbsp; &lt;/form-beans&gt;</p>
<p>&nbsp; &lt;global-forwards&gt;<br />&nbsp; &nbsp;&lt;forward name="error" path="/error.jsp"/&gt;<br />&nbsp; &lt;/global-forwards&gt;</p>
<p>&nbsp; &lt;action-mappings&gt;<br />&nbsp; &nbsp;&lt;action path="/login"<br />&nbsp; &nbsp;&nbsp;&nbsp;name="loginVO"<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;type="org.springframework.web.struts.DelegatingActionProxy"<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;parameter="action"<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;scope="request"&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;forward name="login" path="/login.jsp"/&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&lt;forward name="index" path="/index.jsp"/&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/action&gt;<br />&nbsp; &lt;/action-mappings&gt;</p>
<p>&nbsp; &lt;!-- 集成Spring插件 --&gt;<br />&nbsp; &lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;set-property property="contextConfigLocation" value="/WEB-INF/spring/*.xml" /&gt;<br />&nbsp; &lt;/plug-in&gt;</p>
<p>&lt;/struts-config&gt;</p>
<p><br /><span style="COLOR: #0000ff">配置Spring配置文件<br /></span><br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>"&gt;<br />&lt;beans&gt;<br />&nbsp;&lt;!-- 读入属性文件 --&gt;<br />&nbsp;&lt;bean id="propertyConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;<br />&nbsp;&nbsp;&lt;property name="locations"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;classpath:hibernate.properties&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&lt;/bean&gt;</p>
<p>&nbsp;&lt;!-- 配置数据源，可以其他方式 --&gt;<br />&nbsp;&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="driverClassName" value="${hibernate.driverClassName}" /&gt;<br />&nbsp;&nbsp;&lt;property name="url" value="${hibernate.url}" /&gt;<br />&nbsp;&nbsp;&lt;property name="username" value="${hibernate.username}" /&gt;<br />&nbsp;&nbsp;&lt;property name="password" value="${hibernate.password}" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="maxActive" value="${hibernate.maxActive}" /&gt;<br />&nbsp;&nbsp;&lt;property name="maxIdle" value="${hibernate.maxIdle}" /&gt;<br />&nbsp;&nbsp;&lt;property name="maxWait" value="${hibernate.maxWait}" /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p>&nbsp;&lt;!-- 配置Hibernate的Session工厂，注入数据源、映射文件 --&gt;<br />&nbsp;&nbsp;&nbsp; &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="dataSource"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;ref local="dataSource"/&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="mappingResources"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;com/po/login.hbm.xml&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="hibernateProperties"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;props&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.dialect"&gt;${hibernate.dialect}&lt;/prop&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.show_sql"&gt;${hibernate.showSQL}&lt;/prop&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/props&gt;<br />&nbsp;&nbsp;&nbsp; &nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p>&nbsp;&lt;!-- 声明Hibernate事务管理，注入Session工厂 --&gt;<br />&nbsp;&nbsp;&nbsp; &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="sessionFactory"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local="sessionFactory"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp; &nbsp;&lt;/bean&gt;</p>
<p>&nbsp;&lt;!-- 配置事务代理，注入事务管理transactionManager，由Spring来代理事务，设置事务属性 --&gt;<br />&nbsp;&nbsp;&nbsp; &lt;bean id="transactionProxy" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="transactionManager"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="transactionManager"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="transactionAttributes"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;props&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;prop key="save*"&gt;PROPAGATION_REQUIRED,-Exception&lt;/prop&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="add*"&gt;PROPAGATION_REQUIRED,-Exception&lt;/prop&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="remove*"&gt;PROPAGATION_REQUIRED,-Exception&lt;/prop&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="delete*"&gt;PROPAGATION_REQUIRED,-Exception&lt;/prop&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="update*"&gt;PROPAGATION_REQUIRED,-Exception&lt;/prop&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="create*"&gt;PROPAGATION_REQUIRED,-Exception&lt;/prop&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="query*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="find*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="get*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="load*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/props&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />&lt;/beans&gt;<br /><br /><br /><span style="COLOR: #0000ff">配置Action将Service注入到Action</span><br /><br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>"&gt;<br />&lt;beans&gt;<br />&nbsp;&lt;!-- 配置Action，singleton属性设置为false表示不使用单例，每次都重新创建实例，避免并发问题，注入事务管理的Service --&gt;<br />&nbsp;&nbsp;&lt;bean name="/login" class="com.action.LoginAction" singleton="false"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;property name="loginService"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;ref bean="loginService"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&lt;/bean&gt;<br />&lt;/beans&gt;<br /><br />配置Service将Dao注入到Service<br /><br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>"&gt;<br />&lt;beans&gt;<br />&nbsp;&lt;!-- 配置事务代理Service，先将Dao注入到Service，再将Service注入给事务代理 --&gt;<br />&nbsp;&nbsp;&nbsp; &lt;bean id="loginService" parent="transactionProxy"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="target"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;ref bean="loginTempService"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp; &nbsp;&lt;/bean&gt;<br />&nbsp; &nbsp;&lt;bean id="loginTempService" class="com.service.LoginService"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="loginDao"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;ref bean="loginDao"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />&lt;/beans&gt;<br /><br />配置Dao 注入Session工厂<br /><br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>"&gt;<br />&lt;beans&gt;<br />&nbsp;&lt;!-- 配置Dao，注入Session工厂 --&gt;<br />&nbsp;&nbsp;&nbsp; &lt;bean id="loginDao" class="com.dao.LoginDao"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="sessionFactory"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;ref bean="sessionFactory"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />&lt;/beans&gt;<br /><br />数据源属性文件(注意不是Hibernate的配置文件,是为了让Spring读入的)<br /><br />hibernate.dialect=org.hibernate.dialect.SQLServerDialect<br />hibernate.driverClassName=com.mysql.jdbc.Driver<br />hibernate.url=jdbc:mysql://127.0.0.1:3306/ssh<br />hibernate.username=root<br />hibernate.password=5719<br />hibernate.showSQL=true<br />hibernate.maxActive=50<br />hibernate.maxIdle=30<br />hibernate.maxWait=1000<br /><br />log4j配置文件(简单)<br /><br />log4j.rootLogger=ERROR,console,file</p>
<p><span>log4j.appender.console=org.apache.log4j.ConsoleAppender<br />log4j.appender.console.layout=org.apache.log4j.PatternLayout<br />log4j.appender.console.layout.ConversionPattern=%-5p %d [%F,%L] - %m%n</span></p>
<p><span>log4j.appender.file=org.apache.log4j.RollingFileAppender<br />log4j.appender.file.File=F:\\SSH.log<br />#log4j.appender.file.MaxFileSize=100000KB<br />#log4j.appender.file.MaxBackupIndex=1<br />log4j.appender.file.layout=org.apache.log4j.PatternLayout<br />log4j.appender.file.layout.ConversionPattern=%-5p %d [%F,%L] - %m%n<br /><br /><span style="COLOR: #0000ff">下面是类文件</span><br /><br />package com.action;</span></p>
<p><span>import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;</span></p>
<p><span>import org.apache.commons.logging.Log;<br />import org.apache.commons.logging.LogFactory;<br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionForward;<br />import org.apache.struts.action.ActionMapping;<br />import org.apache.struts.actions.DispatchAction;</span></p>
<p><span>import com.service.LoginService;<br />import com.vo.LoginVO;</span></p>
<p><span>public class LoginAction extends DispatchAction {</span></p>
<p><span>&nbsp;private Log logger = LogFactory.getLog(LoginAction.class);<br />&nbsp;private LoginService loginService;</span></p>
<p><span>&nbsp;public void setLoginService(LoginService loginService) {<br />&nbsp;&nbsp;this.loginService = loginService;<br />&nbsp;}</span></p>
<p><span>&nbsp;public ActionForward login(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;LoginVO loginVO = (LoginVO) form;<br />&nbsp;&nbsp;&nbsp;String username = loginVO.getUsername();<br />&nbsp;&nbsp;&nbsp;String password = loginVO.getPassword();<br />&nbsp;&nbsp;&nbsp;System.out.println(username+password);<br />&nbsp;&nbsp;&nbsp;if(loginService.validate(username, password)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;return mapping.findForward("index");<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;return mapping.findForward("error");<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;logger.error(e);<br />&nbsp;&nbsp;&nbsp;return mapping.findForward("error");<br />&nbsp;&nbsp;}<br />&nbsp;}</span></p>
<p><span>&nbsp;public ActionForward save(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;LoginVO loginVO = (LoginVO) form;<br />&nbsp;&nbsp;&nbsp;loginService.saveUser(loginVO);<br />&nbsp;&nbsp;&nbsp;return mapping.findForward("index");<br />&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;logger.error(e);<br />&nbsp;&nbsp;&nbsp;return mapping.findForward("error");<br />&nbsp;&nbsp;}<br />&nbsp;}<br />}<br /><br /><br /><br />package com.dao;</span></p>
<p><span>import java.util.List;</span></p>
<p><span>import org.springframework.orm.hibernate3.support.HibernateDaoSupport;</span></p>
<p><span>import com.po.LoginPO;</span></p>
<p><span>public class LoginDao extends HibernateDaoSupport {</span></p>
<p><span>&nbsp;@SuppressWarnings("unchecked")<br />&nbsp;public String getPassword(String username) {<br />&nbsp;&nbsp;String hql = "from LoginPO l where l.username=?";<br />&nbsp;&nbsp;List list = getSession().createQuery(hql).setString(0,username).list();<br />&nbsp;&nbsp;if(list!=null &amp;&amp; list.size()&gt;0) {<br />&nbsp;&nbsp;&nbsp;LoginPO loginPO = (LoginPO) list.get(0);<br />&nbsp;&nbsp;&nbsp;return loginPO.getPassword();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return null;<br />&nbsp;}</span></p>
<p><span>&nbsp;public void save(LoginPO loginPO) {<br />&nbsp;&nbsp;getSession().save(loginPO);<br />&nbsp;}<br />}<br /><br /><br /><br />package com.po;</span></p>
<p><span>import java.io.Serializable;</span></p>
<p><span>public class LoginPO implements Serializable {</span></p>
<p><span>&nbsp;private static final long serialVersionUID = 1L;</span></p>
<p><span>&nbsp;private Integer id = null;<br />&nbsp;private String username = null;<br />&nbsp;private String password = null;</span></p>
<p><span>&nbsp;public Integer getId() {<br />&nbsp;&nbsp;return id;<br />&nbsp;}<br />&nbsp;public String getPassword() {<br />&nbsp;&nbsp;return password;<br />&nbsp;}<br />&nbsp;public String getUsername() {<br />&nbsp;&nbsp;return username;<br />&nbsp;}<br />&nbsp;public void setId(Integer id) {<br />&nbsp;&nbsp;this.id = id;<br />&nbsp;}<br />&nbsp;public void setPassword(String password) {<br />&nbsp;&nbsp;this.password = password;<br />&nbsp;}<br />&nbsp;public void setUsername(String username) {<br />&nbsp;&nbsp;this.username = username;<br />&nbsp;}<br />}<br /><br /><br /><br />package com.service;</span></p>
<p><span>import com.dao.LoginDao;<br />import com.po.LoginPO;<br />import com.vo.LoginVO;</span></p>
<p><span>public class LoginService {</span></p>
<p><span>&nbsp;private LoginDao loginDao;</span></p>
<p><span>&nbsp;public void setLoginDao(LoginDao loginDao) {<br />&nbsp;&nbsp;this.loginDao = loginDao;<br />&nbsp;}</span></p>
<p><span>&nbsp;public boolean validate(String username,String password) {<br />&nbsp;&nbsp;String pass = loginDao.getPassword(username);<br />&nbsp;&nbsp;if(pass!=null) {<br />&nbsp;&nbsp;&nbsp;if(pass.equals(password)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;return true;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return false;<br />&nbsp;}</span></p>
<p><span>&nbsp;public void saveUser(LoginVO loginVO) {<br />&nbsp;&nbsp;LoginPO loginPO = new LoginPO();<br />&nbsp;&nbsp;loginPO.setUsername(loginVO.getUsername());<br />&nbsp;&nbsp;loginPO.setPassword(loginVO.getPassword());<br />&nbsp;&nbsp;System.out.println(loginVO.getUsername()+"-"+loginVO.getPassword()+":save succeed...");<br />&nbsp;&nbsp;loginDao.save(loginPO);<br />&nbsp;&nbsp;//故意制造异常，测试事务。<br />&nbsp;&nbsp;//loginDao.save(null);<br />&nbsp;}<br />}<br /><br /><br /><br />package com.vo;</span></p>
<p><span>import org.apache.struts.action.ActionForm;</span></p>
<p><span>public class LoginVO extends ActionForm {</span></p>
<p><span>&nbsp;private static final long serialVersionUID = 1L;<br />&nbsp;<br />&nbsp;private String username = null;<br />&nbsp;<br />&nbsp;private String password = null;<br />&nbsp;<br />&nbsp;public String getPassword() {<br />&nbsp;&nbsp;return password;<br />&nbsp;}<br />&nbsp;public String getUsername() {<br />&nbsp;&nbsp;return username;<br />&nbsp;}<br />&nbsp;public void setPassword(String password) {<br />&nbsp;&nbsp;this.password = password;<br />&nbsp;}<br />&nbsp;public void setUsername(String username) {<br />&nbsp;&nbsp;this.username = username;<br />&nbsp;}<br />}<br /></span></p>
<p><span style="COLOR: #0000ff">Hibernate映射文件<br /></span><br />&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"<br />"<a href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</a>"&gt;</p>
<p>&lt;hibernate-mapping&gt;<br />&nbsp;&nbsp;&nbsp; &lt;class name="com.po.LoginPO" table="login"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;comment&gt;&lt;/comment&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id name="id" type="int"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;column name="id" /&gt;<br />&nbsp;&nbsp;&nbsp;&lt;generator class="native" /&gt;<br />&nbsp;&nbsp;&lt;/id&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="username" type="string"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="username" not-null="true"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;comment&gt;&lt;/comment&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/column&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="password" type="string"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="password" not-null="true"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;comment&gt;&lt;/comment&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/column&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/class&gt;<br />&lt;/hibernate-mapping&gt;<br /><br /><span style="COLOR: #0000ff">jsp页面文件<br /><br /></span>&lt;%@ page contentType="text/html;charset=UTF-8" language="java" %&gt;<br />&lt;html&gt;<br />&lt;body&gt;<br />&nbsp;&nbsp;&lt;form name="form" action="login.do?action=login" method="post"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;h1&gt;Login&lt;/h1&gt;<br />&nbsp;&nbsp;&nbsp;&lt;h4&gt;username:&lt;/h4&gt;&lt;input name="username" type="text"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span id="message"&gt;&lt;/span&gt;<br />&nbsp;&nbsp;&nbsp;&lt;h4&gt;password:&lt;/h4&gt;&lt;input name="password" type="password"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;br&gt;<br />&nbsp;&nbsp;&nbsp;&lt;br&gt;<br />&nbsp;&nbsp;&nbsp;&lt;input value="提交" type="button" onclick="form.submit();"&gt;<br />&nbsp;&nbsp;&lt;/form&gt;<br />&nbsp;&nbsp;&lt;br&gt;<br />&nbsp;&nbsp;&lt;br&gt;<br />&nbsp;&nbsp;&lt;br&gt;<br />&nbsp;&nbsp;&lt;form name="form" action="login.do?action=save" method="post"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;h1&gt;Save&lt;/h1&gt;<br />&nbsp;&nbsp;&nbsp;&lt;h4&gt;username:&lt;/h4&gt;&lt;input name="username" type="text"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span id="message"&gt;&lt;/span&gt;<br />&nbsp;&nbsp;&nbsp;&lt;h4&gt;password:&lt;/h4&gt;&lt;input name="password" type="password"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;br&gt;<br />&nbsp;&nbsp;&nbsp;&lt;br&gt;<br />&nbsp;&nbsp;&nbsp;&lt;input value="提交" type="button" onclick="form.submit();"&gt;<br />&nbsp;&nbsp;&lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br /><br /><span style="COLOR: #0000ff">jar包太多太大了这里就不发了.具体什么意思都有注视,完全实例,理论知识以后在说,欢迎拍砖嘎嘎...</span></p>
<img src="http://www.blogjava.net/action/aggbug/140566.html" height="1" width="1" /><br /><br /><div align="right"><a href="http://www.blogjava.net/action/" target="_blank" style="text-decoration:none;">我心依旧</a> 2007-08-28 16:17 <a href="http://www.blogjava.net/action/archive/2007/08/28/140566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://michael-zhl.javaeye.com/blog/117807#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 28 Aug 2007 08:17:00 +0800</pubDate>
        <link>http://michael-zhl.javaeye.com/blog/117807</link>
        <guid>http://michael-zhl.javaeye.com/blog/117807</guid>
      </item>
      <item>
        <title>北京有换工作的没,我们公司急聘中,高级软件工程师,系统分析师,我们SOA项目,有兴趣的可以发简历到huanglia@163.com</title>
        <author>Michael.zhl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://michael-zhl.javaeye.com">Michael.zhl</a>&nbsp;
          链接：<a href="http://michael-zhl.javaeye.com/blog/95706" style="color:red;">http://michael-zhl.javaeye.com/blog/95706</a>&nbsp;
          发表时间: 2007年06月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>北京有换工作的没,我们公司急聘中,高级软件工程师,系统分析师,我们SOA项目,有兴趣的可以发简历到huanglia@163.com <br />我QQ是147372304</p>
<img src="http://www.blogjava.net/action/aggbug/127111.html" height="1" width="1" /><br /><br /><div align="right"><a href="http://www.blogjava.net/action/" target="_blank" style="text-decoration:none;">我心依旧</a> 2007-06-29 17:29 <a href="http://www.blogjava.net/action/archive/2007/06/29/127111.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://michael-zhl.javaeye.com/blog/95706#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 29 Jun 2007 09:29:00 +0800</pubDate>
        <link>http://michael-zhl.javaeye.com/blog/95706</link>
        <guid>http://michael-zhl.javaeye.com/blog/95706</guid>
      </item>
      <item>
        <title>Hibernate 解决SQL count(*)的问题.</title>
        <author>Michael.zhl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://michael-zhl.javaeye.com">Michael.zhl</a>&nbsp;
          链接：<a href="http://michael-zhl.javaeye.com/blog/87254" style="color:red;">http://michael-zhl.javaeye.com/blog/87254</a>&nbsp;
          发表时间: 2007年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>// 用于hibernate 2.x <br />protected String getCountSql(String originalHql, net.sf.hibernate.SessionFactory sessionFactory) throws Exception { <br />QueryTranslator translator = new QueryTranslator(originalHql);</p>
<p>translator.compile((net.sf.hibernate.engine.SessionFactoryImplementor)sessionFactory, Collections.EMPTY_MAP, false);</p>
<p>return "select count(*) from (" + translator.getSQLString() + ") tmp_count_t"; <br />} <br />// 用于hibernate 3.x <br />protected String getCountSql(String originalHql, org.hibernate.SessionFactory sessionFactory) throws Exception { <br />QueryTranslatorImpl queryTranslator = new QueryTranslatorImpl(originalHql, originalHql, <br />Collections.EMPTY_MAP, (org.hibernate.engine.SessionFactoryImplementor)sessionFactory);</p>
<p>queryTranslator.compile(Collections.EMPTY_MAP, false);</p>
<p>return "select count(*) from (" + queryTranslator.getSQLString() + ") tmp_count_t"; <br />}<br /><br /></p>
<p>String strHQL = "Select count(*) From tb_po"; <br />Long count = (Long)session.createQuery(strHQL).uniqueResult();</p>
<img src="http://www.blogjava.net/action/aggbug/122089.html" height="1" width="1" /><br /><br /><div align="right"><a href="http://www.blogjava.net/action/" target="_blank" style="text-decoration:none;">我心依旧</a> 2007-06-05 11:28 <a href="http://www.blogjava.net/action/archive/2007/06/05/122089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://michael-zhl.javaeye.com/blog/87254#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 05 Jun 2007 03:28:00 +0800</pubDate>
        <link>http://michael-zhl.javaeye.com/blog/87254</link>
        <guid>http://michael-zhl.javaeye.com/blog/87254</guid>
      </item>
      <item>
        <title>理解Session缓存机制 操纵持久化对象</title>
        <author>Michael.zhl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://michael-zhl.javaeye.com">Michael.zhl</a>&nbsp;
          链接：<a href="http://michael-zhl.javaeye.com/blog/82875" style="color:red;">http://michael-zhl.javaeye.com/blog/82875</a>&nbsp;
          发表时间: 2007年05月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="2">Hibernate向我们提供的主要的操纵数据库的接口,Session就是其中的一个,它提供了基本的增,删,改,查方法.而且具有一个缓存机制,能够按照某个时间点,按照缓存中的持久化对象属性的变化来更新数据库,着就是Session的缓存清理过程.在Hibernate中对象分为三个状态,临时,持久化,游离.如果我们希望JAVA里的一个对象一直存在,就必须有一个变量一直引用着这个对象.当这个变量没了.对象也就被JVM回收了.当然这个是最基本的常识了.当Session的save()方法持久化了一个对象的时候,即使这个对象的引用变量小时了.这个对象也依然存在,因为Sessoin里保存了一个这个对象的引用,当然Session缓存被清空,这个对象就OVER了.在这个对象保存在Sessoin的时候如果调用load()方法试图去数据库中加载一个对象,这个时候Session会先判断缓存中有没有这个对象,如果有了,那么就不需要去数据库加载了.这样可以减少访问数据库的频率,还可以保证缓存中的对象于数据库的同步.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session有两个方法,一个commit()事务提交方法,还有flush()刷新缓存方法,都有着清理缓存的作用,flush()进行缓存的清理,执行一系列的SQL语句,但不会提交事务.而commit()方法会先调用flush()方法,然后在提交事务.Session还有一个方法就是setFushMode()方法,用户设定清理缓存的时间点,主要有三种模式,默认Flush.Mode.AUTO<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1)FlushMode.AUTO Session的查询方法,commit方法,flush方法都会清理缓存.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2)FlushMode.COMMIT Session的commit方法,flush方法会清理缓存.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3)FlushMode.NEVER Session的flush方法会清理缓存.<br />对象的临时状态:刚用new创建对象的时候,它还没有被持久化,这个时候是临时状态.<br />对象的持久化状态:已经被加入到Session的缓存中,通常所说的持久化对象就是只一个对象在这个状态的时候.<br />对象的游离状态:已经被持久化,但是不属于Session的缓存的时候是游离状态.</font>
<img src="http://www.blogjava.net/action/aggbug/119737.html" height="1" width="1" /><br /><br /><div align="right"><a href="http://www.blogjava.net/action/" target="_blank" style="text-decoration:none;">我心依旧</a> 2007-05-24 15:43 <a href="http://www.blogjava.net/action/archive/2007/05/24/119737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://michael-zhl.javaeye.com/blog/82875#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 24 May 2007 07:43:00 +0800</pubDate>
        <link>http://michael-zhl.javaeye.com/blog/82875</link>
        <guid>http://michael-zhl.javaeye.com/blog/82875</guid>
      </item>
      <item>
        <title>分析Hibernate映射的关联关系</title>
        <author>Michael.zhl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://michael-zhl.javaeye.com">Michael.zhl</a>&nbsp;
          链接：<a href="http://michael-zhl.javaeye.com/blog/82480" style="color:red;">http://michael-zhl.javaeye.com/blog/82480</a>&nbsp;
          发表时间: 2007年05月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="2">Hibernate的映射关联关系和我们现实世界里事物的关联关系一样.比如在UML语言中,以客户Customer和订单Order的关系为例.一个客户可以发送多个订单,而一个订单只能属于一个客户,这是一对多的关联,因此可以成为单向关联.如果同时包含了两两种关联关系,就成为双向关联.在关系数据库中只有外键参照主键的关系.所以关系数据库实际上至支持一对一,或一对多的单向关系.在类于类之间的关系中.要算多对一关系和数据库中的外键参照主键关系最匹配了.因此如果使用单向关联从订单到客户的多对一单向关联,在订单类中就要定义一个客户的属性.表示这个订单属于哪个客户,而客户类就无需定义存放订单的集合属性了.下面写一个简单的例子.<br />//首先定义客户类<br />public class Customer implements Sreializable {<br />&nbsp;&nbsp;&nbsp;private Long id;<br />&nbsp;&nbsp;&nbsp;private String name;<br />&nbsp;&nbsp;&nbsp;//省略属性的访问方法<br />}<br />//然后定义订单类<br />public class Order implements Sreializable {<br />&nbsp;&nbsp;&nbsp;private Long id;<br />&nbsp;&nbsp;&nbsp;private String orderName;<br />&nbsp;&nbsp;&nbsp;private Customer customer;<br />&nbsp;&nbsp;&nbsp;//省略属性的访问方法,要注意的是Customer的访问方法.<br />}<br />Customer类的所有属性和CUSTOMERS表的所有属性一一对应,创建起来就比较简单了.下面主要看一下Order类的映射文件.<br />&lt;property name="orderName" type="string"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;column name="ORDER_NAME" length="15"/&gt;<br />&lt;/property&gt;<br />因为customer属性是是Customer类型,而ORDERS表的CUSTOMER_ID是整数类型,是不匹配的.所以我们不能用普通的&lt;property&gt;元素来定义,而我们需要使用&lt;many-to-one&gt;元素来配置了.<br />&lt;many-to-one name="customer" column="CUSTOMER_ID" class="包名.Customer" not-null="true"/&gt;<br />&lt;many-to-one&gt;元素负责建立Order订单类的customer属性和数据库中的CUSTOMER_ID外键字段之间的映射.<br />name:设定映射文件的属性名<br />column:设定和持久化类对应的表的外键名<br />class:设定持久化类的属性的类型,这里指定具体的类,也就是主键存在的类<br />not-null:设定为true表示customer属性不允许为null,默认是false,这个属性会影响到bhm2ddl工具,会为ORDERS表的CUSTOMER_ID外键设置为不允许空的约束,但是不会影响到hbm2java工具生长java源代码.此外还会影响到Hibernate运行时的行为,在保存Order对象的时候会检查customer属性是否为null.用hbm2ddl编译之后得到的数据库文件如下:<br /><br />create table CUSTOMERS (<br />&nbsp;&nbsp; ID bigint not null,<br />&nbsp;&nbsp; NAME varchar(15),<br />&nbsp;&nbsp; primary key (ID)<br />);<br />create table ORDERS (<br />&nbsp;&nbsp; ID bigint not null,<br />&nbsp;&nbsp; ORDER_NUMBER varchar(15),<br />&nbsp;&nbsp; CUSTOMER_ID bigint not null,<br />&nbsp;&nbsp; primary key (ID)<br />);<br />alter table ORDERS add index FK8B7256E516B4891C (CUSTOMER_ID), <br />add constraint FK8B7256E516B4891C foreign key (CUSTOMER_ID) references CUSTOMERS (ID);<br />看到结果我们可以简单的把&lt;many-to-one&gt;理解为在数据库中,创建外键的作用.上边这个例子就简单的演示了Hibernate映射的一对一关联关系,至于一对多的关联关系比这个稍微复杂一点.而且可以看出,当Hibernate持久化一个临时对象的时候,在默认的情况下它不会自动持久化关联其他临时对象,而是会抛出TransientObjectException异常.如果希望Hibernate持久化对象的时候也自动持久化说关联的对象,就要把&lt;many-to-one&gt;元素的cascade属性设置为save-update,表示级联操作的意思,cascade属性的默认值为none.当这个属性设置OK了.数据库就实现了级联保存更新的操作.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在类和类之间建好了关联关系之后,就可以方便的从一个对象得到它关联的对象.例如Customer customer=order.getCustomer();这样获得的了Customer对象了.但是如果想获得所有属于Customer客户的Order订单对象,就涉及到了一对多双向关联了.在内存中,从一个对象导航都另一个对象要比从数据库中通过一个字段查询另一个字段快的多的多,但是也给编程的时候带来了麻烦,随意修改一个对象就可能牵一发而动全身,所以说双向的关联比较复杂,但是类和类之间到底建立单向还是双向关联,这个要根据业务需求来决定.比如说业务需求根据指定客户查询客户所有订单,根据指定的订单,查询出发这个订单的客户.这个时候我们不妨用多对一双向关联处理.其实上边的例子的映射文件已经简历了客户和订单之间的一对多双向关联关系,只不过要在客户类中加一个集合的属性:<br />private set orders = new HashSet();<br />public set getOrders() {<br />&nbsp;&nbsp;&nbsp;return orders;<br />}<br />public void setOrders(Set orders) {<br />&nbsp;&nbsp; this.orders = orders;<br />}<br />有了orders属性,客户就可以通过getOrders()方法或者客户的全部订单了,Hibernate在定义这个集合属性的时候必须声明为接口类型,但是不光光是Set还有Map和List,这样可以提高程序的强壮性,就是说set方法接受的对象只要是实现了Set接口就OK.避免出现null值的现象.这里要注意的是hbm2java工具生成类的集合属性的代码时,不会给它初始化一个集合对象的实例,这里我们需要自己手动修改,当然不修改也是可以的.接下来还要在customer.hbm.xml映射文件里映射集合类型的orders属性,当然这个和order表的的&lt;many-to-one&gt;同理,所以不能通过普通的&lt;property&gt;元素来设置属性和字段的映射关系.要使用&lt;set&gt;元素来设置:<br />&lt;set name="orders" cascade="save-update"&gt;<br />&lt;key column="CUSTOMER_ID"&gt;<br />&lt;one-to-many class="包名.Order"&gt;<br />&lt;/set&gt;<br />name:设定类的属性名<br />cascade:设置为save-update表示级联保存更新,当保存或更新Customer类的时候会级联保存更新跟它关联的Order类.<br />&lt;key&gt;元素是用来设定跟持久化类关联的类的外键<br />&lt;one-to-many&gt;元素看起来很熟悉,哦是设置外键的元素反过来了.这里它是用来设置所关联的持久化类的.这里设置为和客户关联的订单Order类,这里表明这个属性里要存放一组Order类型的对象.<br />这个&lt;set&gt;元素是表示orders属性声明为set类型.<br />&lt;set&gt;元素还有一个inverse属性,这个方法主要是在给已存在数据库中的字段建立关联的时候很有用.就是说当我们获得数据库中的两个表的两条记录的对象customer客户对象和order订单对象(映射文件已经建立了他们类和类之间的关联,但外键的值为null的情况下)然后我们想建立这个客户对象和订单对象之间的关联,我们要先调用order.setCustomer(customer);然后在调用customer.getOrder().add(order);在Hibernate自动清理缓存的持久化对象的时候会提交两条SQL语句.进行了两个update操作.但是实际上只修改了一条记录.重复的执行SQL语句是会降低系统的运行效率的,当把inverse属性设置为true的时候,同样的操作就会合并到一条SQL语句执行了,inverse默认为false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;级联删除就很简单了,把cascade属性设置为delete,如果你删除了一个客户,程序就会先执行删除这个客户全部的订单的SQL语句,然后在删除这个客户,所谓删除一个持久化对象不是在内存中删除这个对象,而是删除数据库中相关的记录,这个对象依然在内存中,只不过由持久化状态转为临时状态,当这个对象的引用消失后,这个对象会被垃圾回收.但是如果我又想级联删除,还想级联保存,更新的时候应该怎么办呢?这个时候我们将cascade属性设置为all-delete-orphan就OK了.非常简单明了.我们还可以通过持久化类的customer.getOrder().rumove(order);解除关联.这里的操作表示获得客户订单的集合对象,然后从集合对象中删除order的订单,其实这种操作的意义不大,当我们不需要的这个订单的时候完全可以删除它,解除关联之后如果设置了级联删除属性,这个无用的记录也是要被删除的.其实解除关联就是把外键设为null.通常我们的外键都要约束不可以为空.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;映射关联还有一种多对多的关联,是一种自身关联关系.就是同一张表.自己和自己的关联.比如说一张人表,地球人是人,美国人,中国人,日本人都属于地球人,中国人有分北京人,山东人.日本人也有下一级的比如东京人.下面设想如果日本人被消灭掉了,那么东京人也应该都被没有了吧,这就是一种关系,自身对自身的关联关系.这就有点类似树的结构了.下面用一个例子演示这种关系,代码来源于孙MM的&lt;&lt;精通Hibernate&gt;&gt;一书.<br />public class Category implements Serializable {</font><font size="2"><br />&nbsp;&nbsp;&nbsp; private Long id;</font><font size="2"><br />&nbsp;&nbsp;&nbsp; private String name;</font><font size="2"><br />&nbsp;&nbsp;&nbsp; private Category parentCategory;</font><font size="2"><br />&nbsp;&nbsp;&nbsp; private Set childCategories;</font><font size="2"><br />&nbsp;&nbsp;&nbsp; public Category(String name, mypack.Category parentCategory, Set childCategories) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.parentCategory = parentCategory;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.childCategories = childCategories;<br />&nbsp;&nbsp;&nbsp; }</font><font size="2"><br />&nbsp;&nbsp;&nbsp; public Category() {<br />&nbsp;&nbsp;&nbsp; }</font><font size="2"><br />&nbsp;&nbsp;&nbsp; public Category(Set childCategories) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.childCategories = childCategories;<br />&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp; public Category getParentCategory() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.parentCategory;<br />&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp; public void setParentCategory(Category parentCategory) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.parentCategory = parentCategory;<br />&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp; public Set getChildCategories() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.childCategories;<br />&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp; public void setChildCategories(Set childCategories) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.childCategories = childCategories;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;//为了节省空间省略了id,name属性的访问方法</font></p>
<p><font size="2">}<br />&lt;hibernate-mapping &gt;<br />&nbsp; &lt;class name="mypack.Category" table="CATEGORIES" &gt;<br />&nbsp;&nbsp;&nbsp; &lt;id name="id" type="long" column="ID"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="increment"/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name="name" type="string" &gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="NAME" length="15" /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; &lt;set <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="childCategories"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cascade="save-update"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inverse="true"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key column="CATEGORY_ID" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-many class="mypack.Category" /&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;/set&gt;&nbsp;&nbsp; <br />&nbsp;&nbsp; &lt;many-to-one<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="parentCategory"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; column="CATEGORY_ID"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="mypack.Category"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&gt;<br />&nbsp; &lt;/class&gt;<br />&lt;/hibernate-mapping&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我觉得这种方式其实和上边的一对多,一对一关系一样,只不过两个用的都是同一个类罢了.看一下例子理解上应该很简单.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /></font></p>

<img src="http://www.blogjava.net/action/aggbug/119405.html" height="1" width="1" /><br /><br /><div align="right"><a href="http://www.blogjava.net/action/" target="_blank" style="text-decoration:none;">我心依旧</a> 2007-05-23 15:07 <a href="http://www.blogjava.net/action/archive/2007/05/23/119405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://michael-zhl.javaeye.com/blog/82480#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 May 2007 07:07:00 +0800</pubDate>
        <link>http://michael-zhl.javaeye.com/blog/82480</link>
        <guid>http://michael-zhl.javaeye.com/blog/82480</guid>
      </item>
      <item>
        <title>映射对象标识符</title>
        <author>Michael.zhl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://michael-zhl.javaeye.com">Michael.zhl</a>&nbsp;
          链接：<a href="http://michael-zhl.javaeye.com/blog/82481" style="color:red;">http://michael-zhl.javaeye.com/blog/82481</a>&nbsp;
          发表时间: 2007年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="2">Hibernate采用对象标识符,也就是通常我们所说的OID来创建对象和数据库表里记录的对应关系,对象的OID和表里的主键对应,所以说OID是非常重要的,不应该让程序来给它赋值.数据库区分同一表的不同记录是用主键来区分.数据库中的主键最重要的3个基本要素就是不允许为null,不允许有重复值,主键永远不会改变.所以通常我们设计表都会设计主键的值为自动增加,没有业务逻辑含义的一组数字,当然针对每个数据库,设置的方法也不同.但是都非常简单.加一个属性就可以了.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;而JAVA区分同一类的不同对象是用内存地址,在JAVA语言中判断两个对象的引用变量是否想相等,有以下两种比较方式.1)用运算符"=="比较内存地址,此外还可以用Object的equals方法也是按内存地址比较.2)比较两个对象的值是否相同,JAVA中的一些覆盖了Object类的equals方法实现比较合适.例如String和Date类,还有JAVA包装类.如果是String.equals(String)这种方式的比较就是比较这两个String的值的.如果是Object原是的equals方法就是比较地址了.这点很容易混淆.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通常,为了包装Hibernate的OID的唯一性和不可变性,由Hibernate或者底层数据库来给OID赋值比较合理.因此我们在编程的时候最好把持久化类的OID设置为private或者protected类型,这样可以防止JAVA程序随便更改OID.而OID的get方法我们还是要设置为public类型,这样方便我们读取. 在对象-关系映射文件里的&lt;id元素是用来设置对象标识符OID的.type通常设置为long.而&lt;generator子元素用来设置OID的标识符生成器,Hibernate提供了标识符生成器的接口net.sf.hibernate.id.IdentifierGenerator接口,并且提供了N多中内置的实现,和对应的缩写.我们只要把这些实现类的类名或者所写设置在&lt;generator子元素的class属性中,就能完成OID的配置了.具体的内置标识符生成器如下:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1)increment 代理主键,hibernate自动以递增的方式来生成标识符,每次增加1.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2)identity 代理主键,由底层数据库生成标识符,前提就是底层的数据库支持自动增长的类型.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3)sequence 代理主键,hibernate根据底层数据库生成的标识符,前提是底层数据库支持序列<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4)hilo 代理主键,hibernate根据higg/low算法来生成的标识符,把特定表的字段作为high的值,默认选用hibernate_unique_key表的next_hi字段<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5)native 代理主键,根据底层数据库对自动生成标识符的支持能力,还选择identity,sequence,或hilo.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6)uuid.hex 代理主键,hibernate采用128位的UUID算法生成标识符,UUID算法能够在网络环境下生成唯一字符串标识符.不过字符串要比数据占用的空间多的多.所以不流行使用.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7)assigned 适用于自然主键,由JAVA应用程序负责生成标识符,为了能让JAVA设置OID.不能吧setId方法设置为非公共类型了,这种方式也尽量避免使用.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里个人觉得第一种方式,也就是说由Hibernate来生成对象标识符的方式比较好.但是这种方式的缺点是只能一个Hibernate对应一个数据库的表.当同时创建了SeesionFactory实例的时候.两个或者更多的Hibernate对应同一个数据库的时候就会插入出错.这个时候我们可以选择第二种方式把标识符的生成工作交给底层数据库.还有一个小知识点要注意就是OID必须定义为long,int,short类型,如果定义为byte会报异常,这里推荐用long.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;总结一下,这7中生成OID标识符的方法,increment 比较常用,把标识符生成的权力交给Hibernate处理.但是当同时多个Hibernate应用操作同一个数据库,甚至同一张表的时候.就推荐使用identity 依赖底层数据库实现,但是数据库必须支持自动增长,sequence 以来底层数据库实现,但是数据库必须支持系列.hilo 根据特定的表实现.这三种方式了.当然针对不同的数据库选择不同的方法.如果你不能确定你使用的数据库具体支持什么的情况下.可以选择第三种.或者用native 让Hibernate来帮选择identity,sequence,或hilo.后边的自然主键不推荐使用,因为自然主键就是具有业务含义的主键,在现在的软件开发结构中,已经很少有人用了.下面总结一下几种常用数据库,可以使用的标识符类型.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MySQL:identity数据库底层实现,需要支持自动增长,increment由Hibernate实现,hilo用特定的表实现,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MSSQL:identity数据库底层实现,需要支持自动增长,increment由Hibernate实现,hilo用特定的表实现,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Oracle:sequence数据库底层实现,需要支持序列,increment由Hibernate实现,hilo用特定的表实现,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以上不难发现,所有的数据库都支持Hibernate用increment实现OID的生成,MYSQL和MSSQL数据库底层实现支持自动增长,而Oracle支持序列,还有用特殊表的实现方式这三个数据库都支持.还有一种实现方式适用于所有的数据库,就是native,由Hibernate去选择使用什么样的方式来生成IOD对象标识符,这种方式也是跨平台的.下面是各种设置方式的例子*.hbm.xml文件四个.例题来源孙MM的&lt;&lt;精通Hibernate&gt;&gt;一书.我非常喜欢这本书,讲的非常简单明了.感兴趣的朋友可以去买一本看看(当当打7.3折哦).<br />&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping<br />PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"<br />"<a href="http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd</a>"&gt;<br />&lt;hibernate-mapping&gt;</font></p>
<p><font size="2">&nbsp; &lt;class name="mypack.HiloTester"&nbsp; table="HILO_TESTER"&gt;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;id name="id" type="long" column="ID"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;generator class="hilo"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="table"&gt;hi_value&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="column"&gt;next_value&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="max_lo"&gt;100&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/generator&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/id&gt;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp; &lt;property name="name" type="string" &gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="name" length="15" /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp; &lt;/class&gt;<br />&nbsp;<br />&lt;/hibernate-mapping&gt;</font></p>
<p><font size="2">&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping<br />PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"<br />"<a href="http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd</a>"&gt;<br />&lt;hibernate-mapping&gt;</font></p>
<p><font size="2">&nbsp; &lt;class name="mypack.IdentityTester"&nbsp; table="IDENTITY_TESTER"&gt;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;id name="id" type="long" column="ID"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="identity"/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/id&gt;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp; &lt;property name="name" type="string" &gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="name" length="15"/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp; &lt;/class&gt;<br />&nbsp;<br />&lt;/hibernate-mapping&gt;</font></p>
<p><font size="2">&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping<br />PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"<br />"<a href="http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd</a>"&gt;<br />&lt;hibernate-mapping&gt;</font></p>
<p><font size="2">&nbsp; &lt;class name="mypack.NativeTester" table="NATIVE_TESTER" &gt;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;id name="id" type="long" column="ID"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="native"/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/id&gt;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp; &lt;property name="name" type="string" &gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="name" length="15" /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp; &lt;/class&gt;<br />&nbsp;<br />&lt;/hibernate-mapping&gt;</font></p>
<p><font size="2">&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping<br />PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"<br />"<a href="http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd</a>"&gt;<br />&lt;hibernate-mapping&gt;</font></p>
<p><font size="2">&nbsp; &lt;class name="mypack.IncrementTester" table="INCREMENT_TESTER" &gt;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;id name="id" type="long" column="ID"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;meta attribute="scope-set"&gt;private&lt;/meta&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="increment"/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/id&gt;</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp; &lt;property name="name" type="string" &gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="NAME" length="15" /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp; <br />&nbsp; &lt;/class&gt;<br />&nbsp;<br />&lt;/hibernate-mapping&gt;</font></p>
<img src="http://www.blogjava.net/action/aggbug/119134.html" height="1" width="1" /><br /><br /><div align="right"><a href="http://www.blogjava.net/action/" target="_blank" style="text-decoration:none;">我心依旧</a> 2007-05-22 15:05 <a href="http://www.blogjava.net/action/archive/2007/05/22/119134.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://michael-zhl.javaeye.com/blog/82481#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 May 2007 07:05:00 +0800</pubDate>
        <link>http://michael-zhl.javaeye.com/blog/82481</link>
        <guid>http://michael-zhl.javaeye.com/blog/82481</guid>
      </item>
      <item>
        <title>Hibernate ORM 对象-关系 映射</title>
        <author>Michael.zhl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://michael-zhl.javaeye.com">Michael.zhl</a>&nbsp;
          链接：<a href="http://michael-zhl.javaeye.com/blog/82482" style="color:red;">http://michael-zhl.javaeye.com/blog/82482</a>&nbsp;
          发表时间: 2007年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate的持久化类使用的是JavaBean的风格,为要被访问的属性提供了一套get和set方法,这两个方法也叫做持久化类的访问方法.记得曾经在接触JavaBean的时候我很迷糊,总觉得提供这两个方法,倒不如把Bean的属性设置public,然后直接调用对象.属性,这样来的方便.但是后来,有一个这样的需求,就是一个人名字可以被查看,但是不可以修改.这个时候如果用set方法的话,只需要把set方法的修饰符换为private就OK了.如果是用对象.属性的形式调用就麻烦了.而且最重要的一个有点是JavaBean的风格可以简化Hibernate通过JAVA反射机制来获得持久化类的访问方法的过程,至于JAVA的反射机制我也是了解一些皮毛.据说很深奥.有兴趣的朋友可以Google一下.有一点值得注意,就是JAVA应用程序不能访问JavaBean持久化类的private类型的get,set方法.而Hibernate没有这个限制,可以访问所有的级别.包括private default,protected,public.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java有8种基本类型:byte,short,char,int,long,float,double,boolean,还有8种与之对应的包装类型,Byte,Short,Character,Integer,Long,Float,Double,Boolean包装类型就是把基本类型包装成对象的意思.基本类型于包装类型之间可以方便的转换,例如:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer ie = new Integer(i);//基本类型转换成包装类型<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = ie.intValue();//包装类型转化成基本类型<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意,直接转换也是可以的.例如i = ie; JAVA会自动把包装类型转换成基本类型.或者ie = i; JAVA会自动把基本类型转换成包装类型.在持久化类中,既可以把属性定义为基本类型,也可以定义为包装类型,他们对应的Hibernate映射类型int和Integer都对应int类型,这个表示不是很明显,在用JAVA对象类型字符串举例String,数据库是varhcar(50),在hibernate的*.hbm.xml映射文件里一律写为string.其实使用基本类型或者包装类型来定义持久化类中的属性是各有优缺点的.基本类型就是使用方便,简单,在需要数字运算的时候直接可以运算.而包装类型就要麻烦的先转换成基本类型,然后在进行运算,但是包装类型的优点在于能表达null值,每一个包装类型的对象创建的时候默认值都是null类型的.而基本类型是不可以表达null的,它们的默认值是0.为什么要表达null值呢.因为SQL中.所有类型的数据,默认值都是null的.当进入insert的时候,没有复值的属性,默认值就是null,所以说JAVA的包装类型和数据库之间的对应关系更直接.这里建议Hibernate的OID设置为包装类型,其他的属性就根据业务需要和个人习惯来定吧.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate在初始化阶段会根据映射文件的信息,为所有的持久化类预定义insert语句,update语句where ID,delete语句where ID,select语句where ID,这里所说的语句就是标准的SQL增,删,改,查.语句,参数用?代表JDBC PreparedStatement中的参数,这里就不举例了.这些SQL语句都存放在SessionFactory的缓存中,当执行Session的save(),update(),delete(),load()方法时,将会从SessionFactory的缓存中读取这些预定义的SQL语句,在把具体的参数值绑定到SQL语句中,这就是Hibernate的基本原理.在默认的情况下这些语句表达的是所有的字段.当然Hibernate还允许我们在映射文件里控制insert和update语句的内容.比如在映射文件中&lt;property 元素中的update属性设置成为false,那么这个字段,将不被包括在基本的update语句中,修改的时候,将不包括这个字段了.insert同理.dynamic动态SQL语句的配置也是很常用的.下面介绍配置SQL语句的具体属性:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1)&lt;property&gt;元素 insert属性:设置为false,在insert语句中不包含这个字段,表示永远不会被插入,默认true<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2)&lt;property&gt;元素 update属性:设置为false,在update语句中不包含这个字段,表示永远不会被修改,默认true<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3)&lt;class&gt;元素 mutable属性:设置为false就是把所有的&lt;property&gt;元素的update属性设置为了false,说明这个对象不会被更新,默认true<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4)&lt;property&gt;元素 dynamic-insert属性:设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5)&lt;property&gt;元素 dynamic-update属性,设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中,默认false<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6)&lt;class&gt;元素 dynamic-insert属性:设置为true,表示把所有的&lt;property&gt;元素的dynamic-insert属性设置为true,默认false<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7)&lt;class&gt;元素 dynamic-update属性:设置为true,表示把所有的&lt;property&gt;元素的dynamic-update属性设置为true,默认false<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate生成动态SQL语句的消耗的系统资源(比如CPU,内存等)是很小的,所以不会影响到系统的性能,如果表中包含N多字段,建议把dynamic-update属性和insert属性设置为true,这样在插入和修改数据的时候,语句中只包括要插入或者修改的字段.可以节省SQL语句的执行时间,提高程序的运行效率.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></p>
<img src="http://www.blogjava.net/action/aggbug/118886.html" height="1" width="1" /><br /><br /><div align="right"><a href="http://www.blogjava.net/action/" target="_blank" style="text-decoration:none;">我心依旧</a> 2007-05-21 15:21 <a href="http://www.blogjava.net/action/archive/2007/05/21/118886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://michael-zhl.javaeye.com/blog/82482#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 May 2007 07:21:00 +0800</pubDate>
        <link>http://michael-zhl.javaeye.com/blog/82482</link>
        <guid>http://michael-zhl.javaeye.com/blog/82482</guid>
      </item>
      <item>
        <title>Hibernate Tool: hbm2java or hbm2ddl</title>
        <author>Michael.zhl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://michael-zhl.javaeye.com">Michael.zhl</a>&nbsp;
          链接：<a href="http://michael-zhl.javaeye.com/blog/82483" style="color:red;">http://michael-zhl.javaeye.com/blog/82483</a>&nbsp;
          发表时间: 2007年05月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate为了简化开发,给我们提供了四种工具,hbm2java,hbm2ddl,XDoclet,Middlegen.其中我觉得hbm2java(根据映射文件生成JAVA源文件),hbm2ddl(根据映射文件生成数据库文件,这两个工具非常实用.还有XDoclet(根据带有XDoclet标记的JAVA源文件生成映射文件).Middlegen(根据数据库文件生成映射文件的工具也不错.不过我没怎么使用过.所以这里就不多说了.好了下面我们创建一个对象-关系映射文件,来演示一下这两种工具的使用方法.首先创建我们的XML映射文件.这里命名为Demo.hbm.xml<br /><br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "hibernate-mapping-2.0.dtd" &gt;<br />&lt;hibernate-mapping&gt;<br />&nbsp;&lt;class name="hibernate.Demo" table="DEMOS"&gt;<br />&nbsp;&nbsp;&lt;meta attribute="class-description"&gt;ToolDemo&lt;/meta&gt;<br />&nbsp;&nbsp;&lt;meta attribute="class-scope"&gt;public&lt;/meta&gt;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&lt;id name="id" type="long" column="ID"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;meta attribute="scope-set"&gt;protected&lt;/meta&gt;<br />&nbsp;&nbsp;&nbsp;&lt;generator class="native"/&gt;<br />&nbsp;&nbsp;&lt;/id&gt;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&lt;property name="name" type="string"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;meta attribute="finder-method"&gt;findByName&lt;/meta&gt;<br />&nbsp;&nbsp;&nbsp;&lt;meta attribute="use-in-tostring"&gt;true&lt;/meta&gt;<br />&nbsp;&nbsp;&nbsp;&lt;column name="NAME" length="15" not-null="true" unique="true"/&gt;<br />&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&lt;property name="registeredTime" type="timestamp"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;meta attribute="field-description"&gt;When the Demo&lt;/meta&gt;<br />&nbsp;&nbsp;&nbsp;&lt;meta attribute="use-in-tostring"&gt;true&lt;/meta&gt;<br />&nbsp;&nbsp;&nbsp;&lt;column name="REGISTERED_TIME" index="IDX_REGISTERED_TIME" sql-type="timestamp"/&gt;<br />&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&lt;property name="age" type="int"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;meta attribute="field-description"&gt;How old is the Demo&lt;/meta&gt;<br />&nbsp;&nbsp;&nbsp;&lt;meta attribute="use-in-tostring"&gt;true&lt;/meta&gt;<br />&nbsp;&nbsp;&nbsp;&lt;column name="AGE" check="AGE&gt;10" not-null="true"/&gt;<br />&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&lt;property name="sex" column="SEX" type="char"&gt;&lt;/property&gt;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&lt;property name="married" type="boolean" column="IS_MARRIED"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;meta attribute="field-description"&gt;Is the Demo married&lt;/meta&gt;<br />&nbsp;&nbsp;&nbsp;&lt;meta attribute="use-in-tostring"&gt;true&lt;/meta&gt;<br />&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&lt;property name="description" type="string"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;meta attribute="use-in-tostring"&gt;true&lt;/meta&gt;<br />&nbsp;&nbsp;&nbsp;&lt;column name="DESCRIPTION" sql-type="text"/&gt;&nbsp;<br />&nbsp;&nbsp;&lt;/property&gt;<br />&nbsp;&lt;/class&gt;<br />&lt;/hibernate-mapping&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解释下上面的XML文件,这里主要说明是的&lt;meta&gt;元素,用于精确的控制JAVA源文件的内容.<br />&nbsp;&nbsp;&lt;meta attribute="class-description"&gt;ToolDemo&lt;/meta&gt;这里是源文件类的注释,用于生成javadoc<br />&nbsp;&nbsp;&lt;meta attribute="class-scope"&gt;public&lt;/meta&gt;这个是类的修饰符<br />&nbsp; &lt;meta attribute="extends"&gt;hibernate.Tool&lt;/meta&gt;这里声明这个类继承于哪个类,这里是继承hibernate包下的Tool类<br />&nbsp;&nbsp;&nbsp;&lt;meta attribute="field-description"&gt;Is the Demo married&lt;/meta&gt;这个也是注释,是属性的注释,用于生成javadoc<br />&nbsp;&nbsp;&nbsp;&lt;meta attribute="use-in-tostring"&gt;true&lt;/meta&gt;这个是指定在类的toString()方法返回的字符串是否包含这个属性.<br />&nbsp;&nbsp;&nbsp;&lt;meta attribute="scope-set"&gt;protected&lt;/meta&gt;指定类的属性的get或set方法的修饰符,包括static public final privete等等<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;下面列出&lt;meta&gt;元素的所有属性的用法<br />&nbsp;&nbsp;&nbsp;class-description指定类的注释,javadoc<br />&nbsp;&nbsp;&nbsp;field-description指定类的属性的注释,javadoc<br />&nbsp;&nbsp;&nbsp;interface如果是true表示生成的就接口,不是类,默认是false<br />&nbsp;&nbsp;&nbsp;implements指定类要实现的接口<br />&nbsp;&nbsp;&nbsp;extends指定类要继承的类&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;generated-class重新生成类名<br />&nbsp;&nbsp;&nbsp;scope-class指定类的修饰复,默认的是public<br />&nbsp;&nbsp;&nbsp;scope-set设置set方法的修饰复,默认public<br />&nbsp;&nbsp;&nbsp;scope-get设置get方法的修饰复,默认public<br />&nbsp;&nbsp;&nbsp;scope-field设定类的属性的修饰复,默认public<br />&nbsp;&nbsp;&nbsp;use-in-tostring如果是true表示在类的toString()方法中包含这个属性<br />&nbsp;&nbsp;&nbsp;gen-property如果是false表示不会在类中生成这个属性,默认是true<br />&nbsp;&nbsp;&nbsp;finder-method设定find方法名<br /><br />&nbsp;&nbsp;&nbsp;下面列出&lt;column&gt;元素的所有属性和用法<br />&nbsp;&nbsp;&nbsp;name设置表字段的名字<br />&nbsp;&nbsp;&nbsp;length设置表字段的长度<br />&nbsp;&nbsp;&nbsp;not-null如果是true说明字段不可以为null,默认是false<br />&nbsp;&nbsp;&nbsp;unique如果是true,设置字段唯一性约束,默认是false<br />&nbsp;&nbsp;&nbsp;index给一个字段或者多个字段建立索引<br />&nbsp;&nbsp;&nbsp;unique-key为多个字段设置唯一约束<br />&nbsp;&nbsp;&nbsp;freign-key为外键约束命名<br />&nbsp;&nbsp;&nbsp;sql-type设定字段的SQL类型<br />&nbsp;&nbsp;&nbsp;check设定SQL检查约束<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;基础知识就以上这些,记住就OK了hbm2ddl位于Hibernate软件包中,而hbm2java工具位于Hibernate的扩展包中,真不理解Hibernate为什么这么搞,弄的好是麻烦,一起用的两个工具要分开放在两个包里哎,好了废话不说,在<a href="http://www.hibernate.org/">www.hibernate.org</a>上可以下载到单独的Hibernate扩展包,hibernate-tools.jar放到我们的classpath下,然后创建build.xml用ant来运行这两个工具就OK了.非常方便.有时间在把ANT的详细使用方法发布到我的BLOG上.<br /></font>
<img src="http://www.blogjava.net/action/aggbug/118129.html" height="1" width="1" /><br /><br /><div align="right"><a href="http://www.blogjava.net/action/" target="_blank" style="text-decoration:none;">我心依旧</a> 2007-05-17 16:47 <a href="http://www.blogjava.net/action/archive/2007/05/17/118129.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://michael-zhl.javaeye.com/blog/82483#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 17 May 2007 08:47:00 +0800</pubDate>
        <link>http://michael-zhl.javaeye.com/blog/82483</link>
        <guid>http://michael-zhl.javaeye.com/blog/82483</guid>
      </item>
      <item>
        <title>Hibernate基础知识</title>
        <author>Michael.zhl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://michael-zhl.javaeye.com">Michael.zhl</a>&nbsp;
          链接：<a href="http://michael-zhl.javaeye.com/blog/82484" style="color:red;">http://michael-zhl.javaeye.com/blog/82484</a>&nbsp;
          发表时间: 2007年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font size="2">Hibernate基础知识,谈到这里,首先最重要的是应该理解ORM,ORM是什么呢?3个单词的缩写,Object-Relation Mapping,既对象-关系映射的意思.这是一种模式,这种模式在单个组件中负责说有实例业务对象的持久化,封装了数据库访问的细节,这就是Hibernate的核心原理.ORC解决主要的问题就是对象-关系映射.因为项目的业务逻辑模型是面向对象的,而关系型数据模型是面向关系的,所以Hibernate把一个持久化的类和数据库中的一张表对应,类的每一个实例对应这个表的一条记录.类的每一个属性,对应这表里的一个字段.这样就把一个对象和一个关系型数据表映射在了一起,这就是ORM模式.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Hibernate开发的文档里,把Hibernate定义成了一种对JDBC做了轻量级封装的对象-关系映射工具.所谓轻量级封装就是指没有完全的把JDBC封装,我们的程序还可以绕过Hibernate层直接访问数据库.下面是Hbernate的几个接口,其中前5个是核心接口,后3个是回调接口.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1)Configuration:配置Hibernate,启动Hibernate,创建SessionFactory工厂对象.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2)SessionFactory:初始化Hibernate,创建Session对象.它是线程安全的,就是说可以多个线程共同操作这个对象,而且是重量级的,在缓存中存储的大量的SQL语句和映射元素数据.所以这个对象我们不能轻易的创建和销毁,一个数据库创建一个SessionFactor工厂对象.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3)Session:负责保存,修改,删除,查询和加载对象.这个Sessin不是线程安全的,所以我们要避免多个线程共享一个Session,这个Session是轻量级的,就是说创建和销毁这个Session不需要消耗太多的系统资源.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4)Transaction:事务管理.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5)Query:执行数据库查询.Query接口包装了一个HQL语句,和SQL语句很相似,但是HQL语句是面向对象的,它引用类名和属性名,而不是表明和字段名.还有一个接口Criteria完全封装了基于字符串形式的查询语句,比Query接口更加面向对象,擅长动态的查询.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6)Lifecycle:持久化类实现的接口,让它的实例能响应被加载,保存,删除的事件.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7)Validatable:让持久化类的实例保存之前进行数据的验证,不过这个不推荐使用,因为数据验证是业务逻辑层的事情,而且这种方式强迫持久化类必须实现Hibernate的特定接口,会影响持久化类的可移植性,因此不推荐使用.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8)Interceptor:Interceptor的实现类负责响应持久化类的实例被加载,保存,删除,更新等事件.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;还有一个比较重要的接口Type映射类型接口,用于把对象中的属性,映射为数据库中的字段.Type接口提供了各种实现的类.他们代表了Hibernate的映射类型.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1)PrimitiveType类:原始映射类型,映射了JAVA的基本类型.包括ByteType,ShortTyep,IntegerType,LongType,DoubleType,CharacterType,BooleanTyep<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2)DateType类:映射了JAVA的日期类型.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3)BinaryType类:映射了Byte[]数字类型.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里,我们的应用程序不必自己创建Type实例,而是通过Hibernate这个类,访问它的静态Type实例.例如Hibernate.STRING的形式访问StringType实例.还可以实现UserType或者CompositeUserType这两个接口,来定义用户自己的映射类型.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;还有一类接口是可扩展接口,比如Hibernate的方言抽象类,指定缓存机制的Cache接口等等.这些因为我一直也没用到过所以就不在这里说明了.想了解它的朋友可以查阅相关的资料.</font>
<img src="http://www.blogjava.net/action/aggbug/117849.html" height="1" width="1" /><br /><br /><div align="right"><a href="http://www.blogjava.net/action/" target="_blank" style="text-decoration:none;">我心依旧</a> 2007-05-16 15:10 <a href="http://www.blogjava.net/action/archive/2007/05/16/117849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://michael-zhl.javaeye.com/blog/82484#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 May 2007 07:10:00 +0800</pubDate>
        <link>http://michael-zhl.javaeye.com/blog/82484</link>
        <guid>http://michael-zhl.javaeye.com/blog/82484</guid>
      </item>
      <item>
        <title>&quot;冬天&quot;快乐,带你进入Hibernate</title>
        <author>Michael.zhl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://michael-zhl.javaeye.com">Michael.zhl</a>&nbsp;
          链接：<a href="http://michael-zhl.javaeye.com/blog/82485" style="color:red;">http://michael-zhl.javaeye.com/blog/82485</a>&nbsp;
          发表时间: 2007年05月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="2"><font color="#c60a00">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;冬眠</font>温暖,"冬天"快乐,一夜的冬雨在静静中把冬衣轻轻换上,Hibernate,就东面一样,在程序"冬天"里给我们带来一丝温暖,Hibernate的名字真的很优美,当我曾经第一天知道有一种技术叫"<font color="#c60a00">冬眠</font><font color="#000000">".我就深深的喜欢上了这种技术.所以产生了一种想法,把这种技术以最简单明了的方式记录自己的Blog上,一方面能帮助一些刚刚学习它的朋友,另一方面也能让自己对Hibernate的理解更加深刻.希望大家多多支持我,多光临我的Blog.好了下面言归正传,Hibernate是JAVA应用和关系型数据库中间的一座桥梁.它负责把JAVA对象和关系型数据库映射在一起,其实简单的理解Hibernate可以理解成一种中间件,向下封装了JDBC对数据库的操作,向上提供了面向对象的数据库访问API.今天我们不谈理论,往往学习一种技术进来就谈一些很深的理论会让人学的晕头转向,我的学习方式向来都是先搞定一个简单明了的小例子,然后在回头看理论,到时候总能有事半功倍的感觉.简单的说一下Hibernate的流程:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1)创建Hibernate配置文件<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2)创建持久化类<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3)创建对象和关系型数据库的映射文件<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4)通过Hibernate的API访问数据库<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好了.既然流程知道了.我们就一步一步来做吧,首先创建一个JAVA工程(JAVA工程和WEB工程相比,更加简单直观),然后我们引入必须要有的包,hibernate2包,log4j的包,dom4j的包,MSSQL的3个驱动包,然后创建Hibernate的配置文件,和其他的properties一样,都是以键=值的形式表示的.当然你也可以选择用XML的形式来创建hibernate的配置文件,这里用properties方式做演示,名字叫hibernate.properties.为了理解起来容易些,我们使用最简单的数据库MS SQL Server 2000:<br /><br />首先要设置方言,方言的意思就是不同的数据库,有不同的语言规范,就跟我们现实中的北京话于广东话的差距一样.<br />hibernate.dialect=net.sf.hibernate.dialect.SQLServerDialect<br />然后设置数据库的驱动类.<br />hibernate.connection.driver_class=com.microsoft.jdbc.sqlserver.SQLServerDriver<br />设置数据库的路径<br />hibernate.connection.url=jdbc:sqlserver://127.0.0.1:1433;charset=GBK;selectMethod=cursor;databaseName=TEMPDB<br />数据库登录名<br />hibernate.connection.username=sa<br />数据库密码<br />hibernate.connection.password=555<br />最后设置的属性是是否在控制台打印SQL语句,这里我们设置为true,因为方便调试,默认是false<br />hibernate.show_sql=true<br />备注:在Hibernate软件包的etc目录下,有一个hibernate.properties文件,里边有各种关系型数据库的配置样例.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OK,配置文件创建完了.就是这么简单,现在我们来创建一个持久化类.其实说白了持久化类超级简单,就是我们曾经用的JAVABEAN嘛,写几个字段Eclipse都能自动生成相关的方法,不过Hibernate的持久化类要 implements一个接口,就是Sreializable接口.下面是持久化类的例子,这里省略了大多数的get,set方法,到时候自己加上就OK了.<br />public class Customer implements Serializable {<br />&nbsp; private Long id;<br />&nbsp; private String name;<br />&nbsp; private String email;<br />&nbsp; private String password;<br />&nbsp; private int phone;<br />&nbsp; public Long getId(){<br />&nbsp;&nbsp;&nbsp; return id;<br />&nbsp; }<br /></font></font><font size="2"><font color="#000000">&nbsp; public void setId(Long id){<br />&nbsp;&nbsp;&nbsp; this.id = id;<br />&nbsp; }<br />&nbsp; ........<br />}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OK持久化类也一样简单,下面我们要做的事情更简单,就是到我们的数据库中,创建一个和持久化类字段对应的表.例子如下:<br />create database TEMPDB;<br /><br />create table CUSTOMERS (<br />&nbsp; ID bigint not null primary key,<br />&nbsp; NAME varchar(15) not null,<br />&nbsp; EMAIL varchar(128) not null,<br />&nbsp; PASSWORD varchar(8) not null,&nbsp; <br />&nbsp; PHONE&nbsp; int<br />)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据库搞定了.下面来完成一件比较重要的事情,就是创建对象-关系映射文件.,Hibernate采用XML格式的文件来指定对象和关系型数据库之间的映射,在运行的时候Hibernate将根据这个映射文件来生成各种SQL语句.下面我们创建一个Customer.hbm.xml的文件,这个文件和Customer.class放在同一个目录下.<br />&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"<br />"<a href="http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd</a>"&gt;<br /></font></font><font size="2"><font color="#000000">&lt;hibernate-mapping&gt;<br />&nbsp; &lt;class name="com.Customer" table="CUSTOMERS"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;id name="id" column="ID" type="long"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator class="increment"/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/id&gt;<br />&nbsp;&nbsp;&nbsp; &lt;property name="name"&nbsp; column="NAME"&nbsp; type="string" not-null="true" /&gt;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;property name="email"&nbsp;&nbsp;&nbsp;&nbsp; column="EMAIL"&nbsp;&nbsp;&nbsp;&nbsp; type="string" not-null="true" /&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="password"&nbsp; column="PASSWORD"&nbsp; type="string" not-null="true"/&gt; <br />&nbsp;&nbsp;&nbsp; &lt;property name="phone"&nbsp;&nbsp;&nbsp;&nbsp; column="PHONE"&nbsp;&nbsp;&nbsp;&nbsp; type="int" /&gt;&nbsp;<br /></font></font><font size="2"><font color="#000000">&nbsp; &lt;/class&gt;<br /></font></font><font size="2"><font color="#000000">&lt;/hibernate-mapping&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先&lt;class 标签的name属性指定的是类名,table属性指定的和这个类映射的表名.&lt;id 标签的&lt;generator 子标签指定对象标识符生成器,他负责在对象里产生表的唯一标识符.&lt;property标签的name属性指定持久化类中属性的名字,clumn属性顾名思义,列的意思,这里是指定了数据库中的字段.type属性指定Hibernate的映射类型,Hibernate映射类型是JAVA类型和SQL类型之间的桥梁,先简单的知道JAVA里的String和数据库里的varchar这里配置为string,而JAVA里的int和数据库里的int配置为int.还有N多我们以后深入使用Hibernate的时候在深入的了解就OK了.现在知道简单的足以.最后说一下&lt;property标签的not-null属性是设置这个字段是否为空.值得我们关注的是,在实际的项目开发中,我们不应该以来Hibernate或者数据库来做数据的验证.全部在业务罗基层处理好就OK了.下面说一下Hibernate采用XML文件来配置对象-关系映射的优点:<br />&nbsp;&nbsp;&nbsp;1)Hibernate既不会渗透到上层的业务模型中,也不会泄漏到下层的数据模型中<br />&nbsp;&nbsp;&nbsp;2)软件开发人员可以独立设计业务模型,数据库设计人员可以独立设计数据模型,互相不受拘束.<br />&nbsp;&nbsp;&nbsp;2)对象-关系映射不依赖于任何代码,提高了程序的灵活性,使得维护更加方便.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里说一下映射文件的类型定义DTD,在我们的Customer.hbm.xml中,文件开头就声明了DTD类型,DTD的意思就是对XML文件的语法做定义,在实际编程中,我们引入正确的DTD规范,让我们编写XML非常方便.每一种XML文件都有独自的DTD文件.Hibernate的DTD文件下载地址是:<a href="http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd</a>,在Hibernate的软件包src\net\sf\hibernate目录下也提供了<font color="#002c99">hibernate-mapping-2.0.dtd文件.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">下面看一个重点吧,通过Hibernate的API操作数据库:<br />public class BusinessService{<br />&nbsp; public static SessionFactory sessionFactory;<br />&nbsp; static{<br />&nbsp;&nbsp;&nbsp; try{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create a configuration based on the properties file we've put<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // in the standard place.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration config = new Configuration();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.addClass(Customer.class);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get the session factory we can use for persistence<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessionFactory = config.buildSessionFactory();<br />&nbsp;&nbsp;&nbsp; }catch(Exception e){e.printStackTrace();}<br />&nbsp; }</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">&nbsp; public void findAllCustomers(ServletContext context,OutputStream out) throws Exception{<br />&nbsp;&nbsp;&nbsp; // Ask for a session using the JDBC information we've configured<br />&nbsp;&nbsp;&nbsp; Session session = sessionFactory.openSession();<br />&nbsp;&nbsp;&nbsp; Transaction tx = null;<br />&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx = session.beginTransaction();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List customers=session.find("from Customer as c order by c.name asc");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator it = customers.iterator(); it.hasNext();) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printCustomer(context,out,(Customer) it.next());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // We're done; make our changes permanent<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx.commit();</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">&nbsp;&nbsp;&nbsp; }catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tx != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Something went wrong; discard all partial changes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx.rollback();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw e;<br />&nbsp;&nbsp;&nbsp; } finally {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // No matter what, close the session<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.close();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }<br />&nbsp; public void saveCustomer(Customer customer) throws Exception{<br />&nbsp; &nbsp;&nbsp; // Ask for a session using the JDBC information we've configured<br />&nbsp;&nbsp;&nbsp; Session session = sessionFactory.openSession();<br />&nbsp;&nbsp;&nbsp; Transaction tx = null;<br />&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx = session.beginTransaction();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.save(customer);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // We're done; make our changes permanent<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx.commit();</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">&nbsp;&nbsp;&nbsp; }catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tx != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Something went wrong; discard all partial changes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx.rollback();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw e;<br />&nbsp;&nbsp;&nbsp; } finally {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // No matter what, close the session<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.close();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">&nbsp; public void loadAndUpdateCustomer(Long customer_id,String address) throws Exception{<br />&nbsp;&nbsp;&nbsp; // Ask for a session using the JDBC information we've configured<br />&nbsp;&nbsp;&nbsp; Session session = sessionFactory.openSession();<br />&nbsp;&nbsp;&nbsp; Transaction tx = null;<br />&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx = session.beginTransaction();</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Customer c=(Customer)session.load(Customer.class,customer_id);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.setAddress(address);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // We're done; make our changes permanent<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx.commit();</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">&nbsp;&nbsp;&nbsp; }catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tx != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Something went wrong; discard all partial changes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx.rollback();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw e;<br />&nbsp;&nbsp;&nbsp; } finally {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // No matter what, close the session<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.close();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }<br />&nbsp; public void deleteAllCustomers() throws Exception{<br />&nbsp;&nbsp;&nbsp; // Ask for a session using the JDBC information we've configured<br />&nbsp;&nbsp;&nbsp; Session session = sessionFactory.openSession();<br />&nbsp;&nbsp;&nbsp; Transaction tx = null;<br />&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx = session.beginTransaction();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.delete("from Customer as c");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // We're done; make our changes permanent<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx.commit();</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">&nbsp;&nbsp;&nbsp; }catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tx != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Something went wrong; discard all partial changes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx.rollback();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw e;<br />&nbsp;&nbsp;&nbsp; } finally {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // No matter what, close the session<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.close();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp; }</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">&nbsp; private void printCustomer(ServletContext context,OutputStream out,Customer customer)throws Exception{<br />&nbsp; &nbsp;if(out instanceof ServletOutputStream)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printCustomer(context,(ServletOutputStream) out,customer);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printCustomer((PrintStream) out,customer);<br />&nbsp; }<br />&nbsp; private void printCustomer(PrintStream out,Customer customer)throws Exception{<br />&nbsp;&nbsp; //save photo<br />&nbsp;&nbsp;&nbsp; byte[] buffer=customer.getImage();<br />&nbsp;&nbsp;&nbsp; FileOutputStream fout=new FileOutputStream("photo_copy.gif");<br />&nbsp;&nbsp;&nbsp; fout.write(buffer);<br />&nbsp;&nbsp;&nbsp; fout.close();</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">&nbsp;&nbsp;&nbsp; out.println("------以下是"+customer.getName()+"的个人信息------");<br />&nbsp;&nbsp;&nbsp; out.println("ID: "+customer.getId());<br />&nbsp;&nbsp;&nbsp; out.println("口令: "+customer.getPassword());<br />&nbsp;&nbsp;&nbsp; out.println("E-Mail: "+customer.getEmail());<br />&nbsp;&nbsp;&nbsp; out.println("电话: "+customer.getPhone());</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">&nbsp; }<br />&nbsp; private void printCustomer(ServletContext context,ServletOutputStream out,Customer customer)throws Exception{<br />&nbsp;&nbsp;&nbsp; //save photo<br />&nbsp;&nbsp;&nbsp; byte[] buffer=customer.getImage();<br />&nbsp;&nbsp;&nbsp; String path=context.getRealPath("/");<br />&nbsp;&nbsp;&nbsp; FileOutputStream fout=new FileOutputStream(path+"photo_copy.gif");<br />&nbsp;&nbsp;&nbsp; fout.write(buffer);<br />&nbsp;&nbsp;&nbsp; fout.close();</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">&nbsp;&nbsp;&nbsp; out.println("------以下是"+customer.getName()+"的个人信息------"+"&lt;br&gt;");<br />&nbsp;&nbsp;&nbsp; out.println("ID: "+customer.getId()+"&lt;br&gt;");<br />&nbsp;&nbsp;&nbsp; out.println("口令: "+customer.getPassword()+"&lt;br&gt;");<br />&nbsp;&nbsp;&nbsp; out.println("E-Mail: "+customer.getEmail()+"&lt;br&gt;");<br />&nbsp;&nbsp;&nbsp; out.println("电话: "+customer.getPhone()+"&lt;br&gt;");<br />&nbsp; }<br />&nbsp;&nbsp; public void test(ServletContext context,OutputStream out) throws Exception{</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">&nbsp;&nbsp;&nbsp; Customer customer=new Customer();<br />&nbsp;&nbsp;&nbsp; customer.setName("我心依旧");<br />&nbsp;&nbsp;&nbsp; customer.setEmail("<a href="mailto:it5719@163.com">it5719@163.com</a>");<br />&nbsp;&nbsp;&nbsp; customer.setPassword("666");<br />&nbsp;&nbsp;&nbsp; customer.setPhone(5555555);<br />&nbsp;<br /></font></font></font><font size="2"><font color="#000000"><font color="#000000">&nbsp;&nbsp;&nbsp; saveCustomer(customer);</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">&nbsp;&nbsp;&nbsp; findAllCustomers(context,out);<br />&nbsp;&nbsp;&nbsp; loadAndUpdateCustomer(customer.getId(),"Beijing");<br />&nbsp;&nbsp;&nbsp; findAllCustomers(context,out);</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">&nbsp;&nbsp;&nbsp; deleteAllCustomers();<br />&nbsp; }</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">&nbsp; public static void main(String args[]) throws Exception {<br />&nbsp;&nbsp;&nbsp; new BusinessService().test(null,System.out);<br />&nbsp;&nbsp;&nbsp; sessionFactory.close();<br />&nbsp; }</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OK最后一步我们还需要配置LOG4J的属性文件.下面是LOG4J的配置文件,如果想了解LOG4J,请看我的前一篇随笔,有简单明了的介绍.然后调试过这个程序看看结果.如果通过了,恭喜你,你已经进入了"冬天"正式开始了Hibernae.<br />#init log4j level console file<br />log4j.rootLogger=ERROR,console,file </font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">#create log4j console<br />log4j.appender.console=org.apache.log4j.ConsoleAppender<br />log4j.appender.console.layout=org.apache.log4j.PatternLayout<br />log4j.appender.console.layout.ConversionPattern=%-5p %d [%t] (%F,%L) - %m%n</font></font></font></p>
<p><font size="2"><font color="#000000"><font color="#000000">#create log4j file<br />log4j.appender.file=org.apache.log4j.RollingFileAppender<br />log4j.appender.file.File=debug.log<br />log4j.appender.file.MaxFileSize=100KB<br />log4j.appender.file.MaxBackupIndex=1<br />log4j.appender.file.layout=org.apache.log4j.PatternLayout<br />log4j.appender.file.layout.ConversionPattern=%-5p %d [%t] (%F,%L) - %m%n</font></font></font></p>

<img src="http://www.blogjava.net/action/aggbug/117687.html" height="1" width="1" /><br /><br /><div align="right"><a href="http://www.blogjava.net/action/" target="_blank" style="text-decoration:none;">我心依旧</a> 2007-05-15 19:33 <a href="http://www.blogjava.net/action/archive/2007/05/15/117687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://michael-zhl.javaeye.com/blog/82485#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 May 2007 11:33:00 +0800</pubDate>
        <link>http://michael-zhl.javaeye.com/blog/82485</link>
        <guid>http://michael-zhl.javaeye.com/blog/82485</guid>
      </item>
      <item>
        <title>Java 关键字 速查表</title>
        <author>Michael.zhl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://michael-zhl.javaeye.com">Michael.zhl</a>&nbsp;
          链接：<a href="http://michael-zhl.javaeye.com/blog/82486" style="color:red;">http://michael-zhl.javaeye.com/blog/82486</a>&nbsp;
          发表时间: 2007年05月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>访问控制:<br />private 私有的<br />protected 受保护的<br />public 公共的<br /><br />类、方法和变量修饰符<br />abstract 声明抽象<br />class 类<br />extends 扩允,继承<br />final 终极,不可改变的<br />implements实现<br />interface 接口<br />native 本地<br />new 新,创建<br />static 静态&nbsp;<br />strictfp 严格,精准<br />synchronized 线程,同步<br />transient 短暂<br />volatile 易失</p>
<p>程序控制语句<br />break 跳出循环<br />continue 继续<br />return 返回<br />do 运行<br />while 循环<br />if 如果<br />else 反之<br />for 循环<br />instanceof 实例<br />switch 开关<br />case 返回开关里的结果<br />default 默认</p>
<p>错误处理<br />catch 处理异常<br />finally 有没有异常都执行<br />throw 抛出一个异常对象<br />throws 声明一个异常可能被抛出<br />try 捕获异常<br /><br />包相关<br />import 引入<br />package 包<br /><br />基本类型<br />boolean 布尔型<br />byte 字节型<br />char 字符型<br />double 双精度,<br />float 浮点<br />int 整型<br />long 长整型<br />short 短整型<br />null 空<br />true 真<br />false 假</p>
<p>变量引用<br />super 父类,超类<br />this 本类<br />void 无返回值</p>
<img src="http://www.blogjava.net/action/aggbug/116678.html" height="1" width="1" /><br /><br /><div align="right"><a href="http://www.blogjava.net/action/" target="_blank" style="text-decoration:none;">我心依旧</a> 2007-05-11 10:25 <a href="http://www.blogjava.net/action/archive/2007/05/11/116678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://michael-zhl.javaeye.com/blog/82486#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 May 2007 02:25:00 +0800</pubDate>
        <link>http://michael-zhl.javaeye.com/blog/82486</link>
        <guid>http://michael-zhl.javaeye.com/blog/82486</guid>
      </item>
      <item>
        <title>简单化 log4j</title>
        <author>Michael.zhl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://michael-zhl.javaeye.com">Michael.zhl</a>&nbsp;
          链接：<a href="http://michael-zhl.javaeye.com/blog/82487" style="color:red;">http://michael-zhl.javaeye.com/blog/82487</a>&nbsp;
          发表时间: 2007年05月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span>&nbsp;&nbsp;&nbsp;log4j,</span><span>顾名思义是专门用来做日志的</span><span>,</span><span>有一些书和教程经常把这种非常简单的东西讲的乱作一团</span><span>,</span><span>让一些处于学习阶段的朋友看了以后</span><span>,</span><span>感觉晕头转向的</span><span>,</span><span>我曾经就是受害人之一</span><span>,</span><span>所以今天发表一篇</span><span>,</span><span>让学习的人一看就懂的小文章</span><span>,</span><span>希望对一些学习</span><span>log4j</span><span>和没用过</span><span>log4j</span><span>的朋友起到帮助</span><span>.</span></p>
<p><span>&nbsp;&nbsp;&nbsp;log4j</span><span>是</span><span>Apache</span><span>组织的一个开源项目</span><span>,</span><span>它是一个日志操作包</span><span>,</span><span>通过使用</span><span>Log4j</span><span>可以指定日志信息输出的目的地</span><span>,</span><span>如控制台</span><span>,</span><span>文件</span><span>,GUI</span><span>组件</span><span>,NT</span><span>的时间记录器</span><span>,</span><span>还可以控制每一条日志输出的格式</span><span>,</span><span>此外通过定义日志的级别</span><span>,</span><span>能够非常细致的控制日志的输出</span><span>,</span><span>最好的地方是这些功能可以通过一个配置文件来灵活的进行配置</span><span>,</span><span>而不需要修改程序代码</span><span>.</span><span>在应用程序中输出日志有三个目的</span><span>:</span></p>
<p><span>1)&nbsp;&nbsp;&nbsp;&nbsp; </span><span>监视代码变量的变化情况</span><span>,</span><span>把详细信息记录到文件中</span><span>,</span><span>进行统计分析</span><span>.</span></p>
<p><span>2)&nbsp;&nbsp;&nbsp;&nbsp; </span><span>跟踪代码运行轨迹</span><span>,</span><span>作为日后审计的依据</span><span>.</span></p>
<p><span>3)&nbsp;&nbsp;&nbsp;&nbsp; </span><span>担当集成开发环境中的调试器的作用</span><span>,</span><span>向文件和控制器打印代码的调试信息</span><span>.</span></p>
<p>&nbsp;</p>
<p><span>&nbsp;&nbsp;&nbsp;首先我们要先了解点概念的东西</span><span>,</span><span>很简单</span><span>,</span><span>先知道它的</span><span>6</span><span>个基本类别</span><span>,</span><span>就是日志的级别</span><span>.</span></p>
<p><span>1)&nbsp;&nbsp;&nbsp;&nbsp; fatal</span><span>致命的</span></p>
<p><span>2)&nbsp;&nbsp;&nbsp;&nbsp; error</span><span>错误</span></p>
<p><span>3)&nbsp;&nbsp;&nbsp;&nbsp; warn</span><span>警告</span></p>
<p><span>4)&nbsp;&nbsp;&nbsp;&nbsp; info</span><span>信息</span></p>
<p><span>5)&nbsp;&nbsp;&nbsp;&nbsp; debug</span><span>调试</span></p>
<p><span>6)&nbsp;&nbsp;&nbsp;&nbsp; trace</span><span>细节</span></p>
<p><span>&nbsp;&nbsp;&nbsp;在强调可重用组件的今天</span><span>,</span><span>除了自己从头到尾开发一个可重用的日志操作类以外</span><span>,</span><span>还有一个</span><span>Apache</span><span>为我们提供的一个强有力的现成的日志操作包</span><span>Log4j.</span><span>主要由三大组件构成</span><span>:</span></p>
<p><span>1)&nbsp;&nbsp;&nbsp;&nbsp; Logger:</span><span>负责生成日志</span><span>,</span><span>并能够对日志信息进行分类筛选</span><span>.</span></p>
<p><span>2)&nbsp;&nbsp;&nbsp;&nbsp; Appender:</span><span>定义了日志信息输出的目的地</span><span>,</span><span>指定日志信息应该被输出到什么地方</span><span>.</span></p>
<p><span>3)&nbsp;&nbsp;&nbsp;&nbsp; Layout:</span><span>指定日志信息的输出格式</span><span>.</span></p>
<p><span>&nbsp;&nbsp;&nbsp;概念的东西就这么点</span><span>,</span><span>看看记住就</span><span>OK</span><span>了</span><span>.</span><span>主要是配置文件</span><span>,</span><span>这里我们就以一个</span><span>JAVA</span><span>工程当例子</span><span>,</span><span>因为这样简单明了</span><span>,</span><span>让人容易理解</span><span>.</span><span>我相信如果在一个简单的</span><span>JAVA</span><span>工程里能把</span><span>log4j</span><span>理解透彻了</span><span>.</span><span>就算换到别的工程里也应该融会贯通了</span><span>.</span><span>首先建一个</span><span>JAVA</span><span>工程</span><span>,</span><span>然后把</span><span>log4j</span><span>的</span><span>jar</span><span>包放入工程的</span><span>classpath,</span><span>就是放在工程的根目录就</span><span>OK</span><span>了</span><span>.</span><span>然后创建一个</span><span>log4j.properties</span><span>的文件</span><span>,</span><span>记住这个文件的名字是固定的</span><span>.log4j</span><span>会自己来寻找这个文件</span><span>,</span><span>至于这个文件的配置我们稍后在说</span><span>.OK</span><span>现在包导好了</span><span>,</span><span>配置文件也弄好了</span><span>.</span><span>我们在类里简单的调用</span><span>log4j</span><span>就可以使用了</span><span>.</span><span>下边是例子</span><span>:</span></p>
<p><span>import org.apache.log4j.Logger; </span></p>
<p><span>public class Log {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>static Logger log = Logger.getLogger(Log.class);</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>public static void main(String[] args) {</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>log.fatal("</span><span>致命</span><span>...");</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>log.error("</span><span>错误</span><span>...");</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>log.info("</span><span>信息</span><span>...");</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>log.debug("</span><span>调试</span><span>...");</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p><span>}</span></p>
<p>&nbsp;</p>
<p><span>#</span><span>这里是定义了日志输出的级别</span><span>DUBUG,</span><span>然后声明一个控制台和文件</span><span>,</span><span>名字随便起</span><span>.</span></p>
<p><span>log4j.rootLogger=DEBUG,console,file </span></p>
<p>&nbsp;</p>
<p><span>#</span><span>这里是配置日志输出控制台的相关属性</span></p>
<p><span>log4j.appender.console=org.apache.log4j.ConsoleAppender</span></p>
<p><span>log4j.appender.console.layout=org.apache.log4j.PatternLayout</span></p>
<p><span>log4j.appender.console.layout.ConversionPattern=%-5p %d [%t] (%F,%L) - %m%n</span></p>
<p>&nbsp;</p>
<p><span>#</span><span>这里是配置日志输出文件的相关属性</span></p>
<p><span>log4j.appender.file=org.apache.log4j.RollingFileAppender</span></p>
<p><span>log4j.appender.file.File=log.log</span></p>
<p><span>log4j.appender.file.MaxFileSize=100KB</span></p>
<p><span>log4j.appender.file.MaxBackupIndex=1</span></p>
<p><span>log4j.appender.file.layout=org.apache.log4j.PatternLayout</span></p>
<p><span>log4j.appender.file.layout.ConversionPattern=%-5p %d [%t] (%F,%L) - %m%n</span></p>
<p>&nbsp;</p>
<p><span>&nbsp;&nbsp;&nbsp;OK,</span><span>你调试通过了么</span><span>?</span><span>如果通过了</span><span>,</span><span>但是想知道配置文件里各各属性的具体含义</span><span>,</span><span>那么我在附件里上传了一份比较间接的</span><span>log4j</span><span>文档</span><span>,</span><span>是</span><span>PDF</span><span>格式的.<a href="http://www.blogjava.net/Files/action/Log4J.pdf">Log4J.pdf</a></span><span>在熟悉了文档里的相关配置的含义之后</span><span>,</span><span>稍加练习灵活运用就算掌握了</span><span>log4j</span><span>了</span><span>.</span></p>
<img src="http://www.blogjava.net/action/aggbug/116513.html" height="1" width="1" /><br /><br /><div align="right"><a href="http://www.blogjava.net/action/" target="_blank" style="text-decoration:none;">我心依旧</a> 2007-05-10 16:07 <a href="http://www.blogjava.net/action/archive/2007/05/10/116513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://michael-zhl.javaeye.com/blog/82487#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 May 2007 08:07:00 +0800</pubDate>
        <link>http://michael-zhl.javaeye.com/blog/82487</link>
        <guid>http://michael-zhl.javaeye.com/blog/82487</guid>
      </item>
      <item>
        <title>工作之余，整理了一下平时处理数据的一些常用的，简单的方法。希望对学习JAVA的朋友有点帮助。</title>
        <author>Michael.zhl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://michael-zhl.javaeye.com">Michael.zhl</a>&nbsp;
          链接：<a href="http://michael-zhl.javaeye.com/blog/82488" style="color:red;">http://michael-zhl.javaeye.com/blog/82488</a>&nbsp;
          发表时间: 2007年04月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>package com.util;</p>
<p>import java.io.BufferedInputStream;<br />import java.io.BufferedWriter;<br />import java.io.File;<br />import java.io.FileInputStream;<br />import java.io.FileOutputStream;<br />import java.io.FileWriter;<br />import java.io.FilterInputStream;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.io.OutputStream;<br />import java.io.PrintWriter;<br />import java.net.URL;<br />import java.text.SimpleDateFormat;<br />import java.util.Calendar;<br />import java.util.Date;<br />import java.util.Enumeration;<br />import java.util.HashMap;<br />import java.util.Map;<br />import java.util.Properties;<br />import java.util.regex.Matcher;<br />import java.util.regex.Pattern;</p>
<p>public class SuperUitl {<br />&nbsp;<br />&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;System.out.println();<br />&nbsp;}<br />&nbsp;<br />&nbsp;/**<br />&nbsp; * 全角转半角<br />&nbsp; * trr 要转换成半角的字符串<br />&nbsp; */<br />&nbsp;public static String change(String str) {<br />&nbsp;&nbsp;String outStr="";<br />&nbsp;&nbsp;String test="";<br />&nbsp;&nbsp;byte[] code = null;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;for(int i=0;i&lt;str.length();i++) {&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;test = str.substring(i,i+1);<br />&nbsp;&nbsp;&nbsp;&nbsp;code = test.getBytes("unicode");<br />&nbsp;&nbsp;&nbsp;} catch(java.io.UnsupportedEncodingException e) {<br />&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;if (code[3] == -1) {<br />&nbsp;&nbsp;&nbsp;&nbsp;code[2] = (byte)(code[2]+32);<br />&nbsp;&nbsp;&nbsp;&nbsp;code[3] = 0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;try {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outStr = outStr + new String(code,"unicode");<br />&nbsp;&nbsp;&nbsp;&nbsp;} catch(java.io.UnsupportedEncodingException e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;outStr = outStr + test;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return outStr; <br />&nbsp;}<br />&nbsp;<br />&nbsp;/**<br />&nbsp; * 根据key读取value<br />&nbsp; * filePath 要操作的properties文件路径<br />&nbsp; * key 要获得数据的key<br />&nbsp; */<br />&nbsp;public static String readValue(String filePath,String key) {<br />&nbsp;&nbsp;Properties props = new Properties();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;InputStream in = new BufferedInputStream (new FileInputStream(filePath));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;props.load(in);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;String value = props.getProperty (key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;return null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;}<br />&nbsp;<br />&nbsp;/**<br />&nbsp; * 读取properties的全部信息<br />&nbsp; * filePath 要操作的properties文件路径<br />&nbsp; */<br />&nbsp;&nbsp;&nbsp; public static Map readProperties(String filePath) {<br />&nbsp;&nbsp;&nbsp; &nbsp;Map map = new HashMap();<br />&nbsp;&nbsp;&nbsp; &nbsp;Properties props = new Properties();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;InputStream in = new BufferedInputStream (new FileInputStream(filePath));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;props.load(in);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enumeration en = props.propertyNames();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;while (en.hasMoreElements()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;String key = (String) en.nextElement();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String Property = props.getProperty (key);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put(key,Property);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;return map;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;return null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /**<br />&nbsp; * 写入properties信息<br />&nbsp; * filePath 要操作的properties文件路径<br />&nbsp; * key 要写入的key<br />&nbsp; * value 要写入的value<br />&nbsp; */<br />&nbsp;&nbsp;&nbsp; public static boolean writeProperties(String filePath,String key,String value) {<br />&nbsp;&nbsp;&nbsp; &nbsp;Properties prop = new Properties();<br />&nbsp;&nbsp;&nbsp; &nbsp;try {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;InputStream fis = new FileInputStream(filePath);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //从输入流中读取属性列表（键和元素对）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prop.load(fis);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调用 Hashtable 的方法 put。使用 getProperty 方法提供并行性。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //强制要求为属性的键和值使用字符串。返回值是 Hashtable 调用 put 的结果。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OutputStream fos = new FileOutputStream(filePath);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prop.setProperty(key,value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //以适合使用 load 方法加载到 Properties 表中的格式，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将此 Properties 表中的属性列表（键和元素对）写入输出流<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prop.store(fos, "Update '" + key + "' value");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;return false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp; * 返回标准系统时间<br />&nbsp; */<br />&nbsp;&nbsp;&nbsp; public static String getDate() {<br />&nbsp;&nbsp;SimpleDateFormat ft=null;<br />&nbsp;&nbsp;Date date=null;<br />&nbsp;&nbsp;Calendar cl= Calendar.getInstance();<br />&nbsp;&nbsp;cl.setTime(new java.util.Date());<br />&nbsp;&nbsp;date=cl.getTime();<br />&nbsp;&nbsp;ft=new SimpleDateFormat("yyyy-MM-dd HH:mm");<br />&nbsp;&nbsp;String dateTime = ft.format(date);<br />&nbsp;&nbsp;return dateTime;<br />&nbsp;}<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp; * 从指定的字符串中提取Email<br />&nbsp; * content 指定的字符串<br />&nbsp; */<br />&nbsp;public static String parse(String content) {<br />&nbsp;&nbsp;String email = null;<br />&nbsp;&nbsp;if (content==null || content.length()&lt;1) {<br />&nbsp;&nbsp;&nbsp;return email;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;//找出含有@<br />&nbsp;&nbsp;int beginPos;<br />&nbsp;&nbsp;int i;<br />&nbsp;&nbsp;String token = "@";<br />&nbsp;&nbsp;String preHalf="";<br />&nbsp;&nbsp;String sufHalf = "";<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;beginPos = content.indexOf(token);<br />&nbsp;&nbsp;if (beginPos&gt;-1) {<br />&nbsp;&nbsp;&nbsp;//前项扫描<br />&nbsp;&nbsp;&nbsp;String s = null;<br />&nbsp;&nbsp;&nbsp;i= beginPos;<br />&nbsp;&nbsp;&nbsp;while(i&gt;0) {<br />&nbsp;&nbsp;&nbsp;&nbsp;s = content.substring(i-1,i);<br />&nbsp;&nbsp;&nbsp;&nbsp;if (isLetter(s))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preHalf = s+preHalf;<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;i--;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;//后项扫描<br />&nbsp;&nbsp;&nbsp;i= beginPos+1;<br />&nbsp;&nbsp;&nbsp;while( i&lt;content.length()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;s = content.substring(i,i+1)