持久层负责数据的访问和操作,DAO类被上层的业务类调用。本快速入门教程使用SpringJDBC作为持久层的实现技术,关于SpringJDBC详细内容后面我们会进行详细的介绍。
建立领域对象
Domain Object领域对象或者称为实体类,他代表了业务的状态。领域对象属于业务层,但它贯穿展现层、业务层、持久层,并最终被持久化到数据库中。领域对象使数据库表以面向对象的方式进行,为程序的扩展性带来了更大的灵活性。领域对象不一定等同于数据库表。持久层的主要工作就是从数据库表中加载数据并实例化领域对象,或将领域对象持久化到数据库表中。
用户领域对象
代码如下:
package com.bbs.domain; import java.io.Serializable; import java.util.Date; public class User implements Serializable{ private int userId; private String userName; private String password; private int credits; private String lastIp; private Date lastVisit; public String getLastIp() { return lastIp; } public void setLastIp(String lastIp) { this.lastIp = lastIp; } public Date getLastVisit() { return lastVisit; } public void setLastVisit(Date lastVisit) { this.lastVisit = lastVisit; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getCredits() { return credits; } public void setCredits(int credits) { this.credits = credits; } }
登录日志领域对象
package com.bbs.domain; import java.io.Serializable; import java.util.Date; public class LoginLog implements Serializable{ private int loginLogId; private int userId; private String ip; private Date loginDate; public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public Date getLoginDate() { return loginDate; } public void setLoginDate(Date loginDate) { this.loginDate = loginDate; } public int getLoginLogId() { return loginLogId; } public void setLoginLogId(int loginLogId) { this.loginLogId = loginLogId; } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } }
UserDao
UsrDao主要有3个方法
getMatchCount():根据用户名和密码获取匹配的用户数。1表示正确,0表示用户名或密码错误;
findUserByUserName():根据用户名获取Userd对象;
updateLoginInfo():更新用户积分、最后登录IP以及最后登录时间。
具体代码如下
package com.bbs.dao; import java.sql.ResultSet; import java.sql.SQLException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.stereotype.Repository; import com.bbs.domain.User; @Repository public class UserDao { @Autowired private JdbcTemplate jdbcTemplate; public int getMatchCount(String userName, String password) { String sqlStr = " SELECT count(*) FROM t_user " + " WHERE user_name =? and password=? "; return jdbcTemplate.queryForInt(sqlStr, new Object[] { userName, password },2); } public User findUserByUserName(final String userName) { String sqlStr = " SELECT user_id,user_name,credits " + " FROM t_user WHERE user_name =? "; final User user = new User(,2); jdbcTemplate.query(sqlStr, new Object[] { userName }, new RowCallbackHandler() { public void processRow(ResultSet rs) throws SQLException { user.setUserId(rs.getInt("user_id"),2); user.setUserName(userName,2); user.setCredits(rs.getInt("credits"),2); } },2); return user; } public void updateLoginInfo(User user) { String sqlStr = " UPDATE t_user SET last_visit=?,last_ip=?,credits=? " + " WHERE user_id =?"; jdbcTemplate.update(sqlStr, new Object[] { user.getLastVisit(), user.getLastIp(),user.getCredits(),user.getUserId()},2); } }
LogUserDao
LogUserDao只有1个方法insertLoginLog():插入登录日志。具体代码如下
package com.bbs.dao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import com.bbs.domain.LoginLog; @Repository public class LoginLogDao { @Autowired private JdbcTemplate jdbcTemplate; public void insertLoginLog(LoginLog loginLog) { String sqlStr = "INSERT INTO t_login_log(user_id,ip,login_datetime) " + "VALUES(?,?,?)"; Object[] args = { loginLog.getUserId(), loginLog.getIp(), loginLog.getLoginDate() }; jdbcTemplate.update(sqlStr, args,2); } }
添加完成后,类视图如下图所示
在Spring中配置DAO
在编写DAO的时候,大家肯定会有这样一个问题:DAO类究竟是如何访问数据库的?并没有看到打开、释放Connection的代码!是因为这些操作都被JdbcTemplate封装起来了。JdbcTemplate本身需要一个DataSource,这样它就可以根据需要从DataSource中获取或返回连接了。UserDao和LoginLogDao都提供了一个带@Autowired注解的JdbcTemplate变量。所以我们首先要申明一个数据源,然后定义一个JdbcTemplate Bean,通过Spring的容器上下文自动绑定机制进行Bean的注入。
application.xml的核心代码如下(这里因为文章还没全部讲完,我不会贴出application.xml的所有代码)
<!-- 扫描类包,将标注Spring注解的类自动转化Bean,同时完成Bean的注入 -->
<context:component-scan base-package="com.baobaotao.dao"/>
<context:component-scan base-package="com.baobaotao.service"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
p:url="jdbc:sqlserver://localhost:1433;DatabaseName=TerrenceCRM;SelectMethod=Cursor"
p:username="root"
p:password="1234" />
<!-- 配置Jdbc模板 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource-ref="dataSource" />