Spring JPA数据+休眠+ 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数据的配置

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

弹簧数据jpa项目结构

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

#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/368342.shtml

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

相关文章

关于DJANGO MODELS的个人理解和RELATED_NAME的使用

转自&#xff1a;http://www.cnblogs.com/blogofwyl/p/4283513.html作为一个新人(刚刚大学还没有毕业就出来实习&#xff0c;可以说是真的什么都不知到&#xff0c;什么都要重新学&#xff0c;但是这样真的可以锻炼自己的意志力和能力)。现在在公司是前端和后端一起坐&#xff…

015迭代器

注意迭代器和可迭代对象不同#迭代器&#xff1a;1、有iter方法&#xff0c;2、有next方法li[1,2,3,4,5]diter(li) # 等于li.__iter__()print(d) # <list_iteratorobjectat0x00000174316CC3C8>可以通过next方法取出元素。for循环就是这样的。for循环内部做的三件事1、调用…

CSS属性之attr()

attr()准确的说&#xff0c;不应该是一个属性&#xff0c;而是一个CSS的函数&#xff0c;我们先看看MDN上的介绍吧&#xff1a; Summary The attr() CSS function is used to retrieve the value of an attribute of the selected element and use it in the style sheet. It c…

MySQL大小写敏感的解决方案

前言&#xff1a;对于MySQL的大小写敏感的影响&#xff0c;笔者在一个小项目中深刻的体会到&#xff1a;当想要查询一条数据时&#xff0c;总是出来两条或多条&#xff0c;后来发现是大小写敏感造成的原因&#xff0c;本文就该问题提出解决方案。 1.MySQL大小写敏感的控制 mysq…

利用border制作三角形原理

网站前端页面中&#xff0c;有时候会使用一些三角形&#xff0c;除了使用图片的方式之外&#xff0c;利用css的border属性也可以做出相对应的三角形。那么&#xff0c;利用border是如何实现三角形的制作的呢&#xff1f; 先看下面一个例子&#xff1a; CSS代码&#xff1a; w…

java weblogic 配置_java----weblogic部署应用

安装略创建域在部署过程中&#xff0c;不能用回退按钮&#xff0c;如果输入有误的话只能在该步设置完后重复进行设置。Linux命令和文件(夹)名是区分大小写的。1、进入weblogic的bin目录&#xff1a;#以具体安装目录为准cd /weblogic/Oracle/Middleware/Oracle_Home/wlserver/co…

sass 基础——回顾

1.webstorm 自动编译SASS  下载安装包 http://rubyinstaller.org/downloads/  然后点击安装&#xff0c;路径为默认路径就行&#xff0c; 勾选以下两项    add Ruby executables to your PATH    Associate .rb and rbw files with this Ruby information  安装完…

这么多年第一次自己去用游标和临时表

汗颜&#xff0c;做了这么多年开发自己第一次用游标和临时表 还是借助度娘才写出来的&#xff0c;请大家给指点下。。。 1 CREATE PROCEDURE [dbo].[sp_LaodDefaultFM]2 (3 ExhID int ,4 DefaultExhID INT,5 Result INT6 )7 AS 8 BEGIN 9 --判断当前会话中临时表是…

设置MongoDB副本集分为4个步骤

介绍 在详细介绍配置MongoDB副本集之前&#xff0c;让我简要介绍一下它们&#xff1a; 副本集是Mongodb数据库提供的功能&#xff0c;可实现高可用性和自动故障转移。 它是一种传统的主从配置&#xff0c;但具有自动故障转移功能。 基本上&#xff0c;它是mongod实例的组/集…

一篇文章搞定css3 3d效果

css3 3d学习心得 卡片反转魔方banner图 首先我们要学习好css3 3d一定要有一定的立体感 通过这个图片应该清楚的了解到了x轴 y轴 z轴是什么概念了。 首先先给大家看一个小例子&#xff1a; 卡片反转 这个例子只是简单的纯css3 3d 关于y轴旋转 下面是代码&#xff1a; 这是HT…

5个编码技巧以减少GC开销

在本文中&#xff0c;我们将介绍五种方法&#xff0c;这些方法可以使用有效的编码来帮助垃圾回收器减少分配和释放内存的CPU时间&#xff0c;并减少GC开销。 较长的GC通常会导致我们的代码在回收内存时被停止&#xff08;也称为“停止世界”&#xff09;。 一些背景 GC的建立…

java usb 无驱打印_Windows Usb 无驱动打印

\?\USB#VID_8866&PID_0100#0001B0000000#{a5dcbf10-6530-11d2-901f-00c04fb951ed}USB小票打印解决办法一、需要驱动&#xff0c;无需更改程序安装USB打印驱动&#xff0c;然后共享打印机&#xff0c;通过 “\\计算机\打印机名”的形式&#xff0c;按端口方式写。1二、直接…

需要学习的东西列表

1.Python2.webservice3.requirejs4.idea5.webService6.redis7.doubble8.mongDB9.zookper 大数据学习曲线&#xff1a;课程一、大数据运维之Linux基础课程二、大数据开发核心技术-Hadoop 2.x从入门到精通课程三、大数据开发核心技术-大数据仓库Hive精讲课程四、大数据协作框架-S…

微信小程序 引用其他js里的方法

微信小程序中&#xff0c;在微信官方开发文档我们可以知道 小程序的目录结构 。 一个小程序页面由四个文件组成&#xff0c;一个小程序页面的四个文件具有相同路径与文件名&#xff0c;由此我们可知一个小程序页面对应着一个跟页面同名的js文件。可是当有些公共方法&#xff0…

C++内存模型

C内存模型 一文了解所有C内存的问题 AlexCool 目录 一 C内存模型 二 C对象内存模型 三 C程序运行内存空间模型 四 C栈内存空间模型 五 C堆内存空间模型 六 C内存问题及常用的解决方法 七 C程序内存性能测试 环境&#xff1a; uname -a Linux alexfeng 3.19.0-15-generic #…

css之absolute

一、absolute和float有相同的特性&#xff0c;包裹性和破坏性 1、absolute和float的相似(看下面的demo&#xff0c;如果图片在左上角&#xff0c;那么用float和absolute都一样) 1 <!doctype html>2 <html>3 <head>4 <meta charset"utf-8">5…

inline「一」:从 image 底部白边初识 line-height

本文首发于个人博客 http://www.lijundong.com/image-and-line-height/ 今天在做一个静态页面时&#xff0c;图片底部出现一条 3px 高度的白边&#xff0c;既不是 margin 也不是 padding&#xff0c;找了好久没能解决&#xff0c;后来才发现与 line-height 相关&#xff0c;问…

(转) STM32--ADC

原标题&#xff1a;STM32之ADC步骤小技巧&#xff08;英文&#xff09; 看到标题&#xff0c;别吓到哈、并不是要用英文写、至于原因是什么、请往下看&#xff1a; 言归正传&#xff1a;STM32的ADC模块的特色 1、1MHz转换速率、12位转换结果&#xff08;12位、记住这个12位哈、…

嗨,那里有回调!

因为是我的书包&#xff0c;所以我喜欢JavaScript 。 实际上&#xff0c;我已经开始喜欢JavaScritp的面向异步回调的编程风格 。 因此&#xff0c;当我发现自己处于非JavaScript环境中时&#xff08;例如Java&#xff09; &#xff0c;我往往会错过使用回调的机会。 好消息是…

GC内存可视化器教程–第一部分

正如您从以前的文章中可能已经读到的那样&#xff0c;要获得的Java程序员的一项关键技能就是理解和评估JVM的运行状况的能力&#xff0c;例如Java堆内存占用量以及垃圾回收过程。 为了实现上述目标&#xff0c;所有JVM供应商&#xff08;Oracle&#xff0c;IBM等&#xff09;都…