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

爱被打了一巴掌 2022-08-04 15:55 283阅读 0赞

本文转载自:ImportNew - wudy 转载请注明出处

点击打开链接

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作为我的数据库。这个应用程序将把足球俱乐部相关的实体来作为示例,所以这个教程将会涉及运动领域。

Center

准备

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

  1. CREATE TABLE `teams` (
  2. `id` int(6) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(40) NOT NULL,
  4. `rating` int(6) NOT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

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

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

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

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

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

  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. #Hibernate Configuration:
  7. hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
  8. hibernate.show_sql=true
  9. entitymanager.packages.to.scan=com.sprhib.model

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

DAO层和Service层

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

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

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

  1. public interface TeamService {
  2. public void addTeam(Team team);
  3. public void updateTeam(Team team);
  4. public Team getTeam(int id);
  5. public void deleteTeam(int id);
  6. public List
  7. getTeams();
  8. }
  9. @Service
  10. @Transactional
  11. public class TeamServiceImpl implements TeamService {
  12. @Autowired
  13. private TeamDAO teamDAO;
  14. public void addTeam(Team team) {
  15. teamDAO.addTeam(team);
  16. }
  17. public void updateTeam(Team team) {
  18. teamDAO.updateTeam(team);
  19. }
  20. public Team getTeam(int id) {
  21. return teamDAO.getTeam(id);
  22. }
  23. public void deleteTeam(int id) {
  24. teamDAO.deleteTeam(id);
  25. }
  26. public List
  27. getTeams() {
  28. return teamDAO.getTeams();
  29. }
  30. }

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

控制器和JSPs

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

  1. @Controller
  2. public class LinkController {
  3. @RequestMapping(value="/")
  4. public ModelAndView mainPage() {
  5. return new ModelAndView("home");
  6. }
  7. @RequestMapping(value="/index")
  8. public ModelAndView indexPage() {
  9. return new ModelAndView("home");
  10. }
  11. }

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

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

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

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

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

“Add new team” 页面

  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. <p><a href="${pageContext.request.contextPath}/index.html">Home page</a></p>
  23. ...

“List of teams” 页面:

  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. </tbody>
  21. </table>
  22. <p><a href="${pageContext.request.contextPath}/index.html">Home page</a></p>
  23. ...

“Edit team” 页面:

  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. <p><a href="${pageContext.request.contextPath}/index.html">Home page</a></p>
  24. ...

“List of teams” 页面的效果:
Center 1

总结

几个技术的整合通常不是一件简单的事情,所有如果要想成功就需要有耐心。在这篇文章中没有囊括所有的资源,你可以访问GitHub去查看哪些你感兴趣的类。

原文链接: javacodegeeks 翻译: ImportNew.com - wudy
译文链接: http://www.importnew.com/11121.html
[ 转载请保留原文出处、译者和译文链接。 ]

发表评论

表情:
评论列表 (有 0 条评论,283人围观)

还没有评论,来说两句吧...

相关阅读