技术开发 频道

整合JSF、Hibernate、Spring实现用户登录应用



二、数据访问层
因为只有一张userinfo表,所以数据访问部分也不复杂。
首先,我们定义了一个IUserDAO接口,用于根据用户名得到该用户信息。
2. com.it168.logon.model.dao.IUserDAO.java:
package com.it168.logon.model.dao; import com.it168.logon.model.businessobject.Userinfo; public interface IUserDAO { public Userinfo getUser(String username); }

 

     接着,UserDAO类实现了IUserDAO接口:

3. com.it168.logon.model.dao.impl.UserDAO.java:

package com.it168.logon.model.dao.impl; import java.util.Iterator; import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.it168.logon.model.businessobject.Userinfo; import com.it168.logon.model.dao.IUserDAO; public class UserDAO extends HibernateDaoSupport implements IUserDAO { public UserDAO() { super(); } @SuppressWarnings("unchecked") public Userinfo getUser(String username) { Userinfo user = null; List userList = getHibernateTemplate().findByNamedParam( "from Userinfo u where u.username = :username", "username", username); if (userList != null) { Iterator i = userList.iterator(); while (i.hasNext()) { user = (Userinfo) i.next(); } } return user; } }

 

 

 

大家可以看到,UserDAO类继承了HibernateDaoSupport类,HibernateDaoSupport类是Spring中的,该类极大地简化了数据持久化操作。
大家或许注意到:
from Userinfo u where u.username = :username
这和我们平时使用的SQL语句很相似,但这是HQL,它针对的不是表,而是类/对象。既然HQL中使用了Userinfo类,那么Userinfo类又包括哪些内容呢?

4. com.it168.logon.model.businessobject.Userinfo.java:

package com.it168.logon.model.businessobject; @SuppressWarnings("serial") public class Userinfo implements java.io.Serializable { // Fields private Integer id; private String username; private String password; // Constructors /** default constructor */ public Userinfo() { } /** full constructor */ public Userinfo(String username, String password) { this.username = username; this.password = password; } // Property accessors public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return this.username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return this.password; } public void setPassword(String password) { this.password = password; } }

 

大家可以看到,Userinfo类并没有什么神奇的地方,只是一个简单的POJO类。但是,为什么这样一个简单的POJO类可以和数据库查询关联起来呢?
5. com.it168.logon.model.businessobject.Userinfo.hbm.xml:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="com.it168.logon.model.businessobject.Userinfo" table="userinfo"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="increment" /> </id> <property name="username" type="java.lang.String"> <column name="username" length="100" not-null="true" /> </property> <property name="password" type="java.lang.String"> <column name="password" length="100" not-null="true" /> </property> </class> </hibernate-mapping>


 

这就是原因所在!Userinfo.hbm.xml中定义了Userinfo类中属性与Userinfo表中字段的关系。而Hibernate也这是借此实现了ORM映射。
我们的数据库信息呢?别担心,在这里:
6. applicationContext.xml代码片断一
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass"> <value>com.mysql.jdbc.Driver</value> </property> <property name="jdbcUrl"> <value>jdbc:mysql://localhost:3306/logon</value> </property> <property name="user"> <value>root</value> </property> <property name="password"> <value>123456</value> </property> <property name="minPoolSize"> <value>5</value> </property> <property name="maxPoolSize"> <value>20</value> </property> <property name="maxIdleTime"> <value>300</value> </property> <property name="maxStatements"> <value>50</value> </property> <property name="idleConnectionTestPeriod"> <value>3000</value> </property> </bean>
 
 
 

 

 

0
相关文章