Spring学习(四)——使用Spring JDBC访问数据库
本篇我们将在上一篇http://www.cnblogs.com/wenjingu/p/3824294.html的Demo程序的基础上增加数据持久层和业务层,实现登录验证功能。
1、修改gradle文件,增加依赖包,代码如下:
apply plugin: 'idea' apply plugin: 'java' repositories { mavenCentral() maven { url "http://repo.spring.io/release" } } dependencies { compile( "org.springframework:spring-context:4.0.5.RELEASE", "org.springframework:spring-web:4.0.5.RELEASE", "org.springframework:spring-webmvc:4.0.5.RELEASE", "org.springframework:spring-context-support:4.0.5.RELEASE", "org.apache.velocity:velocity:1.7", "org.apache.velocity:velocity-tools:2.0", "org.anarres.gradle:gradle-velocity-plugin:1.0.0", "org.springframework:spring-jdbc:4.0.5.RELEASE", "commons-dbcp:commons-dbcp:1.4", "org.springframework:spring-test:4.0.5.RELEASE", "org.testng:testng:6.8.8" ) testCompile("org.springframework:spring-test:4.0.5.RELEASE") runtime("jstl:jstl:1.2") } task copyJars(type: Copy) { from configurations.runtime into 'lib' // 目标位置 }
2、创建数据库表
sql脚本文件如下:
DROP DATABASE IF EXISTS sampledb; CREATE DATABASE sampledb DEFAULT CHARACTER SET utf8; USE sampledb; ##创建用户表 CREATE TABLE t_user ( user_id INT AUTO_INCREMENT PRIMARY KEY, user_name VARCHAR(30), password VARCHAR(32), last_visit datetime, last_ip VARCHAR(23) )ENGINE=InnoDB; ##创建用户登录日志表 CREATE TABLE t_login_log ( login_log_id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, ip VARCHAR(23), login_datetime datetime )ENGINE=InnoDB; ##插入初始化数据 INSERT INTO t_user (user_name,password) VALUES('admin','123456'); COMMIT;
打开MySQL Workbench,点击菜单【Database】->【Connect to Database】连接数据库后,执行上述脚本。
3、实现领域对象和数据访问对象
在src/main/java/domain文件夹下新建两个类User,LoginLog,代码请参考附件。
在src/main/java/dao文件夹下新建两个类UserDao,LoginLogDao,代码请参考附件。
对数据库的操作都是通过一个JdbcTemplate对象进行操作的,JdbcTemplate是Spring Jdbc包的核心类,Spring Jdbc包是对JDBC的一个轻量级封装。
对该包的使用请参考其他更详细的资料。
4、实现业务层
在src/main/java/service文件夹下新建类UserService,代码请参考附件。该类通过调用持久层的接口实现业务逻辑。
5、控制器
在src/main/java/controller文件夹下新建类LoginCommand,代码请参考附件。LoginController类代码修改如下:
@Controller public class LoginController { @Autowired private UserService userService; @RequestMapping(value = "/login.html") public String loginPage() { return "login"; } @RequestMapping(value = "/loginCheck.html") public ModelAndView loginCheck(HttpServletRequest request, LoginCommand loginCommand) { boolean isValidUser = userService.hasMatchUser(loginCommand.getUserName(), loginCommand.getPassword()); if (!isValidUser) { return new ModelAndView("login", "error", "用户名或密码错误。"); } else { User user = userService.findUserByUserName(loginCommand .getUserName()); user.setLastIp(request.getLocalAddr()); user.setLastVisit(new Date()); userService.loginSuccess(user); request.getSession().setAttribute("user", user); return new ModelAndView("main"); } } }
6、修改配置文件
修改applicationContext.xml文件,添加数据源和Jdbc模板,以便Spring可自动注入JdbcTemplate对象。
<context:component-scan base-package="service"/> <context:component-scan base-package="dao"/> <!-- 配置数据源 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="com.mysql.jdbc.Driver" p:url="jdbc:mysql://localhost:3306/sampledb" p:username="guwenjin" p:password="p@ssw0rd" /> <!-- 配置Jdbc模板 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dataSource" />
spring-web-servlet.xml文件中新增如下一行,以便在LoginController类中Spring可自动注入UserService对象。
<context:component-scan base-package="service"/>
6、单元测试
在src/test/java/service文件夹下新建类UserServiceTest,代码如下:
@ContextConfiguration(locations = {"/applicationContext.xml"}) public class UserServiceTest extends AbstractTestNGSpringContextTests { @Autowired private UserService userService; @Test public void hasMatchUser() { boolean b1 = userService.hasMatchUser("admin", "123456"); boolean b2 = userService.hasMatchUser("admin", "1111"); assertTrue(b1); assertTrue(!b2); } @Test public void findUserByUserName() { User user = userService.findUserByUserName("admin"); assertEquals(user.getUserName(), "admin"); } @Test public void loginSuccess() { User user = userService.findUserByUserName("admin"); user.setUserId(1); user.setUserName("admin"); user.setLastIp("192.168.20.106"); user.setLastVisit(new Date()); userService.loginSuccess(user); } }
测试框架采用了TestNG,其依赖spring-test、testng两个库,其详细使用方法请参考其他资料。
7、运行网站
展现层代码不用改动,直接启动Tomcat,系统可对登录页面中填写的用户名密码进行验证,并将登录信息记录日志。
源码下载https://files.cnblogs.com/wenjingu/VelocityDemo3.0.zip,lib中的jar包上传时删除了,运行前请先运行命令:gradle copyJars下载jar包。
参考书籍:《Spring 3.0就这么简单》陈雄华,林开雄著