Spring MVC + JDBC 实现数据库操作

本文介绍了使用Spring MVC和JDBC实现数据库操作的步骤,包括创建Maven Webapp项目,配置pom.xml,编写Student数据类,使用Spring的JDBC模板方法操作数据库,设置Spring的数据库配置bean,处理中文乱码问题,以及实现控制器和视图的跳转。这个简单的Demo展示了如何插入数据,并为查询接口预留了空间。

这段时间研究了下Spring,确实很强大,对于数据库的操作也学习了一下,以JDBC为切入点,先把SpringJDBC的基本调用搞懂了,然后想编写个Demo来操作JDBC调用mysql数据库。本来想用Android作为界面实现,但是既然用了Spring,就顺便学一下SpringMVC,于是就有了下面这个小Demo。由于只支持了Mysql,就没有在考虑策略模式来支持多数据库,直接上来就是mysql的耦合连接。

先是用Maven new一个webapp出来,然后配置工程的Java build path为1.8,这样工程里就会自动出现我们需要的src/main/java文件夹。
整个工程的文件结构如下图:
文件结构
工程建完以后配置pom:
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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.xiakaihui.springmvc</groupId>
  <artifactId>TextBox</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>TextBox Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.9.RELEASE</version>
    </dependency>

    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.0-b07</version>
    </dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.34</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.3.9.RELEASE</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>TextBox</finalName>
  </build>
</project>

先把Student这个最基本数据类建好:
Student.java

package com.xiakaihui.springmvc;

public class Student {
    private Integer age;
    private String  name;
    private Integer id;
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }

}

这样配置就可以了。spring-mvc会把spring里基本我们需要的包,包括spring-core、spring-context都自动配置进来,maven确实很人性化。
mysql-connector是为了建立mysql数据库连接的,而spring-jdbc可以让我们用spring提供的框架跟方便安全健壮得建立数据库连接和调用数据库。

既然是数据库操作,那就先把数据库操作的类给写好:

JDBCOperater.java

package com.xiakaihui.springmvc.JDBC;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.xiakaihui.springmvc.Student;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
public class JDBCOperater extends NamedParameterJdbcDaoSupport {


    public void insertNamedParameter(Student student) {
        String sql = "INSERT INTO Student(ID, NAME, AGE)"
                + "VALUES(:id, :name, :age)";
        Map<String, Object> parameters = new HashMap<String, Object>();
        parameters.put("name", student.getName());
        parameters.put("age", student.getAge());
        parameters.put("id", student.getId());

        getNamedParameterJdbcTemplate().update(sql, parameters);
    }

    public Student findByStudentId(int Id) {
        String sql = "SELECT * FROM Student WHERE ID = ?";
        Student student = getJdbcTemplate().queryForObject(sql, new Object[] {Id}, new BeanPropertyRowMapper<Student>(Student.class));
        return student;
    }

    public List<Student> findAll() {
        String sql = "SELECT * FROM Student";

        List<Student> students = getJdbcTemplate().query(sql, new BeanPropertyRowMapper<Student>(Student.class));
        return students;
    }

}

这里用了Spring的getNamedParameterJdbcTemplate,来直接对数据库插入我们所要的对象,getJdbcTemplate也是很重要的Spring JDBC操作类,这里用它查询数据库,它的queryForObject会根据我们的需求自动为我们封装对象值。
我们因尽量用Spring提供的Template方法来操作数据库,而不是自己根据mysql-connector-java来再写一套,当然用来学习下是可以。但是毕竟Spring做的更加稳定,它处理异常和关闭连接也更加全面和安全。

接下来就是写好Spring关于数据库调用的bean文件:

Sping-Database.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mysql"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"></property>
    </bean>
    <bean id="student" class="com.xiakaihui.springmvc.JDBC.JDBCOperater">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>

这里创建数据库时要注意,要这样CREATE TABLE **()charset utf8 collate utf8_general_ci;不然会出现java.sql.SQLException: Incorrect string value:
‘\xE6\x88\x91\xE7\x9A\x84…’ for column的错误,就是因为你传给数据库的是UTF-8,但是建表的时候不是UTF-8的,所以数据库不认就会抛异常。

数据库的操作已经写完了,然后我们把页面跳转给写好:
StudentController.java

package com.xiakaihui.springmvc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import com.xiakaihui.springmvc.JDBC.JDBCOperater;

@Controller
public class StudentController {

    @RequestMapping(value="/student", method=RequestMethod.GET)
    public ModelAndView student() {
        Student st = new Student();
        return new ModelAndView("student", "command", st);
    }

    @RequestMapping(value="/addStudent", method=RequestMethod.POST)
    public String addStudent(@ModelAttribute("SpringWeb")Student student, Model model) {
        model.addAttribute("name", student.getName());
        model.addAttribute("age", student.getAge());
        model.addAttribute("id", student.getId());
        ApplicationContext context = new ClassPathXmlApplicationContext("Spring-Database.xml");
        JDBCOperater jdbcOp = (JDBCOperater) context.getBean("student");
        jdbcOp.insertNamedParameter(student);
        ((ConfigurableApplicationContext)context).close();
        return "result";
    }
}

这段代码的原理很简单,要注意的是这段代码:
((ConfigurableApplicationContext)context).close();要记得读完bean之后要把上下文给close掉,防止泄露。

好了,先是web制定servlet
web.xml

<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_3_0.xsd"
   id="WebApp_ID" version="3.0">

   <display-name>HelloWorldSpring</display-name>

   <servlet>
       <servlet-name>spring-mvc</servlet-name>
       <servlet-class>
           org.springframework.web.servlet.DispatcherServlet
       </servlet-class>
       <load-on-startup>1</load-on-startup>
   </servlet>   

   <servlet-mapping>
       <servlet-name>spring-mvc</servlet-name>
       <url-pattern>/</url-pattern>
   </servlet-mapping>

   <!-- Servlet Encoding Start -->  
    <filter>  
        <filter-name>Set Character Encoding</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>  
        <init-param>  
            <param-name>forceEncoding</param-name>  
            <param-value>true</param-value>  
        </init-param>  
    </filter>  
    <filter-mapping>  
        <filter-name>Set Character Encoding</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>  
    <!-- Servlet Encoding End -->  
</web-app>

这个filter是我刚写的时候为了解决中文乱码问题的,这是网页显示的中文乱码问题,上面是解决数据库的中文乱码问题。

下面就是servlet的配置了
spring-mvc-servlet.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:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="com.xiakaihui.springmvc"/>
    <context:annotation-config/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
           <value>/WEB-INF/jsp/</value>
       </property>

       <property name="suffix">
           <value>.jsp</value>
       </property>
    </bean>
</beans>

springmvc的controller类已经用了,基本的servlet配置也已近ok,接下来就是我们要跳转的两个jsp了:
student.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h2>学生信息</h2>
    <form:form method="POST" action="/TextBox/addStudent">
        <table>
            <tr>
                <td><form:label path="name">姓名:</form:label></td>
                <td><form:input path="name"/></td>
            </tr>
            <tr>
                <td><form:label path="age">年龄:</form:label></td>
                <td><form:input path="age"/></td>
            </tr>
            <tr>
                <td><form:label path="id">编号:</form:label></td>
                <td><form:input path="id"/></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="提交学生信息"/></td>
            </tr>
        </table>
    </form:form>
</body>
</html>

result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring mvc 表单处理-输入框处理</title>
</head>
<body>
    <h2>提交的学生信息如下</h2>
    <table>
        <tr>
            <td>姓名</td>
            <td>${name}</td>
        </tr>
        <tr>
            <td>年龄</td>
            <td>${age}</td>
        </tr>
        <tr>
            <td>编号</td>
            <td>${id}</td>
        </tr>
    </table>
</body>
</html>

这里要注意<%@taglib uri=”http://www.springframework.org/tags/form” prefix=”form”%>这个配置,说明是表单,不然文本框无法显示。
还有编码都要改为UTF-8,不然中文会乱码。

好了,这就是Spring + jdbc + Springmvc实现的简单Demo虽然现在只写了一个插入,但是基本框架已经用了,查询接口已经预留好,以后随着对SpringMVC的理解会再完善这个Demo。

但是实现这个小Demo确实花了一个月时间,每天加完班去完健身房回到家看和敲一个多小时再睡觉。从对spring的一无所知,到能简单的通过spring调用数据库,再到对jdbc的深入学习,也顺便熟悉了mysql的基本语法,为了能够界面展示抛弃了用过的Android,继续学习SpringMVC,最后搭出来这样一套数据库的调用。也多亏前段时间对设计模式和重构的理解,现在搞这种感觉都是围绕策略、工厂、模板等实现的,万变不离其宗。
最后附上最后程序运行结果,数据库里有几个是中文乱码,展示下是什么样的:
student

addStudent

这里写图片描述

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值