这段时间研究了下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,最后搭出来这样一套数据库的调用。也多亏前段时间对设计模式和重构的理解,现在搞这种感觉都是围绕策略、工厂、模板等实现的,万变不离其宗。
最后附上最后程序运行结果,数据库里有几个是中文乱码,展示下是什么样的:
本文介绍了使用Spring MVC和JDBC实现数据库操作的步骤,包括创建Maven Webapp项目,配置pom.xml,编写Student数据类,使用Spring的JDBC模板方法操作数据库,设置Spring的数据库配置bean,处理中文乱码问题,以及实现控制器和视图的跳转。这个简单的Demo展示了如何插入数据,并为查询接口预留了空间。
357

被折叠的 条评论
为什么被折叠?



