Spring JPA数据+Hibernate+ MySQL + Maven

在Spring MVC的帮助下开发Web应用程序意味着要创建几个逻辑架构层。 层之一是DAO(存储库)层。 它负责与数据库进行通信。 如果您至少开发了DAO层一次,则应该知道它涉及许多样板代码。 Spring Data本身就是与DAO相关的日常工作的一部分。

在帖子中,我将提供一个应用程序示例,它将结合Spring MVC,MySQL和Maven演示Spring Data(JPA)Hibernate将用作JPA的实现。 您可能知道,我是基于Java的配置的忠实拥护者,因此我将使用这种方法来配置Spring Data。 在本教程的最后,您可以找到GitHub上示例项目的链接。

制备

在本文中,我将重点介绍Spring数据,因此我将忽略所有超出主题的内容。 但首先,我想提供大量链接,这些链接可以在本教程的上下文中为您提供帮助。

  • 使用Maven在Eclipse中创建动态Web项目 。
  • 具有基于Java配置的简单Spring MVC应用程序 。
  • Spring MVC + Hibernate示例应用程序。

这些链接应针对阅读文章期间可能发生的90%的问题给出答案。 让我们从在MySQL中创建表开始:

CREATE TABLE `shops` (`id` int(6) NOT NULL AUTO_INCREMENT,`name` varchar(60) NOT NULL,`employees_number` int(6) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

现在,我们可以继续执行Java代码:

@Entity
@Table(name = "shops")
public class Shop {@Id@GeneratedValueprivate Integer id;private String name;@Column(name = "employees_number")private Integer emplNumber;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 getEmplNumber() {return emplNumber;}public void setEmplNumber(Integer emplNumber) {this.emplNumber = emplNumber;}
}

Spring数据的配置

我相信该项目的屏幕截图将帮助您了解发生了什么。

spring-data-jpa-project-structure

在属性文件中集中所有配置数据:

#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.spr.model

WebAppConfig类包含所有基于Java的配置:

@Configuration
@EnableWebMvc
@EnableTransactionManagement
@ComponentScan("com.spr")
@PropertySource("classpath:application.properties")
@EnableJpaRepositories("com.spr.repository")
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 LocalContainerEntityManagerFactoryBean entityManagerFactory() {LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();entityManagerFactoryBean.setDataSource(dataSource());entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistence.class);entityManagerFactoryBean.setPackagesToScan(env.
getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));entityManagerFactoryBean.setJpaProperties(hibProperties());return entityManagerFactoryBean;}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 JpaTransactionManager transactionManager() {JpaTransactionManager transactionManager = new JpaTransactionManager();transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());return transactionManager;}@Beanpublic UrlBasedViewResolver setupViewResolver() {UrlBasedViewResolver resolver = new UrlBasedViewResolver();resolver.setPrefix("/WEB-INF/pages/");resolver.setSuffix(".jsp");resolver.setViewClass(JstlView.class);return resolver;}}

请注意@EnableJpaRepositories批注。 它允许使用JPA存储库。 com.spr.repository软件包将被扫描以检测存储库。 在entityManagerFactory bean中,我确定将Hibernate用作JPA实现。

初始化类将被省略。

DAO和服务层

Shop实体的存储库:

package com.spr.repository;import org.springframework.data.jpa.repository.JpaRepository;import com.spr.model.Shop;public interface ShopRepository extends JpaRepository<shop, integer=""> {}

无疑,它是本教程中最简单的代码段。 但这需要最高的关注。 JpaRepository接口包含可以用任何实体执行的基本操作(CRUD操作)。 您可以在官方文档页面上找到更多信息。

这是ShopService接口的代码:

public interface ShopService {public Shop create(Shop shop);public Shop delete(int id) throws ShopNotFound;public List findAll();public Shop update(Shop shop) throws ShopNotFound;public Shop findById(int id);}

并实现服务接口:

import java.util.List;import javax.annotation.Resource;import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import com.spr.exception.ShopNotFound;
import com.spr.model.Shop;
import com.spr.repository.ShopRepository;@Service
public class ShopServiceImpl implements ShopService {@Resourceprivate ShopRepository shopRepository;@Override@Transactionalpublic Shop create(Shop shop) {Shop createdShop = shop;return shopRepository.save(createdShop);}@Override@Transactionalpublic Shop findById(int id) {return shopRepository.findOne(id);}@Override@Transactional(rollbackFor=ShopNotFound.class)public Shop delete(int id) throws ShopNotFound {Shop deletedShop = shopRepository.findOne(id);if (deletedShop == null)throw new ShopNotFound();shopRepository.delete(deletedShop);return deletedShop;}@Override@Transactionalpublic List findAll() {return shopRepository.findAll();}@Override@Transactional(rollbackFor=ShopNotFound.class)public Shop update(Shop shop) throws ShopNotFound {Shop updatedShop = shopRepository.findOne(shop.getId());if (updatedShop == null)throw new ShopNotFound();updatedShop.setName(shop.getName());updatedShop.setEmplNumber(shop.getEmplNumber());return updatedShop;}}

这样,就可以使用ShopRepository。

控制者

最后,我可以在控制器中使用ShopSrviceImpl类。 所有JSP页面将被省略,因此您可以在GitHub上找到它们的源代码。

@Controller
@RequestMapping(value="/shop")
public class ShopController {@Autowiredprivate ShopService shopService;@RequestMapping(value="/create", method=RequestMethod.GET)public ModelAndView newShopPage() {ModelAndView mav = new ModelAndView("shop-new", "shop", new Shop());return mav;}@RequestMapping(value="/create", method=RequestMethod.POST)public ModelAndView createNewShop(@ModelAttribute Shop shop, final RedirectAttributes redirectAttributes) {ModelAndView mav = new ModelAndView();String message = "New shop "+shop.getName()+" was successfully created.";shopService.create(shop);mav.setViewName("redirect:/index.html");redirectAttributes.addFlashAttribute("message", message);	return mav;		}@RequestMapping(value="/list", method=RequestMethod.GET)public ModelAndView shopListPage() {ModelAndView mav = new ModelAndView("shop-list");List shopList = shopService.findAll();mav.addObject("shopList", shopList);return mav;}@RequestMapping(value="/edit/{id}", method=RequestMethod.GET)public ModelAndView editShopPage(@PathVariable Integer id) {ModelAndView mav = new ModelAndView("shop-edit");Shop shop = shopService.findById(id);mav.addObject("shop", shop);return mav;}@RequestMapping(value="/edit/{id}", method=RequestMethod.POST)public ModelAndView editShop(@ModelAttribute Shop shop,@PathVariable Integer id,final RedirectAttributes redirectAttributes) throws ShopNotFound {ModelAndView mav = new ModelAndView("redirect:/index.html");String message = "Shop was successfully updated.";shopService.update(shop);redirectAttributes.addFlashAttribute("message", message);	return mav;}@RequestMapping(value="/delete/{id}", method=RequestMethod.GET)public ModelAndView deleteShop(@PathVariable Integer id,final RedirectAttributes redirectAttributes) throws ShopNotFound {ModelAndView mav = new ModelAndView("redirect:/index.html");		Shop shop = shopService.delete(id);String message = "The shop "+shop.getName()+" was successfully deleted.";redirectAttributes.addFlashAttribute("message", message);return mav;}}

spring-data-jpa应用

摘要

Spring Data是非常强大的武器,它可以帮助您更快地开发应用程序,并避免数百个样板代码字符串。 使用Spring Data是在应用程序中创建DAO层的最便捷方法,因此请不要在项目中忽略它。

参考: Fruzenshtein的笔记博客中的Spring JPA Data + Hibernate + MySQL + Maven,来自我们的JCG合作伙伴 Alexey Zvolinskiy。

翻译自: https://www.javacodegeeks.com/2013/05/spring-jpa-data-hibernate-mysql-maven.html

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

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

相关文章

数字通信系统中的均衡技术

均衡技术是为了消除码间串扰的影响 自适应均衡器 可以自动调整抽头滤波系数的均衡器。包含两个工作模式&#xff0c;训练模式和跟踪模式&#xff1b; 训练模式&#xff1a;发射机发射一个已知的定长的序列&#xff0c;以便接收机处的均衡器可以做出正确的设置跟踪模式&#…

eclipse中birt插件使用_waves教学:如何使用通道条插件在DAW中创建模拟工作流

这篇Waves小文章将帮助你了解通道条插件如何来加快混音工作流程&#xff0c;同时还能在DAW中添加令人愉悦的模拟调音台染色——以及它们如何以前所未有的灵活性适应数字新时代。什么是通道条&#xff1f;第一次看到一台老式模拟调音台时&#xff0c;人们常常因为按键、旋钮和推…

X-Mas Musings –在Grails集成测试中不要使用随机服务器端口

对许多人来说&#xff0c;十二月是反思或思考的时期。 所以我决定在去年的事情和想法&#xff0c;以反映- 每一天 &#xff0c;直到圣诞节。 这是第四天 对于Grails集成测试&#xff0c;了解应用程序当前在哪个端口上运行非常有用。 Spring Boot以及因此建立在它上面的Grails都…

主板螺丝是机箱配还是主板配_要配新电脑,A520主板和B450主板哪一个更加值得购买?...

Hello大家好&#xff0c;我是兼容机之家的小牛。上周AMD正式发布了最新的A520芯片组主板&#xff0c;这也补齐了500系列主板的高中低三档配置&#xff0c;现在500系列主板已经拥有X570、B550、A520三个芯片组。那么小牛为什么要拿上一代的B450和最新的A520来做对比呢&#xff1…

使用WebLogic共享库连续交付ADF应用程序

介绍 当ADF应用程序建立在共享库之上时&#xff0c;有一种非常流行的架构模式。 因此&#xff0c;主应用程序被部署为EAR&#xff0c;并且所有子系统都在共享库中实现&#xff0c;这些共享库可以在“热”模式下独立构建并作为JAR部署到WebLogic&#xff0c;而无需停机。 这种方…

信号与系统 chapter1 常见信号及其变换

什么是信号&#xff1f; 它的定义及其宽泛&#xff0c;但在我们电子通信工程中&#xff0c;我们可以把它看成一种波形&#xff1b;在数学上&#xff0c;我们可以把它看成一个函数。说到函数&#xff0c;函数又分为离散与连续&#xff0c;信号也是一样&#xff0c;分为离散信号…

信号与系统 chapter2 冲激偶函数与阶跃函数

什么是冲激偶函数 简单来说&#xff0c;从负方向向0趋近&#xff0c;结果为无穷大&#xff0c;从正方向趋近于0&#xff0c;结果为无穷小 它的性质&#xff1a; 冲激函数求导得来&#xff0c;推广&#xff1a; 阶跃函数 会考察你让你写出函数表达式 看上面那个式子&#xf…

c语言对中文字符串编码_Python || 学习笔记(1):数据类型字符串变量和编码

数据类型特性&#xff1a;对于0很多的整数&#xff0c;python允许用_对0进行分离10_000_000_000就等同于1000000000016进制用0x开头进行表示对于很大或很小的浮点数必须使用科学计数法表示&#xff0c;表示方法为 2.13e10表示2.13x10^10转义字符与C语言一样&#xff0c;为\&…

信号与系统 chapter3 冲激函数的尺度变换

在chapter2里我们简单的示例了一个阶跃函数做尺度变换的例子&#xff0c;在这一节里我们会对冲激函数做尺度变换&#xff0c;同样很简单 关于δ(at)\delta(at)δ(at) 它的证明如下&#xff0c;使用换元法即可得到&#xff1a; 始终利用的是冲激函数只在t0t0t0处有意义 如果它…

信号与系统 chapter4 单位脉冲与单位阶跃序列

标题里有序列&#xff0c;说明咱们这里的自变量都是离散的&#xff0c;离散序列是相对于前面的连续信号而言&#xff0c;这里给它做了一个比较 单位脉冲序列 可以看到单位脉冲函数依然是十分牛批&#xff0c;只有在t0t0t0的地方才发挥作用 单位阶跃 两个单位阶跃序列做差可以…

原始性能数字– Spring Boot 2 Webflux与Spring Boot 1

我对性能测试的设置如下&#xff1a; 示例应用程序公开了一个端点&#xff08;/ passthrough / message&#xff09;&#xff0c;该端点又调用下游服务。 到端点的请求消息如下所示&#xff1a; {"id": "1","payload": "sample payload&q…

信号与系统 chapter5 线性系统与非线性系统

今天我们说一说系统的分类 线性系统 顾名思义&#xff0c;满足线性性质的系统 它有三个特性&#xff1a; 齐次性可加性线性性 这里常见在选择题里让你判断 f1(.)f_{1}(.)f1​(.)代表的是激励&#xff0c;系统的响应不仅和它当前的状态相关&#xff0c;还和以前的状态相关的…

信号与系统 chapter6 时变与时不变系统

时不变系统 通俗来说&#xff0c;就是输入延迟一段时间后&#xff0c;输出也延迟一段相同的时间。比如说一个示波器&#xff0c;你要给它上电显示波形&#xff0c;你就是示波器的输入&#xff0c;你一按下开关&#xff0c;它就马上亮了&#xff1b;下次你在开关上发呆5秒钟再按…

信号与系统 chapter7 因果与非因果

“因果”这个词常常在佛教里提到&#xff0c;比如有因才有果&#xff0c;放在信号与系统里就是你有输入才有输出&#xff0c;但是在所有的系统中你有输入就一定有输出吗&#xff1f;又或者是你有输出但没有输入&#xff0c;这样的系统如何称呼&#xff1f; 此类系统称为非因果系…

互联网和大数据是什么意思_何为互联网大数据?为什么每个人在数据的面前,相当于一丝不挂?...

何为互联网大数据&#xff1f;大数据背后核心迷局是什么&#xff1f;那通过下面一段对话&#xff0c;您可能就明白了。——必胜客店的电话铃响了。客服拿起电话&#xff1a;客服&#xff1a;您好! 请问有什么需要我为您服务&#xff1f;顾客&#xff1a;你好&#xff01; 我想要…

信号与系统 chapter8 LTI连续系统的描述

我们这里对LTI系统的描述主要是用在电路分析上&#xff0c;我们一般先写出电路方程&#xff0c;对电路方程抽象以后得到微分方程 LTI系统的数学模型 这里注意一下电感上要求二阶导数&#xff0c;电阻上求一阶&#xff0c;然后为每一项分别写上系数&#xff0c;倘若读者到这里还…

安装jdk步骤rpm_jenkins rpm包方式安装

war包方式安装jenkins已经说过java openjdk的安装和注意事项&#xff0c;这里不做赘述前提&#xff1a;确保 java的jdk或者jre已安装#]java -version#]whereis java (whereis查看程序运行命令的)#]ls -lrt /usr/bin/java#]ls -lrt /etc/alternatives/java这里简单讲下which、wh…

使用ADF绑定创建视图对象行CreateInsert操作

在这篇简短的文章中&#xff0c;我将重点介绍与在任务流中创建新记录的一种非常常见的方法有关的一个小陷阱。 让我们考虑一个简单的任务流示例&#xff0c;该任务流创建一个新的VO行&#xff0c;如果用户单击“确定”按钮&#xff0c;则在页面片段上显示该行并提交事务&#…

信号与系统 chapter9 关于信号与系统中微分方程的求解

微分方程的求解 许多同学之所以觉得信号与系统难的原因之一就在于它的数学推导&#xff0c;特别是对于一些高等数学基础比较薄弱的同学来说&#xff0c;且不说后面的求解傅里叶变换部分&#xff0c;目前的LTI连续系统微分方程的求解&#xff0c;已经是的有的同学感到云里雾里。…

信号与系统 chapter10 系统的初值问题与系数匹配法

系统的初值问题就是让你求一下系统在0时刻的y(t)y(t)y(t)函数 我们看到它要我们求关于t0t0t0时刻的一些参数&#xff0c;我们这里首先就要想到冲激函数&#xff0c;为什么&#xff1f;因为冲激函数最特殊&#xff0c;它的特性就是在0时刻才有定义&#xff0c;才有值&#xff0…