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

在本文中,我想研究一个Spring MVC + Hibernate + Maven用法的示例。 这套技术暗含领域领域的基础知识。 因此,我将尝试详细解释所有重要时刻。 其他没有主题的内容将提供指向更多详细信息源的链接。 在文章的结尾,我将发布GitHub的链接。

目标

基于Spring MVC,Hibernate,Maven创建示例Web应用程序。 界面将基于HTML。 该应用程序将支持所有CRUD操作:创建,读取,更新,删除 。 通常,我将使用MySQL作为数据库。 的
该应用程序将与足球俱乐部实体一起使用,因此请准备好将本教程应用于运动方向。

Spring MVC休眠项目结构

准备工作

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

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

该表将在应用程序中以类表示:

@Entity
@Table(name="teams")
public class Team {@Id@GeneratedValueprivate Integer id;private String name;private Integer rating;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getRating() {return rating;}public void setRating(Integer rating) {this.rating = rating;}}

然后,我需要在IDE中创建一个新的Maven Web项目(我使用Eclipse)。 我将省略创建的详细信息,您可以在我的一篇有关Maven Web Project创建的文章中阅读有关此内容的信息 。 这是pom.xml文件的链接。 第一个重要的停止点是WebAppConfig.java文件,因此让我们考虑一下:

@Configuration
@ComponentScan("com.sprhib")
@EnableWebMvc
@EnableTransactionManagement
@PropertySource("classpath:application.properties")
public class WebAppConfig {private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";private static final String PROPERTY_NAME_DATABASE_URL = "db.url";private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";@Resourceprivate Environment env;@Beanpublic DataSource dataSource() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));return dataSource;}@Beanpublic LocalSessionFactoryBean sessionFactory() {LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();sessionFactoryBean.setDataSource(dataSource());sessionFactoryBean.setPackagesToScan(env.getRequiredProperty(
PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));sessionFactoryBean.setHibernateProperties(hibProperties());return sessionFactoryBean;}private Properties hibProperties() {Properties properties = new Properties();properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));return properties;	}@Beanpublic HibernateTransactionManager transactionManager() {HibernateTransactionManager transactionManager = new HibernateTransactionManager();transactionManager.setSessionFactory(sessionFactory().getObject());return transactionManager;}@Beanpublic UrlBasedViewResolver setupViewResolver() {UrlBasedViewResolver resolver = new UrlBasedViewResolver();resolver.setPrefix("/WEB-INF/pages/");resolver.setSuffix(".jsp");resolver.setViewClass(JstlView.class);return resolver;}}

在文件的开头,您可以看到@EnableTransactionManagement,它启用了Spring的注释驱动的事务管理功能。 注释@PropertySource(“ classpath:application.properties”)–插入位于资源文件夹中的属性文件。 请注意以下三个bean:transactionManager,sessionFactory和dataSource。 这些bean提供事务管理。 有关更多信息,请阅读我有关Hibernate功能的文章。

#DB properties:
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/hibnatedb
db.username=hibuser
db.password=root#Hibernate Configuration:
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
hibernate.show_sql=true
entitymanager.packages.to.scan=com.sprhib.model

多数民众赞成在所有与项目准备有关。 此外,我将向您展示DAO和服务层。

DAO和服务层

这是DAO和服务的接口和实现:

public interface TeamDAO {public void addTeam(Team team);public void updateTeam(Team team);public Team getTeam(int id);public void deleteTeam(int id);public ListgetTeams();}

DAO接口的实现:

@Repository
public class TeamDAOImpl implements TeamDAO {@Autowiredprivate SessionFactory sessionFactory;private Session getCurrentSession() {return sessionFactory.getCurrentSession();}public void addTeam(Team team) {getCurrentSession().save(team);}public void updateTeam(Team team) {Team teamToUpdate = getTeam(team.getId());teamToUpdate.setName(team.getName());teamToUpdate.setRating(team.getRating());getCurrentSession().update(teamToUpdate);}public Team getTeam(int id) {Team team = (Team) getCurrentSession().get(Team.class, id);return team;}public void deleteTeam(int id) {Team team = getTeam(id);if (team != null)getCurrentSession().delete(team);}@SuppressWarnings("unchecked")public ListgetTeams() {return getCurrentSession().createQuery("from Team").list();}}

注释@Repository指示带注释的类是“ DAO”。

public interface TeamService {public void addTeam(Team team);public void updateTeam(Team team);public Team getTeam(int id);public void deleteTeam(int id);public ListgetTeams();}

服务接口的实现:

@Service
@Transactional
public class TeamServiceImpl implements TeamService {@Autowiredprivate TeamDAO teamDAO;public void addTeam(Team team) {teamDAO.addTeam(team);		}public void updateTeam(Team team) {teamDAO.updateTeam(team);}public Team getTeam(int id) {return teamDAO.getTeam(id);}public void deleteTeam(int id) {teamDAO.deleteTeam(id);}public ListgetTeams() {return teamDAO.getTeams();}}

注释@Service表示带注释的类是“服务”。 注释@Transactional描述方法或类上的事务属性。

控制器和JSP

由于我将介绍所有CRUD操作,因此本章将有些长。 我将从基本控制器开始,它可用于主页:

@Controller
public class LinkController {@RequestMapping(value="/")public ModelAndView mainPage() {return new ModelAndView("home");}@RequestMapping(value="/index")public ModelAndView indexPage() {return new ModelAndView("home");}}

这很简单,这里是其JSP文件:

...
<h1>Home page</h1>
<p>
${message}<br>
<a href="${pageContext.request.contextPath}/team/add.html">Add new team</a><br>
<a href="${pageContext.request.contextPath}/team/list.html">Team list</a><br>
</p>
...

这是一个怪物级的应用程序的主控制器:

@Controller
public class TeamController {@Autowiredprivate TeamService teamService;@RequestMapping(value="/team/add")public ModelAndView addTeamPage() {ModelAndView modelAndView = new ModelAndView("add-team-form");modelAndView.addObject("team", new Team());return modelAndView;}@RequestMapping(value="/team/add/process")public ModelAndView addingTeam(@ModelAttribute Team team) {ModelAndView modelAndView = new ModelAndView("home");teamService.addTeam(team);String message = "Team was successfully added.";modelAndView.addObject("message", message);return modelAndView;}@RequestMapping(value="/team/list")public ModelAndView listOfTeams() {ModelAndView modelAndView = new ModelAndView("list-of-teams");Listteams = teamService.getTeams();modelAndView.addObject("teams", teams);return modelAndView;}@RequestMapping(value="/team/edit/{id}", method=RequestMethod.GET)public ModelAndView editTeamPage(@PathVariable Integer id) {ModelAndView modelAndView = new ModelAndView("edit-team-form");Team team = teamService.getTeam(id);modelAndView.addObject("team",team);return modelAndView;}@RequestMapping(value="/team/edit/{id}", method=RequestMethod.POST)public ModelAndView edditingTeam(@ModelAttribute Team team, @PathVariable Integer id) {ModelAndView modelAndView = new ModelAndView("home");teamService.updateTeam(team);String message = "Team was successfully edited.";modelAndView.addObject("message", message);return modelAndView;}@RequestMapping(value="/team/delete/{id}", method=RequestMethod.GET)public ModelAndView deleteTeam(@PathVariable Integer id) {ModelAndView modelAndView = new ModelAndView("home");teamService.deleteTeam(id);String message = "Team was successfully deleted.";modelAndView.addObject("message", message);return modelAndView;}}

几乎所有方法和请求映射都是清楚的。 但我想强调指出, editTeamPage()edditingTeam()方法的@RequestMapping包含方法属性的不同值。 现在是时候查看这些映射的JSP了:

“添加新团队”页面:

...
<h1>Add team page</h1>
<p>Here you can add a new team.</p>
<form:form method="POST" commandname="team" action="${pageContext.request.contextPath}/team/add/process.html">
<table>
<tbody><tr><td>Name:</td><td><form:input path="name"></form:input></td></tr><tr><td>Rating:</td><td><form:input path="rating"></form:input></td></tr><tr><td><input value="Add" type="submit"></td><td></td></tr>
</tbody>
</table>
</form:form><p><a href="${pageContext.request.contextPath}/index.html">Home page</a></p>
...

“球队名单”页面:

...
<h1>List of teams</h1>
<p>Here you can see the list of the teams, edit them, remove or update.</p>
<c:foreach var="team" items="${teams}">
</c:foreach><table border="1px" cellpadding="0" cellspacing="0">
<thead>
<tr>
<th width="10%">id</th><th width="15%">name</th><th width="10%">rating</th><th width="10%">actions</th>
</tr>
</thead>
<tbody>
<tr><td>${team.id}</td><td>${team.name}</td><td>${team.rating}</td><td><a href="${pageContext.request.contextPath}/team/edit/${team.id}.html">Edit</a><br><a href="${pageContext.request.contextPath}/team/delete/${team.id}.html">Delete</a><br></td>
</tr></tbody>
</table><p><a href="${pageContext.request.contextPath}/index.html">Home page</a></p>
...

“编辑团队”页面:

...
<h1>Edit team page</h1>
<p>Here you can edit the existing team.</p>
<p>${message}</p>
<form:form method="POST" commandname="team" action="${pageContext.request.contextPath}/team/edit/${team.id}.html">
<table>
<tbody><tr><td>Name:</td><td><form:input path="name"></form:input></td></tr><tr><td>Rating:</td><td><form:input path="rating"></form:input></td></tr><tr><td><input value="Edit" type="submit"></td><td></td></tr>
</tbody>
</table>
</form:form><p><a href="${pageContext.request.contextPath}/index.html">Home page</a></p>
...

以及“团队名单”页面的屏幕截图:

Spring-MVC-Hibernate-CRUD-示例

摘要

集成多种技术通常不是一件容易的事,因此要耐心地取得成功。 帖子中没有很多资源,因此您可以访问我的GitHub来探索您感兴趣的类。

参考: Spring MVC + Hibernate + Maven:来自Fruzenshtein的便笺博客的JCG合作伙伴 Alexey Zvolinskiy的CRUD操作示例 。

翻译自: https://www.javacodegeeks.com/2013/04/spring-mvc-hibernate-maven-crud-operations-example.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

画出的点做交互_设计之下交互设计原型设计之概念设计

目录//交互设计//「设计之下」---交互设计&#xff1a;交互设计师是做什么的&#xff1f;上线的产品中那一块是交互设计师的产物呢&#xff1f;项目启动1.1「设计之下」---交互设计&#xff1a;项目启动之从想法到项目&#xff0c;什么是项目&#xff1f;1.2「设计之下」---交互…

Java集合之TreeMap源码解析上篇

上期回顾 上期我从树型结构谈到了红黑树的概念以及自平衡的各种变化&#xff08;指路上期←戳&#xff09;&#xff0c;本期我将会对TreeMap结合红黑树理论进行解读。 首先&#xff0c;我们先来回忆一下红黑树的5条基本规则。 1.结点是红色或者黑色&#xff0c; 2.根结点为黑色…

仪器和软件通讯测试软件,软件定义的仪器-测试测量-与非网

如同每个孩子所拥有的第一套LEGO玩具改变了他们对世界的认识一样&#xff0c;26年前&#xff0c;美国国家仪器通过NI LabVIEW系统设计软件&#xff0c;重新改变了人们对仪器的认知。今年&#xff0c;NI将再次重演历史&#xff0c;发布一款新型仪器&#xff0c;帮助测试工程师摆…

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 C序列变换...

链接&#xff1a;https://www.nowcoder.com/acm/contest/91/C来源&#xff1a;牛客网没有账号的同学这样注册&#xff0c;支持博主 题目描述 给定两个长度为n的序列&#xff0c;ai, bi(1<i<n), 通过3种魔法使得序列a变换为序列b&#xff0c;也就是aibi(1<i<n). 魔…

Spring MVC,Ajax和JSON第1部分–设置场景

我一直在考虑在Spring&#xff0c;Ajax和JSON上写博客&#xff0c;但是我从来没有做过。 这主要是因为它非常复杂&#xff0c;并且所需的技术一直处于变化状态。 当我决定撰写此博客时&#xff0c;我在Internet上有一个侦察员&#xff0c;如果您查看诸如Stack Overflow之类的地…

柜员计算机技能,新入职柜员必备软件:柜员技能训练系统最新版

如果你是新入职柜员的大学生&#xff0c;这个软件你肯定用得着&#xff01;如果你是资格老的柜员同胞&#xff0c;这个软件你肯定用得着&#xff01;这个软件&#xff0c;针对柜员的小键盘、打字和点钞三项技能要求&#xff0c;专门针对痛点开发&#xff0c;可以有效训练柜员的…

Html5和Css3扁平化风格网页

前言 扁平化概念的核心意义 去除冗余、厚重和繁杂的装饰效果。而具体表现在去掉了多余的透视、纹理、渐变以及能做出3D效果的元素&#xff0c;这样可以让“信息”本身重新作为核心被凸显出来。同时在设计元素上&#xff0c;则强调了抽象、极简和符号化。 示例 视频效果&…

按功能而不是按层打包课程

大多数企业Java应用程序在设计上都有一些相似之处。 这些应用程序的打包通常由它们使用的框架&#xff08;如Spring&#xff0c;EJB或Hibernate等&#xff09;驱动。或者&#xff0c;您可以按功能对打包进行分组。 像其他任何有关建模的项目一样&#xff0c;这也不是没有任何问…

总是助手服务器失败怎么回事,《遇见逆水寒》连接服务器失败解决方法汇总 服务器连接失败问题原因...

导读遇见逆水寒连接服务器失败怎么回事&#xff0c;近期不少小伙伴都在反映遇见逆水寒助手连接服务器失败&#xff0c;一直登不上去是怎么回事&#xff0c;小编这就为大家分享下遇见逆水寒连接服务器失败解决方法。遇见逆水寒连接服务器失败解决方法...遇见逆水寒连接服务器失败…

Linux常用开发环境软件-redis安装

linux下安装redis3.2.11版本  1、安装编译环境 yum install gcc  //安装编译环境 2、到官网下载redis 官网地址&#xff1a;https://redis.io/download 3、用WinScp工具&#xff0c;将下载好的redis-3.2.11.tar.gz传输到linux服务器下的opt目录下(opt就相当于window的d://so…

项目第十一天

站立式会议&#xff1a; 燃尽图&#xff1a; 项目&#xff1a; 项目进展&#xff1a;系统完成&#xff0c;进行测试。 问题&#xff1a;测试的时候发现不知道如何进行系统的测试&#xff0c;所以测试内容的比较乱。 体会&#xff1a;从无到有完成一个项目&#xff0c;需要很多步…

JPA:确定关系的归属方

使用Java Persistence API&#xff08;JPA&#xff09;时&#xff0c;通常需要在两个实体之间创建关系。 这些关系是通过使用外键在数据模型&#xff08;例如数据库&#xff09;中定义的&#xff0c;而在我们的对象模型&#xff08;例如Java&#xff09;中则使用注释来定义关联…

服务器芯片镜像测试,模拟镜像服务器磁盘问题的两个测试【转】

我们知道在高安全模式下&#xff0c;在主服务器上提交的事务必须同时在镜像服务器上提交成功&#xff0c;否则该事务无法在主数据库上提交。在上面的图中&#xff0c;一个事务在主数据库上提交的步骤包含&#xff1a;客户端程序将事务发送给主数据库服务器SQLServer主数据库服务…

运用Arc Hydro提取河网

Arc hydro 插件需要 spatial analyst 支持&#xff1a; 解决方法&#xff1a;Tools菜单>>Extensions...&#xff0c;勾选Spatial Analyst 1.设置存储路径 ApUtilities-set target locations 2.导入dem 3.拼接dem Dataset Name 设置为.tif,即存为tif格式&#xff0c;否则…

服务器性能是什么,什么是服务器性能的显卡,怎么理解?

什么是服务器性能的显卡&#xff0c;怎么理解&#xff1f;如果单说“”二字就是个伪命题&#xff0c;服务分不同的性能级别&#xff0c;有些刀片器的性能甚至还不如某些发烧级的游戏台式机&#xff0c;那它所用的显卡性能也会比较一般&#xff0c;如果是说哪些显卡是专门为服务…

打印机网络共享服务器不稳定,共享打印机无法访问怎么办,教你一招问题立马解决...

基本上只有本地打印机共享才会出现下面的问题&#xff0c;通过网线连接和打印机服务器连接的打印机不会出现此类问题&#xff0c;多个电脑连接网络打印机本质上还是各个电脑连接的本地打印机。一、 设置打印机共享时出现错误连接好本地打印机后&#xff0c;想要共享给同事使用&…

CSS margin 外边距 属性的位置关系

padding&#xff1a;内边距margin &#xff1a;外边距 margin:10px; 所有 4 个外边距都是 10px ******************************************* margin:10px 5px; 上外边距和下外边距是 10px右外边距和左外边距是 5px ******************************************** margin:10px…

C语言博客作业--字符数组

一、PTA实验作业 题目1&#xff1a;7-1 字符串转换成十进制整数 1. 本题PTA提交列表 2. 设计思路 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明。 这个问题我看了好久&#xff0c;试了很多的的错误点&#xff0c;答案和我预料的一样&#xff0c;所以我重新看了一遍…

Java 7 Update 21安全改进的详细信息

甲骨文昨天发布了三个Java更新 。 重要的是要注意它们包含一些与安全性相关的更改。 一段时间以来&#xff0c;已经宣布了其中的大多数更改&#xff0c;并且首先要注意的是Oracle按计划交付。 甲骨文公司Java平台安全经理Milton Smith最近在DevoxxUK上做了题为“ 用Java保护…

du的原理 linux_Linux 文件系统管理

1、文件系统介绍1&#xff09;、Linux 文件系统特性super block&#xff08;超级块&#xff09;记录整个文件系统的信息。包括 block 与 inode 的总量&#xff0c;已经使用的 block 和 inode 的数量&#xff0c;未使用的 block 和 inode 的数量&#xff0c;block 与 inode 的大…