在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数据的配置

我相信该项目的屏幕截图将帮助您了解正在发生的事情。

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

#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是非常强大的武器,它可以帮助您更快地开发应用程序并避免数百个样板代码字符串。 使用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

Spring JPA数据+休眠+ MySQL + Maven相关推荐

  1. Spring JPA数据+Hibernate+ MySQL + Maven

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

  2. hibernate mysql 注解_【译】Spring 4 + Hibernate 4 + Mysql + Maven集成例子(注解 + XML)

    前言 本文将基于注解配置, 集成Spring 4和Hibernate 4,开发一个增删改查应用,涉及以下内容: 创建Hibernate实体 保存数据到mysql数据库中 在事务transaction内 ...

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

    Spring 4 MVC+Hibernate 4+MySQL+Maven使用注解集成实例 转自:通过注解的方式集成Spring 4 MVC+Hibernate 4+MySQL+Maven,开发项目样例 ...

  4. 淘淘商城项目mysql服务器_SpringMVC+Spring+Mybatis+Mysql+Maven+Svn[ 淘淘商城项目环境搭建 ]...

    背景:淘淘商城项目的环境搭建 说明:采用SpringMVC+Spring+Mybatis+Mysql+Maven+Svn结构搭建,在开发之中可以参考其结构和搭建步骤去搭建实际的工程项目 工程结构简图: ...

  5. Spring Data 系列(二) Spring+JPA入门(集成Hibernate)

    通过[Spring Data 系列(一) 入门]的介绍,通过对比的方式认识到Spring提供的JdbcTemplate的强大功能.通过使用JdbcTemplate,操作数据库,不需要手动处理Conne ...

  6. Spring JPA整合QueryDSL

    前言 Spring JPA是目前比较常用的ORM解决方案,但是其对于某些场景并不是特别的方便,例如查询部分字段,联表查询,子查询等. 而接下来我会介绍与JPA形成互补,同时也是与JPA兼容得很好的框架 ...

  7. springboot原生mysql写法_【Rainbond最佳实践】Spring Boot框架配置MySQL

    Rainbond开源软件介绍: Rainbond是国内首个开源的生产级无服务器PaaS. 深度整合基于Kubernetes的容器管理.多类型CI/CD应用构建与交付.多数据中心的资源管理等技术,提供云 ...

  8. 部署Spring Boot Angular App(Maven和Tomcat)的4种方法

    在上一篇有关Spring Boot angular 5的文章中 ,我们使用Spring Boot angular 5实现了一个完整的堆栈端到端Web应用程序.在本文中,我们将讨论在tomcat上部署S ...

  9. spring jpa 多数据源_Spring同时集成JPA与Mybatis

    ORM ORM的出现,使得关系型数据库映射成了对象:简单来说,有了ORM之后,JAVA程序员从面向JDBC编程转化成面向JAVA对象编程. Spring ORM Spring对ORM的解决方案主要体现 ...

最新文章

  1. infor wms 中英文对照_【融合·君豪】新君豪中英文学校第十周食谱
  2. docker-compose安装mongodb
  3. 分布式事务最终一致看这篇“大白话”的实践
  4. python永久保存数据_python如何保存数据
  5. Android studio 配置使用maven
  6. 使用TopShelf做windows服务
  7. 无法定位程序输入点 InitializeCriticalSectionEx 于动态链接库 Kernel32.dll 上 问题解决方法
  8. macOS编译金山云ksvc ffmpeg,在rtmp flv之上支持hevc h265
  9. java实现modbus rtu协议与 modscan等工具
  10. 运行python.exe文件出现AttributeError: module ‘moviepy.audio.fx.all‘ has no attribute ‘audio_fadein‘
  11. 写好英语科技论文的诀窍: 主动迎合读者期望,预先回答专家可能质疑
  12. oracle unable to open file,ORA-27041:unable to open file
  13. 倍福ADS通讯(三)——ADS通讯协议包格式
  14. 浅谈SBOM(软件物料清单)
  15. 前程无忧:2021节后招聘高峰是否回来
  16. Java语言中print、println和printf的区别
  17. 我谈阶梯博弈( Staircase Nim )
  18. CSS 纵向树 横向树
  19. 网线制作ppt_网线制作PPT课件.ppt-资源下载在线文库www.lddoc.cn
  20. 芯片设计:verilog断言(SVA)语法

热门文章

  1. php array分组,php数组分组简单例子
  2. python绘图时的分解问题的步骤-零基础学python-15.2 分解函数
  3. java数据库编程——执行查询操作(一)
  4. i18n国际化登录页面
  5. 使用poi统计工作职责
  6. buildpack_使用Buildpack容器化Spring Boot应用程序
  7. tomee_微服务系列:MicroProfile和Apache TomEE
  8. javafx 项目_JavaFX,Jigsaw项目和JEP 253
  9. 单例嵌套 ios_嵌套类型的前5个用例
  10. glass fish_Glass Fish 4.0.1中的Jersey SSE功能