springjdbc
springjdbc是什么?
spring框架对jdbc api的封装,使用起来
更加简单,比如,不用考虑获得连接与
关闭连接等等。
如何使用?
step1. 配置DataSource。
step2. 配置JdbcTemplate。
step3. 调用JdbcTemplate提供的方法。
注:
a. 需要导入springjdbc相关的jar文件。
b. JdbcTemplate会将底层的异常转换成
运行时异常,然后抛出。
案例演示:
工程案例目录结构
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.study</groupId>
<artifactId>springcase-netctoss-jdbc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.4.0</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>3.2.8.RELEASE</version>
</dependency>
</dependencies>
</project>
导入Tomcat类库
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>springcase-netctoss-jdbc</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:app.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
app.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">
<!-- 配置组件扫描 -->
<context:component-scan base-package="com.dk.oss"/>
<!-- 配置mvc注解扫描 -->
<mvc:annotation-driven/>
<!--
配置视图解析器:
负责将视图名解析成真正的视图对象(比如jsp)。
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 读取db.properties文件的内容 -->
<util:properties id="jdbc" location="classpath:db.properties"/>
<!-- 配置DataSource -->
<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="#{jdbc.driverclass}" />
<property name="url" value="#{jdbc.url}" />
<property name="username" value="#{jdbc.user}" />
<property name="password" value="#{jdbc.password}" />
<property name="maxActive" value="#{jdbc.maxActive}" />
</bean>
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/toLogin.do"/>
<mvc:exclude-mapping path="/login.do"/>
<bean class="com.dk.oss.interceptors.SessionInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
<!-- 配置JdbcTemplate -->
<bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="ds"/>
</bean>
</beans>
以下配置为本次案例的重点知识点:
db.properties
driverclass=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
user=learn
password=learn
maxActive=1
initSize=1
model层 :
User.java
package com.dk.oss.entity;
/**
* 实体类
* @author Cher_du
*
*/
public class User {
private Integer id;
private String name;
private int age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
Cost.java
package com.dk.oss.entity;
import java.sql.Timestamp;
/**
* 实体类
* @author Cher_du
*
*/
public class Cost {
private Integer costId;
private String name;
//基本时长
private Integer baseDuration;
//基本费用
private Double baseCost;
//单位费用
private Double unitCost;
//状态:0-启用;1-禁用;
private String status;
//描述
private String descr;
//创建时间
private Timestamp creatime;
//开通时间
private Timestamp startime;
//资费类型:1-包月;2-套餐;3-计时;
private String costType;
@Override
public String toString() {
return "User [costId=" + costId + ", name=" + name + ", baseDuration=" + baseDuration + ", baseCost=" + baseCost
+ ", unitCost=" + unitCost + ", status=" + status + ", descr=" + descr + ", creatime=" + creatime
+ ", startime=" + startime + ", costType=" + costType + "]";
}
public Integer getCostId() {
return costId;
}
public void setCostId(Integer costId) {
this.costId = costId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getBaseDuration() {
return baseDuration;
}
public void setBaseDuration(Integer baseDuration) {
this.baseDuration = baseDuration;
}
public Double getBaseCost() {
return baseCost;
}
public void setBaseCost(Double baseCost) {
this.baseCost = baseCost;
}
public Double getUnitCost() {
return unitCost;
}
public void setUnitCost(Double unitCost) {
this.unitCost = unitCost;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getDescr() {
return descr;
}
public void setDescr(String descr) {
this.descr = descr;
}
public Timestamp getCreatime() {
return creatime;
}
public void setCreatime(Timestamp creatime) {
this.creatime = creatime;
}
public Timestamp getStartime() {
return startime;
}
public void setStartime(Timestamp startime) {
this.startime = startime;
}
public String getCostType() {
return costType;
}
public void setCostType(String costType) {
this.costType = costType;
}
}
Admin.java
package com.dk.oss.entity;
import java.sql.Timestamp;
/**
* 实体类
* 注:
* 与要操作的表保持一致。
* @author Cher_du
*
*/
public class Admin {
private Integer adminId;
private String adminCode;
private String password;
private String name;
private String telephone;
private String email;
private Timestamp enrolldate;
public Integer getAdminId() {
return adminId;
}
public void setAdminId(Integer adminId) {
this.adminId = adminId;
}
public String getAdminCode() {
return adminCode;
}
public void setAdminCode(String adminCode) {
this.adminCode = adminCode;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Timestamp getEnrolldate() {
return enrolldate;
}
public void setEnrolldate(Timestamp enrolldate) {
this.enrolldate = enrolldate;
}
}
DAO层:
UserDAO.java
package com.dk.oss.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import com.dk.oss.entity.User;
/**
* 使用JdbcTemplate实现数据库访问
* @author Cher_du
*
*/
@Repository("userDAO")
public class UserDAO {
@Resource(name="jt")
private JdbcTemplate jt;
public void save(User user){
jt.update("INSERT INTO user_dk "+
"VALUES(1,?,?)",
new Object[]{user.getName(),user.getAge()});
}
/*
* 需要写一个实现了RowMapper接口的类,
* 该类规定了如何将结果集中的一条记录
* 转换成相应的java对象(比如User对象)。
*/
public List<User> findAll(){
List<User> users = new ArrayList<User>();
String sql = "SELECT * FROM user_dk";
users = jt.query(sql, new UserRowMapper());
return users;
}
/*
* queryForObject方法:
* 如果找不到相应的记录,会抛出异常。
*/
public User findById(int id){
User user = null;
String sql = "SELECT * FROM user_dk "
+"WHERE ID=?";
user = jt.queryForObject(sql, new Object[]{id}, new UserRowMapper());
return user;
}
public User findById2(int id){
User user = null;
String sql = "SELECT * FROM user_dk "
+"WHERE id=?";
List<User> users = jt.query(sql, new Object[]{id}, new UserRowMapper());
if(users !=null && users.size() >0){
return users.get(0);
}
return user;
}
public void update(User user){
String sql = "UPDATE user_dk "
+"SET name=?,age=? WHERE id=?";
jt.update(sql,new Object[]{user.getName(),user.getAge(),user.getId()});
}
public void delete(int id){
String sql ="DELETE FROM user_dk WHERE id=?";
jt.update(sql,new Object[]{id});
}
/*
* 获得总的记录数。
* 建议使用queryForObject方法。
* 不建议使用queryForInt方法。
*/
public int getTotalRow(){
String sql = "SELECT COUNT(*) FROM user_dk";
return jt.queryForObject(sql, Integer.class);
}
class UserRowMapper implements RowMapper<User>{
/*
* rst:结果集。
* rowNum:记录的下标,从0开始。
*/
public User mapRow(ResultSet rst, int rowNum)
throws SQLException {
User user = new User();
user.setId(rst.getInt("id"));
user.setName(rst.getString("name"));
user.setAge(rst.getInt("age"));
return user;
}
}
}
CostDAO.java
package com.dk.oss.dao;
import java.util.List;
import com.dk.oss.entity.Cost;
/**
* DAO接口
*/
public interface CostDAO {
public List<Cost> findAll();
}
CostDAOJdbcImpl.java
package com.dk.oss.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.springframework.stereotype.Repository;
import com.dk.oss.entity.Cost;
/**
* DAO实现类
*
*/
@Repository("costDAO")
public class CostDAOJdbcImpl implements
CostDAO{
//注入DataSource
@Resource(name="ds")
private DataSource ds;
//查询出所有资费信息
public List<Cost> findAll() {
List<Cost> costs =
new ArrayList<Cost>();
Connection conn = null;
PreparedStatement prep = null;
ResultSet rst = null;
try {
conn = ds.getConnection();
String sql = "SELECT * FROM cost "
+ "ORDER BY cost_id";;
prep =
conn.prepareStatement(sql);
rst = prep.executeQuery();
while(rst.next()){
Cost c = createCost(rst);
costs.add(c);
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return costs;
}
//将结果集中的记录转换成一个对象。
private Cost createCost(ResultSet rst) throws SQLException {
Cost c = new Cost();
c.setCostId(rst.getInt("cost_id"));
c.setName(rst.getString("name"));
c.setBaseDuration(rst.getInt("base_duration"));
c.setBaseCost(rst.getDouble("base_cost"));
c.setUnitCost(rst.getDouble("unit_cost"));
c.setStatus(rst.getString("status"));
c.setDescr(rst.getString("descr"));
c.setCreatime(rst.getTimestamp("creatime"));
c.setStartime(rst.getTimestamp("startime"));
c.setCostType(rst.getString("cost_type"));
return c;
}
}
AdminDAO.java
package com.dk.oss.dao;
import com.dk.oss.entity.Admin;
/**
* DAO接口
* 注:
* 任何接口,都不要涉及任何具体的实现。
*/
public interface AdminDAO {
public Admin findByCode(String code);
}
AdminDAOJdbcImpl.java
package com.dk.oss.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.springframework.stereotype.Repository;
import com.dk.oss.entity.Admin;
/**
* DAO实现类
* @author Cher_du
*
*/
@Repository("adminDAO")
public class AdminDAOJdbcImpl implements AdminDAO{
//注入datasource。
@Resource(name="ds")
private DataSource ds;
public Admin findByCode(String code) {
Admin admin = null;
Connection conn = null;
PreparedStatement prep = null;
ResultSet rst = null;
try {
conn = ds.getConnection();
String sql = "SELECT * FROM admin_info "
+"WHERE admin_code=?";
prep = conn.prepareStatement(sql);
prep.setString(1, code);
rst = prep.executeQuery();
if(rst.next()){
admin = new Admin();
admin.setAdminId(rst.getInt("admin_id"));
admin.setAdminCode(rst.getString("admin_code"));
admin.setPassword(rst.getString("password"));
admin.setName(rst.getString("name"));
admin.setTelephone(rst.getString("telephone"));
admin.setEmail(rst.getString("email"));
admin.setEnrolldate(rst.getTimestamp("enrolldate"));
}
} catch (SQLException e) {
//记日志(保留现场)
e.printStackTrace();
/*
* 异常是否恢复,如果不能够恢复
* (发生了系统异常,比如数据库服务
* 暂停,网络中断),则提示用户稍后
* 重试。如果能够恢复,则立即恢复。
*/
throw new RuntimeException(e);
}finally{
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return admin;
}
}
Service层:
AdminService.java
package com.dk.oss.service;
import com.dk.oss.entity.Admin;
/**
* 业务层接口
*
*/
public interface AdminService {
//用于登录处理
public Admin checkLogin(String code,
String pwd);
}
AdminServiceImpl.java
package com.dk.oss.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.dk.oss.dao.AdminDAO;
import com.dk.oss.entity.Admin;
/**
* 业务层实现
*
*/
@Service("adminService")
public class AdminServiceImpl implements AdminService{
@Resource(name="adminDAO")
private AdminDAO adminDAO;
public Admin checkLogin(String code, String pwd) {
//调用AdminDAO访问数据库
Admin admin = adminDAO.findByCode(code);
if(admin == null){
//账户不存在,需要提示用户。
//抛出一个应用异常(用户在使用系统
//的过程当中,做了一些错误的操作,比如
//输出入错误的账户或密码)。
throw new AppException("账户错误");
}
if(!admin.getPassword().equals(pwd)){
//密码错误,需要提示用户
throw new AppException("密码错误");
}
//登录成功
return admin;
}
}
AppException.java
package com.dk.oss.service;
/**
* 应用异常类。
*
*/
public class AppException
extends RuntimeException {
public AppException() {
}
public AppException(String message) {
super(message);
}
}
CostService.java
package com.dk.oss.service;
import java.util.List;
import com.dk.oss.entity.Cost;
public interface CostService {
public List<Cost> list();
}
CostServiceImpl.java
package com.dk.oss.service;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.dk.oss.dao.CostDAO;
import com.dk.oss.entity.Cost;
@Service("costService")
public class CostServiceImpl implements CostService{
@Resource(name="costDAO")
private CostDAO dao;
public List<Cost> list() {
List<Cost> costs = new ArrayList<Cost>();
costs = dao.findAll();
return costs;
}
}
Controller层:
CostController.java
package com.dk.oss.controller;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.dk.oss.entity.Cost;
import com.dk.oss.service.CostService;
@Controller
public class CostController {
@Resource(name="costService")
private CostService costService;
@RequestMapping("/cost.do")
public String cost(HttpServletRequest request){
try{
List<Cost> costs = costService.list();
request.setAttribute("costs", costs);//Integer.valueOf("w");
}catch(Exception e){
e.printStackTrace();
//系统异常,提示用户稍后重试。
return "error";
}
return "cost";
}
}
LoginController.java
package com.dk.oss.controller;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.dk.oss.entity.Admin;
import com.dk.oss.service.AdminService;
import com.dk.oss.service.AppException;
@Controller
public class LoginController {
@Resource(name="adminService")
private AdminService adminService;
@RequestMapping("/toLogin.do")
public String toLogin(){
return "login";
}
@RequestMapping("/login.do")
public String checkLogin(HttpServletRequest request,
HttpSession session){
//读取请求参数值
String adminCode = request.getParameter("adminCode");
String pwd = request.getParameter("pwd");
System.out.println("adminCode:"+adminCode+" pwd:"+pwd);
//调用业务层模块来进行登录处理
Admin admin = null;
try{
admin = adminService.checkLogin(adminCode, pwd);
System.out.println(admin);
}catch(Exception e){
if(e instanceof AppException ){
//应用异常,需要明确提示用户。
request.setAttribute("errorMsg", e.getMessage());
//转发到登录页面。
return "login";
}else{
//系统异常,提示用户稍后重试
return "error";
}
}
//登录成功,重定向到首页。
//将一些数据绑定到session对象上,用于
//session验证。
session.setAttribute("admin", admin);
return "redirect:index.do";
}
@RequestMapping("/index.do")
public String toIndex(){
return "index";
}
}
SessionInterceptor.java
package com.dk.oss.interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 拦截器,用于session验证。
* @author Cher_du
*
*/
public class SessionInterceptor implements HandlerInterceptor{
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler)
throws Exception {
System.out.println("SessionInterceptor的preHandle方法...");
//session验证
HttpSession session = request.getSession();
Object obj = session.getAttribute("admin");
if(obj == null){
//没有登录,跳转到登录页面
response.sendRedirect("toLogin.do");
//中断处理流程。
return false;
}
//已经登录,继续向后调用
return true;
}
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex)
throws Exception {
}
}
TestCase.java
package test;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dk.oss.dao.AdminDAO;
import com.dk.oss.dao.CostDAO;
import com.dk.oss.entity.Admin;
import com.dk.oss.entity.Cost;
import com.dk.oss.service.AdminService;
import com.dk.oss.service.CostService;
public class TestCase {
@Test
//测试DataSource
public void test1() throws SQLException{
ApplicationContext ac =
new ClassPathXmlApplicationContext(
"app.xml");
DataSource ds =
ac.getBean("ds",DataSource.class);
System.out.println(
ds.getConnection());
}
@Test
//测试DAO
public void test2() {
ApplicationContext ac =
new ClassPathXmlApplicationContext(
"app.xml");
AdminDAO dao =
ac.getBean("adminDAO",
AdminDAO.class);
Admin admin =
dao.findByCode("caocao");
System.out.println(admin);
}
@Test
//测试AdminService
public void test3() {
ApplicationContext ac =
new ClassPathXmlApplicationContext(
"app.xml");
AdminService service =
ac.getBean("adminService",
AdminService.class);
Admin admin =
service.checkLogin("caocao",
"123");
System.out.println(admin.getTelephone());
}
@Test
//测试CostDAO
public void test4() {
ApplicationContext ac =
new ClassPathXmlApplicationContext(
"app.xml");
CostDAO dao =
ac.getBean("costDAO",CostDAO.class);
List<Cost> costs =
dao.findAll();
System.out.println(costs);
}
@Test
//测试CostService
public void test5() {
ApplicationContext ac =
new ClassPathXmlApplicationContext(
"app.xml");
CostService service =
ac.getBean("costService",CostService.class);
List<Cost> costs =
service.list();
System.out.println(costs);
}
}
TestCase2.java
package test;
import java.util.List;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dk.oss.dao.UserDAO;
import com.dk.oss.entity.User;
public class TestCase2 {
@Test
public void test1(){
ApplicationContext ac =
new ClassPathXmlApplicationContext(
"app.xml");
UserDAO dao = ac.getBean("userDAO",
UserDAO.class);
User user = new User();
user.setName("Sally");
user.setAge(22);
dao.save(user);
}
@Test
public void test2(){
ApplicationContext ac =
new ClassPathXmlApplicationContext(
"app.xml");
UserDAO dao = ac.getBean("userDAO",
UserDAO.class);
List<User> users =
dao.findAll();
System.out.println(users);
}
@Test
public void test3(){
ApplicationContext ac =
new ClassPathXmlApplicationContext(
"app.xml");
UserDAO dao = ac.getBean("userDAO",
UserDAO.class);
User user = dao.findById2(2);
System.out.println(user);
}
@Test
public void test4(){
ApplicationContext ac =
new ClassPathXmlApplicationContext(
"app.xml");
UserDAO dao = ac.getBean("userDAO",
UserDAO.class);
User user = dao.findById2(1);
user.setAge(user.getAge() * 2);
dao.update(user);
System.out.println(user);
}
@Test
public void test5(){
ApplicationContext ac =
new ClassPathXmlApplicationContext(
"app.xml");
UserDAO dao = ac.getBean("userDAO",
UserDAO.class);
dao.delete(1);
}
@Test
public void test6(){
ApplicationContext ac =
new ClassPathXmlApplicationContext(
"app.xml");
UserDAO dao = ac.getBean("userDAO",
UserDAO.class);
int rows = dao.getTotalRow();
System.out.println(rows);
}
}
cost.jsp
<%@page pageEncoding="utf-8"
contentType="text/html; charset=utf-8" %>
<%@taglib prefix="c"
uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt"
prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>案例-NetCTOSS</title>
<link type="text/css" rel="stylesheet" media="all" href="styles/global.css" />
<link type="text/css" rel="stylesheet" media="all" href="styles/global_color.css" />
<script language="javascript"
type="text/javascript">
//排序按钮的点击事件
function sort(btnObj) {
if (btnObj.className == "sort_desc")
btnObj.className = "sort_asc";
else
btnObj.className = "sort_desc";
}
//启用
function startFee() {
var r = window.confirm("确定要启用此资费吗?资费启用后将不能修改和删除。");
document.getElementById("operate_result_info").style.display = "block";
}
//删除
function deleteFee() {
var r = window.confirm("确定要删除此资费吗?");
document.getElementById("operate_result_info").style.display = "block";
}
</script>
</head>
<body>
<!--Logo区域开始-->
<div id="header">
<img src="images/logo.png" alt="logo" class="left"/>
<a href="#">[退出]</a>
</div>
<!--Logo区域结束-->
<!--导航区域开始-->
<div id="navi">
<ul id="menu">
<li><a href="../index.html" class="index_off"></a></li>
<li><a href="../role/role_list.html" class="role_off"></a></li>
<li><a href="../admin/admin_list.html" class="admin_off"></a></li>
<li><a href="../fee/fee_list.html" class="fee_on"></a></li>
<li><a href="../account/account_list.html" class="account_off"></a></li>
<li><a href="../service/service_list.html" class="service_off"></a></li>
<li><a href="../bill/bill_list.html" class="bill_off"></a></li>
<li><a href="../report/report_list.html" class="report_off"></a></li>
<li><a href="../user/user_info.html" class="information_off"></a></li>
<li><a href="../user/user_modi_pwd.html" class="password_off"></a></li>
</ul>
</div>
<!--导航区域结束-->
<!--主要区域开始-->
<div id="main">
<form action="" method="">
<!--排序-->
<div class="search_add">
<div>
<!--<input type="button" value="月租" class="sort_asc" onclick="sort(this);" />-->
<input type="button" value="基费" class="sort_asc" onclick="sort(this);" />
<input type="button" value="时长" class="sort_asc" onclick="sort(this);" />
</div>
<input type="button" value="增加" class="btn_add" onclick="location.href='fee_add.html';" />
</div>
<!--启用操作的操作提示-->
<div id="operate_result_info" class="operate_success">
<img src="../images/close.png" onclick="this.parentNode.style.display='none';" />
删除成功!
</div>
<!--数据区域:用表格展示数据-->
<div id="data">
<table id="datalist">
<tr>
<th>资费ID</th>
<th class="width100">资费名称</th>
<th>基本时长</th>
<th>基本费用</th>
<th>单位费用</th>
<th>创建时间</th>
<th>开通时间</th>
<th class="width50">状态</th>
<th class="width200"></th>
</tr>
<c:forEach items="${costs}" var="c">
<tr>
<td>${c.costId }</td>
<td><a href="fee_detail.html">${c.name }</a></td>
<td>${c.baseDuration } 小时</td>
<td>${c.baseCost } 元</td>
<td>${c.unitCost } 元/小时</td>
<td><fmt:formatDate value="${c.creatime }" pattern="yyyy/MM/dd"/></td>
<td><fmt:formatDate value="${c.startime }" pattern="yyyy/MM/dd"/></td>
<td>
<c:if test="${c.status=='0' }">开通</c:if>
<c:if test="${c.status=='1' }">暂停</c:if>
</td>
<td>
<input type="button" value="启用" class="btn_start" onclick="startFee();" />
<input type="button" value="修改" class="btn_modify" onclick="location.href='toUpdateCost.do?id=${c.costId }';" />
<input type="button" value="删除" class="btn_delete" onclick="deleteFee();" />
</td>
</tr>
</c:forEach>
</table>
<p>业务说明:<br />
1、创建资费时,状态为暂停,记载创建时间;<br />
2、暂停状态下,可修改,可删除;<br />
3、开通后,记载开通时间,且开通后不能修改、不能再停用、也不能删除;<br />
4、业务账号修改资费时,在下月底统一触发,修改其关联的资费ID(此触发动作由程序处理)
</p>
</div>
<!--分页-->
<div id="pages">
<a href="#">上一页</a>
<a href="#" class="current_page">1</a>
<a href="#">2</a>
<a href="#">3</a>
<a href="#">4</a>
<a href="#">5</a>
<a href="#">下一页</a>
</div>
</form>
</div>
<!--主要区域结束-->
<div id="footer">
<p>[源自北美的技术,最优秀的师资,最真实的企业环境,最适用的实战项目]</p>
<p>版权所有(C)加拿大达内IT培训集团公司 </p>
</div>
</body>
</html>
error.jsp
<%@page pageEncoding="utf-8"
contentType="text/html; charset=utf-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>案例-NetCTOSS</title>
<link type="text/css" rel="stylesheet" media="all" href="styles/global.css" />
<link type="text/css" rel="stylesheet" media="all" href="styles/global_color.css" />
<script language="javascript" type="text/javascript">
var timer;
//启动跳转的定时器
function startTimes() {
timer = window.setInterval(showSecondes,1000);
}
var i = 5;
function showSecondes() {
if (i > 0) {
i--;
document.getElementById("secondes").innerHTML = i;
}
else {
window.clearInterval(timer);
location.href = "login.html";
}
}
//取消跳转
function resetTimer() {
if (timer != null && timer != undefined) {
window.clearInterval(timer);
location.href = "login.html";
}
}
</script>
</head>
<body class="error_page" onload="startTimes();">
<h1 id="error">
遇到错误, <span id="secondes">5</span> 秒后将自动跳转,立即跳转请点击
<a href="javascript:resetTimer();">返回</a>
</h1>
</body>
</html>
index.jsp
<%@page pageEncoding="utf-8"
contentType="text/html; charset=utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>案例-NetCTOSS</title>
<link type="text/css" rel="stylesheet" media="all" href="styles/global.css" />
<link type="text/css" rel="stylesheet" media="all" href="styles/global_color.css" />
</head>
<body class="index">
<!--导航区域开始-->
<div id="index_navi">
<ul id="menu">
<li><a href="index.html" class="index_on"></a></li>
<li><a href="role/role_list.html" class="role_off"></a></li>
<li><a href="admin/admin_list.html" class="admin_off"></a></li>
<li><a href="fee/fee_list.html" class="fee_off"></a></li>
<li><a href="account/account_list.html" class="account_off"></a></li>
<li><a href="service/service_list.html" class="service_off"></a></li>
<li><a href="bill/bill_list.html" class="bill_off"></a></li>
<li><a href="report/report_list.html" class="report_off"></a></li>
<li><a href="user/user_info.html" class="information_off"></a></li>
<li><a href="user/user_modi_pwd.html" class="password_off"></a></li>
</ul>
</div>
</body>
</html>
login.jsp
<%@page pageEncoding="utf-8"
contentType="text/html; charset=utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>案例-NetCTOSS</title>
<link type="text/css" rel="stylesheet" media="all" href="styles/global.css"/>
<link type="text/css" rel="stylesheet" media="all" href="styles/global_color.css" />
</head>
<body class="index">
<div class="login_box">
<form action="login.do" method="post">
<table>
<tr>
<td class="login_info">账号:</td>
<td colspan="2">
<input name="adminCode" type="text" class="width150" />
</td>
<td class="login_error_info"><span class="required">30长度的字母、数字和下划线</span></td>
</tr>
<tr>
<td class="login_info">密码:</td>
<td colspan="2">
<input name="pwd" type="password" class="width150" />
</td>
<td><span class="required">30长度的字母、数字和下划线</span></td>
</tr>
<tr>
<td class="login_info">验证码:</td>
<td width="width70">
<input name="" type="text" class="width70" />
</td>
<td><img src="images/valicode.jpg" alt="验证码" title="点击更换" /></td>
<td><span class="required">验证码错误</span></td>
</tr>
<tr>
<td></td>
<td class="login_button" colspan="2">
<a href="javascript:document.forms[0].submit();">
<img src="images/login_btn.png" alt="" />
</a>
</td>
<td><span class="required">${errorMsg }</span></td>
</tr>
</table>
</form>
</div>
</body>
</html>
启动Tomcat 运行springcase-netctoss-jdbc工程,测试SessionInterceptor拦截器
录入请求http://localhost:8088/springcase-netctoss-jdbc/index.do
如果打开浏览器已经登录过系统--后台与前台页面:
如果打开浏览器未登录过系统 --后台与前台页面:
发出的请求都会经过拦截器处理。
测试springjdbc:
编写每一个方法对应依次运行test进行测试:
练习:
- 使用springjdbc重写CostDAO。
2.(可选)使用spring提供的异常处理机制
重写登录模块。