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,系统可对登录页面中填写的用户名密码进行验证,并将登录信息记录日志。

源码下载http://files.cnblogs.com/wenjingu/VelocityDemo3.0.zip,lib中的jar包上传时删除了,运行前请先运行命令:gradle copyJars下载jar包。

参考书籍:《Spring 3.0就这么简单》陈雄华,林开雄著

原文地址:https://www.cnblogs.com/wenjingu/p/3829209.html