Spring MVC + Hibernate + Maven: Crud操作示例

来源:互联网 发布:cf端游刷枪软件 编辑:程序博客网 时间:2024/06/06 07:22

Spring MVC + Hibernate + Maven: Crud操作示例


关于作者(Alexey Zvolinskiy)

Alexey是一个在使用Java,TestNG 和Selenium的自动化WEB应用程序中有丰富经验的测试开发者。他如此的喜欢QA以至于在下班后他为初级QA工程师提供培训课程。

在这篇文章中我想介绍一个spring MVC + hibernate + Maven例子。这组技术主要涉及一些基础知识,我想在每一个必要的地方详细解释它。本篇话题范围以外的更多资源,我会提供链接方便你阅读。在文章的最后,我将发布一个GitHub的链接。

目标

示例web应用程序是基于Spring MVC, Hibernate, Maven的,界面是基于HTML的。这个应用程序将提供所有的CRUD操作:增删改查。和往常一样,我将使用MySQL作为我的数据库。这个应用程序将把足球俱乐部相关的实体来作为示例,所以这个教程将会涉及运动领域。


准备

我需要在数据库中创建一个表,下面就是创建它的代码:

[sql] view plain copy
 print?
  1. CREATE TABLE `teams` (  
  2. `id` int(6) NOT NULL AUTO_INCREMENT,  
  3. `namevarchar(40) NOT NULL,  
  4. `rating` int(6) NOT NULL,  
  5. PRIMARY KEY (`id`)  
  6. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;  

这个表将在应用程序中用下面的类来表示:

[java] view plain copy
print?
  1. @Entity  
  2. @Table(name="teams")  
  3. public class Team {  
  4.    
  5.     @Id  
  6.     @GeneratedValue  
  7.     private Integer id;  
  8.    
  9.     private String name;  
  10.    
  11.     private Integer rating;  
  12.    
  13.     public Integer getId() {  
  14.         return id;  
  15.     }  
  16.     public void setId(Integer id) {  
  17.         this.id = id;  
  18.     }  
  19.     public String getName() {  
  20.         return name;  
  21.     }  
  22.     public void setName(String name) {  
  23.         this.name = name;  
  24.     }  
  25.     public Integer getRating() {  
  26.         return rating;  
  27.     }  
  28.     public void setRating(Integer rating) {  
  29.         this.rating = rating;  
  30.     }  
  31.    
  32. }  


然后我需要在IDE(我使用Eclipse)里面创建一个Maven项目。我将略过创建的详细过程,你可以查看它在我的关于Maven项目的创建的文章里,这是pom.xml文件的链接。首先最重要的一点就是WebAppConfig.java 文件,所以我开始吧:

[java] view plain copy
 print?
  1. @Configuration  
  2. @ComponentScan("com.sprhib")  
  3. @EnableWebMvc  
  4. @EnableTransactionManagement  
  5. @PropertySource("classpath:application.properties")  
  6. public class WebAppConfig {  
  7.    
  8.     private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";  
  9.     private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";  
  10.     private static final String PROPERTY_NAME_DATABASE_URL = "db.url";  
  11.     private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";  
  12.    
  13.     private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";  
  14.     private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";  
  15.     private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";  
  16.    
  17.     @Resource  
  18.     private Environment env;  
  19.    
  20.     @Bean  
  21.     public DataSource dataSource() {  
  22.         DriverManagerDataSource dataSource = new DriverManagerDataSource();  
  23.    
  24.         dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));  
  25.         dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));  
  26.         dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));  
  27.         dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));  
  28.    
  29.         return dataSource;  
  30.     }  
  31.    
  32.     @Bean  
  33.     public LocalSessionFactoryBean sessionFactory() {  
  34.         LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();  
  35.         sessionFactoryBean.setDataSource(dataSource());  
  36.         sessionFactoryBean.setPackagesToScan(env.getRequiredProperty(  
  37. PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));  
  38.         sessionFactoryBean.setHibernateProperties(hibProperties());  
  39.         return sessionFactoryBean;  
  40.     }  
  41.    
  42.     private Properties hibProperties() {  
  43.         Properties properties = new Properties();  
  44.         properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));  
  45.         properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));  
  46.         return properties;    
  47.     }  
  48.    
  49.     @Bean  
  50.     public HibernateTransactionManager transactionManager() {  
  51.         HibernateTransactionManager transactionManager = new HibernateTransactionManager();  
  52.         transactionManager.setSessionFactory(sessionFactory().getObject());  
  53.         return transactionManager;  
  54.     }  
  55.    
  56.     @Bean  
  57.     public UrlBasedViewResolver setupViewResolver() {  
  58.         UrlBasedViewResolver resolver = new UrlBasedViewResolver();  
  59.         resolver.setPrefix("/WEB-INF/pages/");  
  60.         resolver.setSuffix(".jsp");  
  61.         resolver.setViewClass(JstlView.class);  
  62.         return resolver;  
  63.     }  
  64.    
  65. }  

在这个文件开头,你看见了注解@EnableTransactionManagement,它可以使Spring的注解驱动事务管理器生效工作。注解@PropertySource(“classpath:application.properties”)定位属性文件所在的资源文件夹。注意着三个beans:transactionManager, sessionFactory, dataSource,这些beans提供了事务管理。更多信息可以阅读我的关于Hibernate功能的文章。

[java] view plain copy
 print?
  1. #DB properties:  
  2. db.driver=com.mysql.jdbc.Driver  
  3. db.url=jdbc:mysql://localhost:3306/hibnatedb  
  4. db.username=hibuser  
  5. db.password=root  
  6.    
  7. #Hibernate Configuration:  
  8. hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect  
  9. hibernate.show_sql=true  
  10. entitymanager.packages.to.scan=com.sprhib.model  

以上是我和项目有关的所有准备,接下来我将向你展示DAO层和Service层。

DAO层和Service层

下面是DAOs和Services接口和实现:

[java] view plain copy
 print?
  1. public interface TeamDAO {  
  2.    
  3.     public void addTeam(Team team);  
  4.     public void updateTeam(Team team);  
  5.     public Team getTeam(int id);  
  6.     public void deleteTeam(int id);  
  7.     public List  
  8.    
  9.           getTeams();  
  10.    
  11. }  
  12.    
  13. @Repository  
  14. public class TeamDAOImpl implements TeamDAO {  
  15.    
  16.     @Autowired  
  17.     private SessionFactory sessionFactory;  
  18.    
  19.     private Session getCurrentSession() {  
  20.         return sessionFactory.getCurrentSession();  
  21.     }  
  22.    
  23.     public void addTeam(Team team) {  
  24.         getCurrentSession().save(team);  
  25.     }  
  26.    
  27.     public void updateTeam(Team team) {  
  28.         Team teamToUpdate = getTeam(team.getId());  
  29.         teamToUpdate.setName(team.getName());  
  30.         teamToUpdate.setRating(team.getRating());  
  31.         getCurrentSession().update(teamToUpdate);  
  32.    
  33.     }  
  34.    
  35.     public Team getTeam(int id) {  
  36.         Team team = (Team) getCurrentSession().get(Team.class, id);  
  37.         return team;  
  38.     }  
  39.    
  40.     public void deleteTeam(int id) {  
  41.         Team team = getTeam(id);  
  42.         if (team != null)  
  43.             getCurrentSession().delete(team);  
  44.     }  
  45.    
  46.     @SuppressWarnings("unchecked")  
  47.     public List  
  48.    
  49.           getTeams() {  
  50.         return getCurrentSession().createQuery("from Team").list();  
  51.     }  
  52.    
  53. }  

注解 @Repository 表明被注解的类是一个DAO

[java] view plain copy
 print?
  1. public interface TeamService {  
  2.    
  3.     public void addTeam(Team team);  
  4.     public void updateTeam(Team team);  
  5.     public Team getTeam(int id);  
  6.     public void deleteTeam(int id);  
  7.     public List  
  8.    
  9.           getTeams();  
  10.    
  11. }  
  12.    
  13. @Service  
  14. @Transactional  
  15. public class TeamServiceImpl implements TeamService {  
  16.    
  17.     @Autowired  
  18.     private TeamDAO teamDAO;  
  19.    
  20.     public void addTeam(Team team) {  
  21.         teamDAO.addTeam(team);        
  22.     }  
  23.    
  24.     public void updateTeam(Team team) {  
  25.         teamDAO.updateTeam(team);  
  26.     }  
  27.    
  28.     public Team getTeam(int id) {  
  29.         return teamDAO.getTeam(id);  
  30.     }  
  31.    
  32.     public void deleteTeam(int id) {  
  33.         teamDAO.deleteTeam(id);  
  34.     }  
  35.    
  36.     public List  
  37.    
  38.           getTeams() {  
  39.         return teamDAO.getTeams();  
  40.     }  
  41.    
  42. }  

注解@Service表明备注解的类是一个“Service”。注解@Transactional在一个方法或者是类上声明一个事务。

控制器和JSPs

现在我就要涵盖所有的 CRUD操作,这一章会有点长。我将从最基础的控制器开始,它负责主页:

[java] view plain copy
 print?
  1. @Controller  
  2. public class LinkController {  
  3.    
  4.     @RequestMapping(value="/")  
  5.     public ModelAndView mainPage() {  
  6.         return new ModelAndView("home");  
  7.     }  
  8.    
  9.     @RequestMapping(value="/index")  
  10.     public ModelAndView indexPage() {  
  11.         return new ModelAndView("home");  
  12.     }  
  13.    
  14. }  

它挺简单的,这是JSP文件:

[java] view plain copy
 print?
  1. ...  
  2. <h1>Home page</h1>  
  3. <p>  
  4. ${message}  
  5. <a href="${pageContext.request.contextPath}/team/add.html">Add new team</a>  
  6. <a href="${pageContext.request.contextPath}/team/list.html">Team list</a>  
  7. </p>  
  8. ...  

下面是这里是核心控制器,主要应用程序的控制器:

[java] view plain copy
 print?
  1. @Controller  
  2. public class TeamController {  
  3.    
  4.     @Autowired  
  5.     private TeamService teamService;  
  6.    
  7.     @RequestMapping(value="/team/add")  
  8.     public ModelAndView addTeamPage() {  
  9.         ModelAndView modelAndView = new ModelAndView("add-team-form");  
  10.         modelAndView.addObject("team"new Team());  
  11.         return modelAndView;  
  12.     }  
  13.    
  14.     @RequestMapping(value="/team/add/process")  
  15.     public ModelAndView addingTeam(@ModelAttribute Team team) {  
  16.    
  17.         ModelAndView modelAndView = new ModelAndView("home");  
  18.         teamService.addTeam(team);  
  19.    
  20.         String message = "Team was successfully added.";  
  21.         modelAndView.addObject("message", message);  
  22.    
  23.         return modelAndView;  
  24.     }  
  25.    
  26.     @RequestMapping(value="/team/list")  
  27.     public ModelAndView listOfTeams() {  
  28.         ModelAndView modelAndView = new ModelAndView("list-of-teams");  
  29.    
  30.         List  
  31.    
  32.           teams = teamService.getTeams();  
  33.         modelAndView.addObject("teams", teams);  
  34.    
  35.         return modelAndView;  
  36.     }  
  37.    
  38.     @RequestMapping(value="/team/edit/{id}", method=RequestMethod.GET)  
  39.     public ModelAndView editTeamPage(@PathVariable Integer id) {  
  40.         ModelAndView modelAndView = new ModelAndView("edit-team-form");  
  41.         Team team = teamService.getTeam(id);  
  42.         modelAndView.addObject("team",team);  
  43.         return modelAndView;  
  44.     }  
  45.    
  46.     @RequestMapping(value="/team/edit/{id}", method=RequestMethod.POST)  
  47.     public ModelAndView edditingTeam(@ModelAttribute Team team, @PathVariable Integer id) {  
  48.    
  49.         ModelAndView modelAndView = new ModelAndView("home");  
  50.    
  51.         teamService.updateTeam(team);  
  52.    
  53.         String message = "Team was successfully edited.";  
  54.         modelAndView.addObject("message", message);  
  55.    
  56.         return modelAndView;  
  57.     }  
  58.    
  59.     @RequestMapping(value="/team/delete/{id}", method=RequestMethod.GET)  
  60.     public ModelAndView deleteTeam(@PathVariable Integer id) {  
  61.         ModelAndView modelAndView = new ModelAndView("home");  
  62.         teamService.deleteTeam(id);  
  63.         String message = "Team was successfully deleted.";  
  64.         modelAndView.addObject("message", message);  
  65.         return modelAndView;  
  66.     }  
  67.    
  68. }  

基本上所有的方法和请求映射都是很清晰的。请注意editTeamPage() 和edditingTeam() 方法的@RequestMapping,对于不同的method属性包含不同的值。
现在我们来看看JSP页面:

“Add new team” 页面

[java] view plain copy
 print?
  1. ...  
  2. <h1>Add team page</h1>  
  3. <p>Here you can add a new team.</p>  
  4. <form:form method="POST" commandname="team" action="${pageContext.request.contextPath}/team/add/process.html">  
  5. <table>  
  6. <tbody>  
  7.     <tr>  
  8.         <td>Name:</td>  
  9.         <td><form:input path="name"></form:input></td>  
  10.     </tr>  
  11.     <tr>  
  12.         <td>Rating:</td>  
  13.         <td><form:input path="rating"></form:input></td>  
  14.     </tr>  
  15.     <tr>  
  16.         <td><input value="Add" type="submit"></td>  
  17.         <td></td>  
  18.     </tr>  
  19. </tbody>  
  20. </table>  
  21. </form:form>  
  22.    
  23. <p><a href="${pageContext.request.contextPath}/index.html">Home page</a></p>  
  24. ...  

“List of teams” 页面:

[java] view plain copy
 print?
  1. <h1>List of teams</h1>  
  2. <p>Here you can see the list of the teams, edit them, remove or update.</p>  
  3. <c:foreach var="team" items="${teams}">  
  4. </c:foreach><table border="1px" cellpadding="0" cellspacing="0">  
  5. <thead>  
  6. <tr>  
  7. <th width="10%">id</th><th width="15%">name</th><th width="10%">rating</th><th width="10%">actions</th>  
  8. </tr>  
  9. </thead>  
  10. <tbody>  
  11. <tr>  
  12.     <td>${team.id}</td>  
  13.     <td>${team.name}</td>  
  14.     <td>${team.rating}</td>  
  15.     <td>  
  16.     <a href="${pageContext.request.contextPath}/team/edit/${team.id}.html">Edit</a>  
  17.     <a href="${pageContext.request.contextPath}/team/delete/${team.id}.html">Delete</a>  
  18.     </td>  
  19. </tr>  
  20.    
  21. </tbody>  
  22. </table>  
  23.    
  24. <p><a href="${pageContext.request.contextPath}/index.html">Home page</a></p>  
  25. ...  

“Edit team” 页面:

[java] view plain copy
 print?
  1. ...  
  2. <h1>Edit team page</h1>  
  3. <p>Here you can edit the existing team.</p>  
  4. <p>${message}</p>  
  5. <form:form method="POST" commandname="team" action="${pageContext.request.contextPath}/team/edit/${team.id}.html">  
  6. <table>  
  7. <tbody>  
  8.     <tr>  
  9.         <td>Name:</td>  
  10.         <td><form:input path="name"></form:input></td>  
  11.     </tr>  
  12.     <tr>  
  13.         <td>Rating:</td>  
  14.         <td><form:input path="rating"></form:input></td>  
  15.     </tr>  
  16.     <tr>  
  17.         <td><input value="Edit" type="submit"></td>  
  18.         <td></td>  
  19.     </tr>  
  20. </tbody>  
  21. </table>  
  22. </form:form>  
  23.    
  24. <p><a href="${pageContext.request.contextPath}/index.html">Home page</a></p>  
  25. ...  

“List of teams” 页面的效果:


0 0
原创粉丝点击