Spring MVC + JDBC 实现数据库操作

来源:互联网 发布:logo软件中文版下载 编辑:程序博客网 时间:2024/06/01 07:21

这段时间研究了下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;@Controllerpublic 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

这里写图片描述

原创粉丝点击