java hibernate用注解 mysql例子_Spring 4 MVC+Hibernate 4+MySQL+Maven使用注解集成实例

Spring 4 MVC+Hibernate 4+MySQL+Maven使用注解集成实例

2017-01-23

目录:

注意:若没有springmvc基础,在看此篇前可看下这篇文章Spring4 MVC HelloWord实例 ,这篇文章是主要讲述MVC中的control层如何操作model和返回view,且以xml文件进行bean注入。

使用基于注解的配置集成Spring和Hibernate。 我们将开发包含表单要求用户输入一个简单的CRUD为导向Web应用程序,使用Hibernate保存输入的数据到 MySQL 数据库,从数据库和更新检索记录或删除它们在事务中,全部采用注解配置。

使用以下技术:

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步:创建目录结构

30af0f6471a8a409fa37ad02123248f9.png

第2步:更新 pom.xml

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

4.0.0

com.websystique.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.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

View Code

注意:

maven的war包插件(maven-war-plugin)的声明:由于我们使用全注解方式进行配置。甚至在我们的工程当中没有包含web.xml文件。所以我们要配置这个插件,以避免maven在构建war包的时候失败。

验证用户的输入:在这个样例工程中,由于使用表单接受用户的输入。所以需要验证用户的输入。这里将选择JSR303 进行验证。所以我们要引入验证接口(validation-api)来说明这种规范。hibernate验证(hibernate-validator)正好是这种规范的一种实现。hibernate验证(hibernate-validator)同时也通过了他特有的注解校验(@Email, @NotEmpty等),这些并不是规范所囊括的。

其他依赖:我们也包含了(JSP/Servlet/Jstl)依赖。在我们代码中使用servelet api和jstl视图的时候需要。总而验证,容器需要包含这些jar包。所以我们在pom.xml文件当中去设置,这样maven才能下载他们。我们同时也需要测试依赖。测试部分将在下面的章节中讨论。剩下的部分是Spring,hibernate和Joda-Time等的依赖了。

第3步:配置hibernate

3.1 com.websystique.springmvc.configuration.HibernateConfiguration

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.websystique.springmvc.configuration;importjava.util.Properties;importjavax.sql.DataSource;importorg.hibernate.SessionFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.ComponentScan;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.PropertySource;importorg.springframework.core.env.Environment;importorg.springframework.jdbc.datasource.DriverManagerDataSource;importorg.springframework.orm.hibernate4.HibernateTransactionManager;importorg.springframework.orm.hibernate4.LocalSessionFactoryBean;importorg.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration

@EnableTransactionManagement

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

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

@AutowiredprivateEnvironment environment;

@BeanpublicLocalSessionFactoryBean sessionFactory() {

LocalSessionFactoryBean sessionFactory= newLocalSessionFactoryBean();

sessionFactory.setDataSource(dataSource());

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

sessionFactory.setHibernateProperties(hibernateProperties());returnsessionFactory;

}

@BeanpublicDataSource dataSource() {

DriverManagerDataSource dataSource= newDriverManagerDataSource();

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

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

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

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

}privateProperties hibernateProperties() {

Properties properties= newProperties();

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"));returnproperties;

}

@Bean

@AutowiredpublicHibernateTransactionManager transactionManager(SessionFactory s) {

HibernateTransactionManager txManager= newHibernateTransactionManager();

txManager.setSessionFactory(s);returntxManager;

}

}

View Code

注意:

@Configuration 注解表示这个类包含一个或多个使用了 @Bean 注解了的方法。将被spring容器所管理以产生beans。在这里。这个类代表hibernate配置。

@ComponentScan 注解等同于XML配置文件中的context:component-scan base-package="..." 声明。用它来表示去哪里查找spring管理的beans/classes

@EnableTransactionManagement  注解等同于SpringXMl中的tx:*命名空间声明。它将启用Spring注解驱动的事务管理功能。

@PropertySource注解用于声明一组属性(在程序的classpath路径下的properties文件中定义),在spring运行环境下。通过他可以在不同运行环境下进行变更以提供不同的值。

由于@PropertySource注解提供的便利,我们可以在properties文件中提供具体的值,通过Spring’s Environment来提取这些值。

方法sessionFactory() 将创建LocalSessionFactoryBean,它映射配置:dataSource和hibernate属性文件配置(就像hibernate.properties文件)。

一旦SessionFactory创建,它将被注入bean方法transactionManager 中,最终可能对sessionFactory所创建的sesstions提供事务支持。

3.2 /src/main/resources/application.properties

jdbc.driverClassName = com.mysql.jdbc.Driver

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

jdbc.username = myuser

jdbc.password = mypassword

hibernate.dialect = org.hibernate.dialect.MySQLDialect

hibernate.show_sql = true

hibernate.format_sql = true

第4步:配置Spring MVC

4.1 com.websystique.springmvc.configuration.AppConfig

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.websystique.springmvc.configuration;importorg.springframework.context.MessageSource;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.ComponentScan;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.support.ResourceBundleMessageSource;importorg.springframework.web.servlet.ViewResolver;importorg.springframework.web.servlet.config.annotation.EnableWebMvc;importorg.springframework.web.servlet.view.InternalResourceViewResolver;importorg.springframework.web.servlet.view.JstlView;

@Configuration

@EnableWebMvc

@ComponentScan(basePackages= "com.websystique.springmvc")public classAppConfig {

@BeanpublicViewResolver viewResolver() {

InternalResourceViewResolver viewResolver= newInternalResourceViewResolver();

viewResolver.setViewClass(JstlView.class);

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

viewResolver.setSuffix(".jsp");returnviewResolver;

}

@BeanpublicMessageSource messageSource() {

ResourceBundleMessageSource messageSource= newResourceBundleMessageSource();

messageSource.setBasename("messages");returnmessageSource;

}

}

View Code

注意:

@Configuration注解标示着这个类被配置后的作用,就像上面提到的那样(表示这个类包含一个或多个使用了 @Bean 注解了的方法。将被spring容器所管理以产生beans。),

@ComponentScan注解指出了可以在这些包路径下找到相关联的beans类。

@EnableWebMvc注解相当于XML文件中的mvc:annotation-driven(启用web的MVC控制)。方法viewResolver配置了一个视图解析器。以定位到具体的视图页面。

4.2 /src/main/resources/messages.properties

在这篇文章中,我们使用表单进行提交,通过JSR303规范验证用户的输入。在验证失败的情况下,默认的错误信息将显示。你可以通过国际化的方式在其他消息绑定文件(以.properties结尾的文件)中定义适用于你语言环境的消息。在basename方法中。spring会程序运行的class路径中检索一个叫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步:配置初始化类

5.1 com.websystique.springmvc.configuration.AppInitializer

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.websystique.springmvc.configuration;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.ServletRegistration;importorg.springframework.web.WebApplicationInitializer;importorg.springframework.web.context.support.AnnotationConfigWebApplicationContext;importorg.springframework.web.servlet.DispatcherServlet;public class AppInitializer implementsWebApplicationInitializer {public void onStartup(ServletContext container) throwsServletException {

AnnotationConfigWebApplicationContext ctx= newAnnotationConfigWebApplicationContext();

ctx.register(AppConfig.class);

ctx.setServletContext(container);

ServletRegistration.Dynamic servlet=container.addServlet("dispatcher", newDispatcherServlet(ctx));

servlet.setLoadOnStartup(1);

servlet.addMapping("/");

}

}

View Code

注意:

上面的代码类似于web.xml文件的内容。由于我们使用了前端控制器(DispatherServler),分配这些映射(就像xml文件中的url-pattern那样)。通过上面的方法,我们就不用在spring-servlet.xml文件中去配置路径了。这里我们注册了这个配置类。

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

添加这个控制器,可以对get和post请求提供服务。

6.1 com.websystique.springmvc.controller.AppController

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.websystique.springmvc.controller;importjava.util.List;importjava.util.Locale;importjavax.validation.Valid;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.context.MessageSource;importorg.springframework.stereotype.Controller;importorg.springframework.ui.ModelMap;importorg.springframework.validation.BindingResult;importorg.springframework.validation.FieldError;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importcom.websystique.springmvc.model.Employee;importcom.websystique.springmvc.service.EmployeeService;

@Controller

@RequestMapping("/")public classAppController {

@Autowired

EmployeeService service;

@Autowired

MessageSource messageSource;/** This method will list all existing employees.*/@RequestMapping(value= { "/", "/list" }, method =RequestMethod.GET)publicString 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)publicString newEmployee(ModelMap model) {

Employee employee= newEmployee();

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)publicString 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", newString[]{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)publicString 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)publicString 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", newString[]{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)publicString deleteEmployee(@PathVariable String ssn) {

service.deleteEmployeeBySsn(ssn);return "redirect:/list";

}

}

View Code

注意:

@Controller。这个注解表明这个类是用来处理请求的控制类。通过注解@RequestMapping提供将要处理的请求URL路径。这里我们配置的是根目录'/'。它将作为默认的控制器。

方法listEmployees,被@RequestMethod.GET所注解。将处理来自'/'和'/list'的请求。它接管了程序初始化页面的处理,并响应所有存在的员工列表。

方法newEmployee 处理来着新员工注册页面的请求。显示页面由一个Employee对象模型。

方法saveEmployee 被@RequestMethod.POST所注解。它将处理表单提交的post请求(在进行新员工注册的时候,提交请求道url路径:/new)。注意这个方法的参数和这些参数在方法中的顺序。@Valid 注解将要求spring去验证这些关联的对象(Employee)。参数 BindingResult包含了这个验证的结果和任何在验证过程中报出的错误信息。请注意这个参数 BindingResult 必须紧跟在被验证的对象之后。否则spring无法进行验证并且有异常被抛出。在验证出错的情况下。响应的错误消息将会显示(我们在第4步配置的那些消息)。我们同时也包含了对SSN唯一性进行核对的校验。因为他在数据库中被声明为唯一的。在保存和更新一个员工之前。我们要核对这个SSN是否是唯一的。如果不是。我们将生成校验错误的信息并且重定向到注册页面。这段代码演示了在校验框架之外填写客户错误信息的情况,不过还是用message.properties文件中配置的信息(你可以通过国际化的方式进行定制)。

方法editEmployee 将定位到注册页面,并把员工的详细信息填充 到页面的控件当中。在你点击页面的更新按钮进行更新而出发的更新员工资料请求的时候。

方法deleteEmployee 处理根据员工SSN值删除员工数据的请求。注意@PathVariable注解,他表示这个参数将被在uri模板中绑定(我们这里就是SSN的值)

第7步:添加DAO层

随着基于注释的配置,这是我们需要做的。为了进一步完善程序。我们添加服务层,dao层。视图层。领域对象层和一个简单的数据库模式。最后运行这个程序吧。

7.1 com.websystique.springmvc.dao.AbstractDao

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.websystique.springmvc.dao;importjava.io.Serializable;importjava.lang.reflect.ParameterizedType;importorg.hibernate.Criteria;importorg.hibernate.Session;importorg.hibernate.SessionFactory;importorg.springframework.beans.factory.annotation.Autowired;public abstract class AbstractDao{private final ClasspersistentClass;

@SuppressWarnings("unchecked")publicAbstractDao(){this.persistentClass =(Class) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[1];

}

@AutowiredprivateSessionFactory sessionFactory;protectedSession getSession(){returnsessionFactory.getCurrentSession();

}

@SuppressWarnings("unchecked")publicT getByKey(PK key) {return(T) getSession().get(persistentClass, key);

}public voidpersist(T entity) {

getSession().persist(entity);

}public voiddelete(T entity) {

getSession().delete(entity);

}protectedCriteria createEntityCriteria(){returngetSession().createCriteria(persistentClass);

}

}

View Code

这个泛型抽象类是所有DAO实现类的父类。它提供了所有hibernate操作的通用方法。请注意上面。我们在第3步创建的SessionFactory对象将会被Spring容器自动装载。

7.2 com.websystique.springmvc.dao.EmployeeDao

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.websystique.springmvc.dao;importjava.util.List;importcom.websystique.springmvc.model.Employee;public interfaceEmployeeDao {

Employee findById(intid);voidsaveEmployee(Employee employee);voiddeleteEmployeeBySsn(String ssn);

ListfindAllEmployees();

Employee findEmployeeBySsn(String ssn);

}

View Code

7.3 com.websystique.springmvc.dao.EmployeeDaoImpl

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.websystique.springmvc.dao;importjava.util.List;importorg.hibernate.Criteria;importorg.hibernate.Query;importorg.hibernate.criterion.Restrictions;importorg.springframework.stereotype.Repository;importcom.websystique.springmvc.model.Employee;

@Repository("employeeDao")public class EmployeeDaoImpl extends AbstractDao implementsEmployeeDao {public Employee findById(intid) {returngetByKey(id);

}public voidsaveEmployee(Employee employee) {

persist(employee);

}public voiddeleteEmployeeBySsn(String ssn) {

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

query.setString("ssn", ssn);

query.executeUpdate();

}

@SuppressWarnings("unchecked")public ListfindAllEmployees() {

Criteria criteria=createEntityCriteria();return (List) criteria.list();

}publicEmployee findEmployeeBySsn(String ssn) {

Criteria criteria=createEntityCriteria();

criteria.add(Restrictions.eq("ssn", ssn));return(Employee) criteria.uniqueResult();

}

}

View Code

第8步:添加服务层

8.1 com.websystique.springmvc.service.EmployeeService

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.websystique.springmvc.service;importjava.util.List;importcom.websystique.springmvc.model.Employee;public interfaceEmployeeService {

Employee findById(intid);voidsaveEmployee(Employee employee);voidupdateEmployee(Employee employee);voiddeleteEmployeeBySsn(String ssn);

ListfindAllEmployees();

Employee findEmployeeBySsn(String ssn);booleanisEmployeeSsnUnique(Integer id, String ssn);

}

View Code

8.2 com.websystique.springmvc.service.EmployeeServiceImpl

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.websystique.springmvc.service;importjava.util.List;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importorg.springframework.transaction.annotation.Transactional;importcom.websystique.springmvc.dao.EmployeeDao;importcom.websystique.springmvc.model.Employee;

@Service("employeeService")

@Transactionalpublic class EmployeeServiceImpl implementsEmployeeService {

@AutowiredprivateEmployeeDao dao;public Employee findById(intid) {returndao.findById(id);

}public voidsaveEmployee(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 voidupdateEmployee(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 voiddeleteEmployeeBySsn(String ssn) {

dao.deleteEmployeeBySsn(ssn);

}public ListfindAllEmployees() {returndao.findAllEmployees();

}publicEmployee findEmployeeBySsn(String ssn) {returndao.findEmployeeBySsn(ssn);

}public booleanisEmployeeSsnUnique(Integer id, String ssn) {

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

}

}

View Code

注意:

@Transactional注解了。它将在每个方法调用的时候开启事务。在每个方法结束的时候提交事务(或者在方法执行失败并产生错误的时候回滚他)。请注意,由于transaction注解是基于方法领域的。在方法里面我们使用DAO对象。dao方法将在同一个事务当中执行。

第9步:创建领域对象(普通的java bean对象)

让我们创建这个实际的雇员实体对象。在数据里面有一张与之对应的。这个对象用于实例化这些数据。

9.1com.websystique.springmvc.model.Employee

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.websystique.springmvc.model;importjava.math.BigDecimal;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.Table;importjavax.validation.constraints.Digits;importjavax.validation.constraints.NotNull;importjavax.validation.constraints.Size;importorg.hibernate.annotations.Type;importorg.hibernate.validator.constraints.NotEmpty;importorg.joda.time.LocalDate;importorg.springframework.format.annotation.DateTimeFormat;

@Entity

@Table(name="EMPLOYEE")public classEmployee {

@Id

@GeneratedValue(strategy=GenerationType.IDENTITY)private intid;

@Size(min=3, max=50)

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

@NotNull

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

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

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

@NotNull

@Digits(integer=8, fraction=2)

@Column(name= "SALARY", nullable = false)privateBigDecimal salary;

@NotEmpty

@Column(name= "SSN", unique=true, nullable = false)privateString ssn;public intgetId() {returnid;

}public void setId(intid) {this.id =id;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}publicLocalDate getJoiningDate() {returnjoiningDate;

}public voidsetJoiningDate(LocalDate joiningDate) {this.joiningDate =joiningDate;

}publicBigDecimal getSalary() {returnsalary;

}public voidsetSalary(BigDecimal salary) {this.salary =salary;

}publicString getSsn() {returnssn;

}public voidsetSsn(String ssn) {this.ssn =ssn;

}

@Overridepublic inthashCode() {final int prime = 31;int result = 1;

result= prime * result +id;

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

}

@Overridepublic booleanequals(Object obj) {if (this ==obj)return true;if (obj == null)return false;if (!(obj instanceofEmployee))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;

}

@OverridepublicString toString() {return "Employee [id=" + id + ", name=" + name + ", joiningDate="

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

}

}

View Code

注意:

@Entity, @Table, @Column  和hibernate 特有的注解

@Type 所标注(我们将是通过他来映射Joda-Time的LocalDate对象和数据库的date type)。

@DateTimeFormat是spring所特有的注解,用于声明一个字段应该被给定的时间格式来格式化。

余下的注解是JSR303相关的验证。回调第四步我们已经配置好的属性文件(messages.properties)。在验证失败的情况下提供相应的消息。

第10步:添加JSP视图 WEB-INF/views/allemployees.jsp

10.1 WEB-INF/views/allemployees.jsp [ 主页包含所有已经存在的员工]

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

University Enrollments

font-weight: bold;

background-color: #C6C9C4;

}

List of Employees

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

Add New Employee

View Code

10.2 WEB-INF/views/registration.jsp [注册页面用来创建和保存员工信息到数据库]

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

Employee Registration Form

color: #ff0000;

}

Registration Form

Name:
Joining Date:
Salary:
SSN:

Go back to List of All Employees

View Code

10.3 WEB-INF/views/success.jsp [成功页面包含新员工创建成功的确认信息并重定向到员工列表页面]

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

Registration Confirmation Page

Go back to List of All Employees

View Code

第11步:创建数据表

CREATE TABLEEMPLOYEE(

idINT NOT NULLauto_increment,

nameVARCHAR(50) NOT NULL,

joining_date DATENOT NULL,

salaryDOUBLE NOT NULL,

ssnVARCHAR(30) NOT NULL UNIQUE,PRIMARY KEY(id)

);

第12步:创建,部署和运行程序

现在开始打war包(既可以通过eclipse) 或者通过maven命令行(mvn clean install).将war包部署到servlet3.0容器当中。由于这里我使用的是tomcat容器。我就直接将war包放在tomcat的webapps文件夹下。并点击start.bat脚本启动tomcat(在tomcat的bin目录下面)。  打开浏览器输入网址:http://localhost:8080/SpringHibernateExample/

f322e3e01a569528dc7a5264a6382a11.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值