二、数据访问层
因为只有一张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>