spring4 mysql_Spring4 MVC+Hibernate4+MySQL+Maven使用注解集成实例

使用以下技术:

Spring 4.0.6.RELEASE

Hibernate Core 4.3.6.Final

validation-api 1.1.0.Final

hibernate-validator 5.1.3.Final

MySQL Server 5.6

Maven 3

JDK 1.7

Tomcat 8.0.21

Eclipse JUNO Service Release 2

TestNG 6.9.4

Mockito 1.10.19

DBUnit 2.2

H2 Database 1.4.187

现在,让我们开始

第1步:创建目录结构

以下是最终的项目结构:

b171f8d19a6e9f6989b0a4d2f80aeb0c.png

现在让我们来添加上每个细节上述结构中提到的内容。

第2步:更新 pom.xml,包括所需的依赖关系

xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

4.0.0

com.yiibai.springmvc

SpringHibernateExample

war

1.0.0

SpringHibernateExample

4.0.6.RELEASE

4.3.6.Final

5.1.31

2.3

6.9.4

1.10.19

1.4.187

2.2

org.springframework

spring-core

${springframework.version}

org.springframework

spring-web

${springframework.version}

org.springframework

spring-webmvc

${springframework.version}

org.springframework

spring-tx

${springframework.version}

org.springframework

spring-orm

${springframework.version}

org.hibernate

hibernate-core

${hibernate.version}

javax.validation

validation-api

1.1.0.Final

org.hibernate

hibernate-validator

5.1.3.Final

mysql

mysql-connector-java

${mysql.connector.version}

joda-time

joda-time

${joda-time.version}

org.jadira.usertype

usertype.core

3.0.0.CR1

javax.servlet

javax.servlet-api

3.1.0

javax.servlet.jsp

javax.servlet.jsp-api

2.3.1

javax.servlet

jstl

1.2

org.springframework

spring-test

${springframework.version}

test

org.testng

testng

${testng.version}

test

org.mockito

mockito-all

${mockito.version}

test

com.h2database

h2

${h2.version}

test

dbunit

dbunit

${dbunit.version}

test

org.apache.maven.plugins

maven-war-plugin

2.4

src/main/webapp

SpringHibernateExample

false

SpringHibernateExample

首先要注意这里是 maven-war-plugin 插件声明。由于我们使用的是全注解的配置,所以不包函 web.xml 文件在项目中,所以我们需要配置这个插件以避免 Maven 构建 war 包失败。因为在这个例子中,我们将用一个表单来接受来自用户的输入,我们也需要验证用户的输入。在这里我们将选择JSR303验证,所以我们包括验证,API 代表了规范,hibernate-validator它代表本规范的实现。hibernate-validator 还提供了一些它自己的注解(@Email,@NotEmpty等)不属于规范的一部分。

伴随着这一点,我们也包括 JSP/Servlet/Jstl 依赖关系,也将需要为使用的 servlet API和JSTL视图在代码中。在一般情况下,容器可能已经包含了这些库,从而在 pom.xml 中“提供”了我们可以设置的范围。

步骤3:配置Hibernate

com.yiibai.springmvc.configuration.HibernateConfiguration

package com.yiibai.springmvc.configuration;

import java.util.Properties;

import javax.sql.DataSource;

import org.hibernate.SessionFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.PropertySource;

import org.springframework.core.env.Environment;

import org.springframework.jdbc.datasource.DriverManagerDataSource;

import org.springframework.orm.hibernate4.HibernateTransactionManager;

import org.springframework.orm.hibernate4.LocalSessionFactoryBean;

import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration

@EnableTransactionManagement

@ComponentScan({ "com.yiibai.springmvc.configuration" })

@PropertySource(value = { "classpath:application.properties" })

public class HibernateConfiguration {

@Autowired

private Environment environment;

@Bean

public LocalSessionFactoryBean sessionFactory() {

LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();

sessionFactory.setDataSource(dataSource());

sessionFactory.setPackagesToScan(new String[] { "com.yiibai.springmvc.model" });

sessionFactory.setHibernateProperties(hibernateProperties());

return sessionFactory;

}

@Bean

public DataSource dataSource() {

DriverManagerDataSource dataSource = new DriverManagerDataSource();

dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));

dataSource.setUrl(environment.getRequiredProperty("jdbc.url"));

dataSource.setUsername(environment.getRequiredProperty("jdbc.username"));

dataSource.setPassword(environment.getRequiredProperty("jdbc.password"));

return dataSource;

}

private Properties hibernateProperties() {

Properties properties = new Properties();

properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));

properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));

properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));

return properties;

}

@Bean

@Autowired

public HibernateTransactionManager transactionManager(SessionFactory s) {

HibernateTransactionManager txManager = new HibernateTransactionManager();

txManager.setSessionFactory(s);

return txManager;

}

}

@Configuration表示该类包含注解为 @Bean生产Bean管理是由Spring容器的一个或多个bean的方法。在我们的例子中,这个类代表hibernate配置。

@ComponentScan 相当于 context:component-scan base-package="..." 在xml文件中配置, 提供Spring在哪里寻找管理 beans/classes。

@EnableTransactionManagement 相当于 Spring’s tx:* XML 命名空间, 使Spring注解驱动事务管理能力。

@PropertySource 用于声明一组属性(在属性中定义的应用程序类路径文件)在Spring运行时 Environment, 提供了灵活性,可以在不同的应用环境的不同值。

下面是这篇文章中使用的属性文件。

/src/main/resources/application.properties

jdbc.driverClassName = com.mysql.jdbc.Driver

jdbc.url = jdbc:mysql://localhost:3306/yiibai

jdbc.username = root

jdbc.password = passwd123

hibernate.dialect = org.hibernate.dialect.MySQLDialect

hibernate.show_sql = true

hibernate.format_sql = true

第4步:配置Spring MVC

com.yiibai.springmvc.configuration.AppConfig

package com.yiibai.springmvc.configuration;

import org.springframework.context.MessageSource;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.support.ResourceBundleMessageSource;

import org.springframework.web.servlet.ViewResolver;

import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import org.springframework.web.servlet.view.InternalResourceViewResolver;

import org.springframework.web.servlet.view.JstlView;

@Configuration

@EnableWebMvc

@ComponentScan(basePackages = "com.yiibai.springmvc")

public class AppConfig {

@Bean

public ViewResolver viewResolver() {

InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();

viewResolver.setViewClass(JstlView.class);

viewResolver.setPrefix("/WEB-INF/views/");

viewResolver.setSuffix(".jsp");

return viewResolver;

}

@Bean

public MessageSource messageSource() {

ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();

messageSource.setBasename("messages");

return messageSource;

}

}

同样,@Configuration标志着这一类配置类如上所述与器件扫描是指包位置找到相关的Bean类。

@EnableWebMvc相当于mvc:annotation-driven 在XML文件中。

ViewResolver方法配置一个ViewResolver来找出真正的视图。

在这篇文章中,我们提交表单并验证用户输入(通过JSR303注解)。在校验失败后,默认的错误消息会显示。要通过自己的自定义覆盖默认的[国际化]从外部消息包的消息[.properties文件],我们需要配置一个ResourceBundleMessageSource。messageSource方法有同样的目的。请注意,以basename方法提供的参数(消息)。Spring将搜索应用程序类路径中一个名为 messages.properties 的文件。让我们添加的文件:

/src/main/resources/messages.properties

Size.employee.name=Name must be between {2} and {1} characters long

NotNull.employee.joiningDate=Joining Date can not be blank

NotNull.employee.salary=Salary can not be blank

Digits.employee.salary=Only numeric data with max 8 digits and with max 2 precision is allowed

NotEmpty.employee.ssn=SSN can not be blank

typeMismatch=Invalid format

non.unique.ssn=SSN {0} already exist. Please fill in different value.

请注意,上述消息按照特定的模式:

{ValidationAnnotationClass}.{modelObject}.{fieldName}

此外,根据具体注解(如@Size),你也可以用传递参数给这些消息{0},{1},..{i}索引。

步骤5:配置初始化器类

com.yiibai.springmvc.configuration.AppInitializer

package com.yiibai.springmvc.configuration;

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.ServletRegistration;

import org.springframework.web.WebApplicationInitializer;

import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;

import org.springframework.web.servlet.DispatcherServlet;

public class AppInitializer implements WebApplicationInitializer {

public void onStartup(ServletContext container) throws ServletException {

AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();

ctx.register(AppConfig.class);

ctx.setServletContext(container);

ServletRegistration.Dynamic servlet = container.addServlet(

"dispatcher", new DispatcherServlet(ctx));

servlet.setLoadOnStartup(1);

servlet.addMapping("/");

}

}

上面的内容类似于web.xml,因为我们使用的是前端控制器 DispatcherServlet 的内容,分配映射(URL模式的XML),而不是提供给Spring配置文件(spring-servlet.xml)的路径,在这里我们正在注册的配置类。

更新:请注意,上面的类可以写成更加简洁[最佳方法],通过扩展 AbstractAnnotationConfigDispatcherServletInitializer 基类,如下所示:

package com.yiibai.springmvc.configuration;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override

protected Class>[] getRootConfigClasses() {

return new Class[] { AppConfig.class };

}

@Override

protected Class>[] getServletConfigClasses() {

return null;

}

@Override

protected String[] getServletMappings() {

return new String[] { "/" };

}

}

第6步:添加控制器来处理请求

添加控制器这将有助于处理 GET和POST请求。

com.yiibai.springmvc.controller.AppController

package com.yiibai.springmvc.controller;

import java.util.List;

import java.util.Locale;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.MessageSource;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.validation.BindingResult;

import org.springframework.validation.FieldError;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import com.yiibai.springmvc.model.Employee;

import com.yiibai.springmvc.service.EmployeeService;

@Controller

@RequestMapping("/")

public class AppController {

@Autowired

EmployeeService service;

@Autowired

MessageSource messageSource;

/*

* This method will list all existing employees.

*/

@RequestMapping(value = { "/", "/list" }, method = RequestMethod.GET)

public String listEmployees(ModelMap model) {

List employees = service.findAllEmployees();

model.addAttribute("employees", employees);

return "allemployees";

}

/*

* This method will provide the medium to add a new employee.

*/

@RequestMapping(value = { "/new" }, method = RequestMethod.GET)

public String newEmployee(ModelMap model) {

Employee employee = new Employee();

model.addAttribute("employee", employee);

model.addAttribute("edit", false);

return "registration";

}

/*

* This method will be called on form submission, handling POST request for

* saving employee in database. It also validates the user input

*/

@RequestMapping(value = { "/new" }, method = RequestMethod.POST)

public String saveEmployee(@Valid Employee employee, BindingResult result,

ModelMap model) {

if (result.hasErrors()) {

return "registration";

}

/*

* Preferred way to achieve uniqueness of field [ssn] should be implementing custom @Unique annotation

* and applying it on field [ssn] of Model class [Employee].

*

* Below mentioned peace of code [if block] is to demonstrate that you can fill custom errors outside the validation

* framework as well while still using internationalized messages.

*

*/

if(!service.isEmployeeSsnUnique(employee.getId(), employee.getSsn())){

FieldError ssnError =new FieldError("employee","ssn",messageSource.getMessage("non.unique.ssn", new String[]{employee.getSsn()}, Locale.getDefault()));

result.addError(ssnError);

return "registration";

}

service.saveEmployee(employee);

model.addAttribute("success", "Employee " + employee.getName() + " registered successfully");

return "success";

}

/*

* This method will provide the medium to update an existing employee.

*/

@RequestMapping(value = { "/edit-{ssn}-employee" }, method = RequestMethod.GET)

public String editEmployee(@PathVariable String ssn, ModelMap model) {

Employee employee = service.findEmployeeBySsn(ssn);

model.addAttribute("employee", employee);

model.addAttribute("edit", true);

return "registration";

}

/*

* This method will be called on form submission, handling POST request for

* updating employee in database. It also validates the user input

*/

@RequestMapping(value = { "/edit-{ssn}-employee" }, method = RequestMethod.POST)

public String updateEmployee(@Valid Employee employee, BindingResult result,

ModelMap model, @PathVariable String ssn) {

if (result.hasErrors()) {

return "registration";

}

if(!service.isEmployeeSsnUnique(employee.getId(), employee.getSsn())){

FieldError ssnError =new FieldError("employee","ssn",messageSource.getMessage("non.unique.ssn", new String[]{employee.getSsn()}, Locale.getDefault()));

result.addError(ssnError);

return "registration";

}

service.updateEmployee(employee);

model.addAttribute("success", "Employee " + employee.getName()+ " updated successfully");

return "success";

}

/*

* This method will delete an employee by it's SSN value.

*/

@RequestMapping(value = { "/delete-{ssn}-employee" }, method = RequestMethod.GET)

public String deleteEmployee(@PathVariable String ssn) {

service.deleteEmployeeBySsn(ssn);

return "redirect:/list";

}

}

这是一个非常直接的基于Spring的控制器。 @Controller表明这个类是一个控制器在处理与模式映射@RequestMapping请求。这里用“/”,它被作为默认的控制器。

listEmployees方法标注了@ RequestMethod.GET,同时处理默认的网址 “/” 和 ‘/list’。它充当处理应用初始页面,显示现有雇员的列表。

newEmployee方法处理新员工注册页面的GET请求, 表示通过模型 Employee 对象支持页面。

方法 saveEmployee 被注解为@ RequestMethod.POST,并且将处理新员工登记表单提交 POST 请求 (‘/new’)。注间这个方法的参数和它们的顺序。

@Valid要求Spring来验证相关的对象(Employee)。 BindingResult包含此验证,并可能在此验证过程中发生任何错误的结果。请注意,BindingResult必须出现在验证对象,否则Spring将无法验证并且抛出一个异常。 如果验证失败,自定义错误信息(因为我们已经配置在步骤4)中显示。

我们还包括代码检查SSN唯一性,因为它声明要在数据库中具有唯一必。保存/更新员工之前要检查,如果SSN是否独一无二。如果没有,我们生成验证错误和重定向到注册页面。 这个代码展示出一种方式来填充在自定义错误校验框架之外,同时仍使用国际化的信息。

第7步:添加DAO层

com.yiibai.springmvc.dao.AbstractDao

package com.yiibai.springmvc.dao;

import java.io.Serializable;

import java.lang.reflect.ParameterizedType;

import org.hibernate.Criteria;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.springframework.beans.factory.annotation.Autowired;

public abstract class AbstractDao {

private final Class persistentClass;

@SuppressWarnings("unchecked")

public AbstractDao(){

this.persistentClass =(Class) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1];

}

@Autowired

private SessionFactory sessionFactory;

protected Session getSession(){

return sessionFactory.getCurrentSession();

}

@SuppressWarnings("unchecked")

public T getByKey(PK key) {

return (T) getSession().get(persistentClass, key);

}

public void persist(T entity) {

getSession().persist(entity);

}

public void delete(T entity) {

getSession().delete(entity);

}

protected Criteria createEntityCriteria(){

return getSession().createCriteria(persistentClass);

}

}

这个通用类是所有的DAO实现类的基类。它提供包装方法也是常见的hibernate 操作。

注意上面,我们已经在前面第3步创建了SessionFactory,在这里将自动装配。

com.yiibai.springmvc.dao.EmployeeDao

package com.yiibai.springmvc.dao;

import java.util.List;

import com.yiibai.springmvc.model.Employee;

public interface EmployeeDao {

Employee findById(int id);

void saveEmployee(Employee employee);

void deleteEmployeeBySsn(String ssn);

List findAllEmployees();

Employee findEmployeeBySsn(String ssn);

}

com.yiibai.springmvc.dao.EmployeeDaoImpl

package com.yiibai.springmvc.dao;

import java.util.List;

import org.hibernate.Criteria;

import org.hibernate.Query;

import org.hibernate.criterion.Restrictions;

import org.springframework.stereotype.Repository;

import com.yiibai.springmvc.model.Employee;

@Repository("employeeDao")

public class EmployeeDaoImpl extends AbstractDao implements EmployeeDao {

public Employee findById(int id) {

return getByKey(id);

}

public void saveEmployee(Employee employee) {

persist(employee);

}

public void deleteEmployeeBySsn(String ssn) {

Query query = getSession().createSQLQuery("delete from Employee where ssn = :ssn");

query.setString("ssn", ssn);

query.executeUpdate();

}

@SuppressWarnings("unchecked")

public List findAllEmployees() {

Criteria criteria = createEntityCriteria();

return (List) criteria.list();

}

public Employee findEmployeeBySsn(String ssn) {

Criteria criteria = createEntityCriteria();

criteria.add(Restrictions.eq("ssn", ssn));

return (Employee) criteria.uniqueResult();

}

}

第8步:添加服务层

com.yiibai.springmvc.service.EmployeeService

package com.yiibai.springmvc.service;

import java.util.List;

import com.yiibai.springmvc.model.Employee;

public interface EmployeeService {

Employee findById(int id);

void saveEmployee(Employee employee);

void updateEmployee(Employee employee);

void deleteEmployeeBySsn(String ssn);

List findAllEmployees();

Employee findEmployeeBySsn(String ssn);

boolean isEmployeeSsnUnique(Integer id, String ssn);

}

com.yiibai.springmvc.service.EmployeeServiceImpl

package com.yiibai.springmvc.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

import com.yiibai.springmvc.dao.EmployeeDao;

import com.yiibai.springmvc.model.Employee;

@Service("employeeService")

@Transactional

public class EmployeeServiceImpl implements EmployeeService {

@Autowired

private EmployeeDao dao;

public Employee findById(int id) {

return dao.findById(id);

}

public void saveEmployee(Employee employee) {

dao.saveEmployee(employee);

}

/*

* Since the method is running with Transaction, No need to call hibernate update explicitly.

* Just fetch the entity from db and update it with proper values within transaction.

* It will be updated in db once transaction ends.

*/

public void updateEmployee(Employee employee) {

Employee entity = dao.findById(employee.getId());

if(entity!=null){

entity.setName(employee.getName());

entity.setJoiningDate(employee.getJoiningDate());

entity.setSalary(employee.getSalary());

entity.setSsn(employee.getSsn());

}

}

public void deleteEmployeeBySsn(String ssn) {

dao.deleteEmployeeBySsn(ssn);

}

public List findAllEmployees() {

return dao.findAllEmployees();

}

public Employee findEmployeeBySsn(String ssn) {

return dao.findEmployeeBySsn(ssn);

}

public boolean isEmployeeSsnUnique(Integer id, String ssn) {

Employee employee = findEmployeeBySsn(ssn);

return ( employee == null || ((id != null) && (employee.getId() == id)));

}

}

上面最有趣的部分是 @Transactional 它开始在每个方法启动一个事务,并提交其上的每个方法退出(或回滚,如果方法失败,会发生是一个错误)。 注意,因为该事务是在方法范围,和内部的方法,我们将使用DAO,DAO方法将在同一事务内执行。

第9步:创建域实体类(POJO)

让我们创建实际的员工实体数据表。

com.yiibai.springmvc.model.Employee

package com.yiibai.springmvc.model;

import java.math.BigDecimal;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.GenerationType;

import javax.persistence.Id;

import javax.persistence.Table;

import javax.validation.constraints.Digits;

import javax.validation.constraints.NotNull;

import javax.validation.constraints.Size;

import org.hibernate.annotations.Type;

import org.hibernate.validator.constraints.NotEmpty;

import org.joda.time.LocalDate;

import org.springframework.format.annotation.DateTimeFormat;

@Entity

@Table(name="EMPLOYEE")

public class Employee {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private int id;

@Size(min=3, max=50)

@Column(name = "NAME", nullable = false)

private String name;

@NotNull

@DateTimeFormat(pattern="dd/MM/yyyy")

@Column(name = "JOINING_DATE", nullable = false)

@Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDate")

private LocalDate joiningDate;

@NotNull

@Digits(integer=8, fraction=2)

@Column(name = "SALARY", nullable = false)

private BigDecimal salary;

@NotEmpty

@Column(name = "SSN", unique=true, nullable = false)

private String ssn;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public LocalDate getJoiningDate() {

return joiningDate;

}

public void setJoiningDate(LocalDate joiningDate) {

this.joiningDate = joiningDate;

}

public BigDecimal getSalary() {

return salary;

}

public void setSalary(BigDecimal salary) {

this.salary = salary;

}

public String getSsn() {

return ssn;

}

public void setSsn(String ssn) {

this.ssn = ssn;

}

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + id;

result = prime * result + ((ssn == null) ? 0 : ssn.hashCode());

return result;

}

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (!(obj instanceof Employee))

return false;

Employee other = (Employee) obj;

if (id != other.id)

return false;

if (ssn == null) {

if (other.ssn != null)

return false;

} else if (!ssn.equals(other.ssn))

return false;

return true;

}

@Override

public String toString() {

return "Employee [id=" + id + ", name=" + name + ", joiningDate="

+ joiningDate + ", salary=" + salary + ", ssn=" + ssn + "]";

}

}

这是注明使用JPA注解@Entity,@Table,@Column 使用 hibernate的具体注释@Type,我们正在使用提供数据库中的数据类型和LocalDate之间的映射标准的实体类。

@DateTimeFormat是一个 Spring 的具体注解声明,字段应该使用一个给定格式格式化日期时间。

第10步:添加视图/JSP

WEB-INF/views/allemployees.jsp [主页包含所有现有员工列表]

pageEncoding="uft-8"%>

University Enrollments

tr:first-child{

font-weight: bold;

background-color: #C6C9C4;

}

List of Employees

NAMEJoining DateSalarySSN
${employee.name}${employee.joiningDate}${employee.salary}${employee.ssn}delete

Add New Employee

WEB-INF/views/registration.jsp [注册页面用来创建和保存在数据库中的新员工]

pageEncoding="ISO-8859-1"%>

Employee Registration Form

.error {

color: #ff0000;

}

Registration Form

Name:
Joining Date:
Salary:
SSN:

Go back to List of All Employees

WEB-INF/views/success.jsp [包括成功页面新员工创建一个确认,并链接回员工列表]

pageEncoding="utf-8"%>

Registration Confirmation Page

message : ${success}

Go back to List of All Employees

第11步:在数据库创建模式

CREATE TABLE EMPLOYEE(

id INT NOT NULL auto_increment,

name VARCHAR(50) NOT NULL,

joining_date DATE NOT NULL,

salary DOUBLE NOT NULL,

ssn VARCHAR(30) NOT NULL UNIQUE,

PRIMARY KEY (id)

);

第12步:构建,部署和运行应用程序

现在构建(参考提到的前面Eclipse教程)或通过Maven的命令行( mvn clean install). 部署War到Servlet3.0容器。

打开浏览器,浏览: http://localhost:8080/SpringHibernateExample/

a23652d780bd275cf1f75e4948551e47.png

现在,点击“Add New Employee”,并点击注册按钮但不填写任何信息:

f29bfa0b02a5f1436f117c8243427c9f.png

现在填写详细信息

0abdd41dbcd8accff4b39b6f378271f3.png

点击注册(Register),应该得到类似的东西:

71826bf5d301ee3f4de5f1ac36d3ac3f.png

点击列表,进入列表:

fcdeb04dc3c259364aaf8ebf74e3b807.png

现在添加几个记录和以前一样:

c44a383161ab135ae5708baea5dcf6fd.png

现在点击第二记录的删除链接,它应该被删除了,如下图:

ec9bce4676ff665f45fb1cce8dcf91f0.png

现在点击SSN链接(这是一个更新),第二要记录要更新:

78413a45ae712a31397962bfc0914985.png

现在,编辑一些字段,此外SSN值更改为现有的记录中的值:

711f96e47f65400b25b47527f564ba60.png

尝试更新,你应该得到验证错误的SSN:

e87566fb7e0a1d08752f7449a6191949.png

修正了错误,通过改变SSN以唯一值更新,然后查看记录的完整列表,看到更新有了变化(这里修改SSN为:123456):

d777d21af6d0a42c0a0902751d66a20b.png

最后,查看数据库在这时是:

82a8cee25525d3c6b86ea77cf3d8ea49.png

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值