手把手教你從最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate(含原始碼下載)
轉載請註明出處:http://blog.csdn.net/anxpp/article/details/51415366,謝謝!
本文會介紹從一個最基本的java工程,到Web工程,到整合Spring、SpringMVC、SpringDataJPA+Hibernate。
平時我們可能是通過一個模板搭建一個工程,或者是直接匯入一個專案,而本文選擇從最基本的java工程開始,目的是為了展示更多原理。
當然,我們還是從一個最基本的Maven工程開始,其實普通的非Maven工程,搭建過程幾乎是一模一樣的,只是Jar包需要我們手動的新增到工程中,而Maven工程就只是修改配置檔案即可。推薦幾篇相關文章:
對 Spring Data JPA 更詳細的介紹,請戳->Spring ORM+Hibernate?Out!換 Spring Data JPA 吧!
下面就正式開始。
1、基於Maven(如果不使用Maven也可以用傳統的工程)建立最基本的Java工程
新建工程,選擇Maven Project,Next:
勾選為簡單的工程(Create a simple project),Next:
Group id為你的域名反序,通常跟工程原始碼的包名對應,Artifact id為這個Group id中工程的唯一名,根據你的愛好,怎麼填都行,然後Finish:
這是得到的工程目錄結構是這樣的:
pom.xml就是Maven的核心檔案。
2、將工程設定為動態網頁模式
接下來就將工程轉換為Web工程,右鍵開啟工程屬性,如圖,點選左邊選單中的Project Facets,然後點選Convert to faceted from...:
在右邊,我們勾選Dynamic Web Module(動態網頁),然後點OK:
這時會多出一個WebContent目錄:
在WEB-INF目錄下,新增web.xml檔案,內如如下:
然後新增一個歡迎頁index.html:
這時目錄結構如下:
這時,就可以右鍵工程,Run On Server了,可以看下效果:
3、整合Spring+SpringMVC
新建包,並新增一些介面和類(具體程式碼後面會列出來),包結構如圖:
需要新增jar包,直接修改pom檔案即可,如果為普通工程,按pom.xml中的jar包,新增到工程中即可。
首先新增使用的spring版本,方便統一管理,然後再新增所有需要的jar包,下面把此處需要的所有jar包新增進來,完成後的pom.xml如下:
在WEB-INF目錄下新增Spring配置檔案applicationContext.xml,並新增如下內容:
修改web.xml,將spring新增進去:
下面開始編寫程式碼,注意註解不要忘記寫,在本小節開始部分已經給出了包的層次結構。
實體User:
- package com.anxpp.demo.core.entity;
- public class User {
- private Integer id;
- private String name;
- public User(Integer id, String name) {
- this.id = id;
- this.name = name;
- }
- 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;
- }
- @Override
- public String toString() {
- return "id:"+id+",name:"+name;
- }
- }
dao層介面UserDao:
- package com.anxpp.demo.core.dao;
- import com.anxpp.demo.core.entity.User;
- public interface UserDao {
- User getUser(Integer id,String name);
- }
dao層實現UserDaoImpl:
- package com.anxpp.demo.core.dao.impl;
- import org.springframework.stereotype.Repository;
- import com.anxpp.demo.core.dao.UserDao;
- import com.anxpp.demo.core.entity.User;
- @Repository
- public class UserDaoImpl implements UserDao{
- @Override
- public User getUser(Integer id, String name) {
- return new User(id, name);
- }
- }
service層介面UserService:
- package com.anxpp.demo.core.service;
- import com.anxpp.demo.core.entity.User;
- public interface UserService {
- User getUser(Integer id, String name);
- }
service層實現:
- package com.anxpp.demo.core.service.impl;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import com.anxpp.demo.core.dao.UserDao;
- import com.anxpp.demo.core.entity.User;
- import com.anxpp.demo.core.service.UserService;
- @Service
- public class UserServiceImpl implements UserService{
- @Autowired
- UserDao userDao;
- @Override
- public User getUser(Integer id, String name) {
- return userDao.getUser(id, name);
- }
- }
controller層DemoController:
- package com.anxpp.demo.controller;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
- import com.anxpp.demo.core.service.UserService;
- @Controller
- @RequestMapping("/")
- public class demoController {
- @Autowired
- UserService userService;
- @RequestMapping("/")
- @ResponseBody
- public String index(){
- return "index";
- }
- @RequestMapping("/getuser")
- @ResponseBody
- public String getUser(Integer id, String name){
- return userService.getUser(id, name).toString();
- }
- }
這是還不能直接Run On Server,因為jar包不會被一同釋出,我們需要如下配置:
右鍵工程選擇屬性,按下圖配置:
這時候就可以執行測試了,效果如下:
到這裡,我們還沒有運算元據庫的。
4、新增返回Json格式資料支援
現在,我們常使用json作為資料傳輸的格式,下面就為SpringMVC新增返回json的支援
首先新增jar包:
然後改寫getUser()方法如下:
- @RequestMapping("/getuser")
- @ResponseBody
- public Map<String, Object> getUser(Integer id, String name){
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("state", "success");
- map.put("data", userService.getUser(id, name));
- return map;
- }
重新執行後訪問效果如下:
此時,就可以返回json資料了。
5、配置靜態資源訪問
通常情況下,WEB-INF目錄下的資源,我們是無法直接訪問的,如果我們的網站是html+ajax構成的,那麼就可以在WEB-INF之外新建html的目錄,併為web.xml配置預設的過濾器,不過注意要放到SpingMVC過濾器之前:
如果一定要訪問WEB-INF目錄內的資源,通過查閱Spring官方文件,發現有兩種方式:
1、手寫一個資源對映器:
- @Configuration
- @EnableWebMvc
- public class WebConfig extends WebMvcConfigurerAdapter {
- @Override
- public void addResourceHandlers(ResourceHandlerRegistry registry) {
- registry.addResourceHandler("/resources/**")
- .addResourceLocations("/public-resources/")
- .setCacheControl(CacheControl.maxAge(1, TimeUnit.HOURS).cachePublic());
- }
- }
可以看到,還可以設定快取時間的,而更簡單的方式,就是xml配置:
- <mvc:resources mapping="/resources/**" location="/public-resources/">
- <mvc:cache-control max-age="3600" cache-public="true"/>
- </mvc:resources>
也可以加上下面的這個:
6、亂碼解決
我們通常使用ajax提交請求,但也常用位址列直接測試。請求提交分get和post。
使用post提交請求是,一般是不會出現中文亂碼的,但是如果確實出現了亂碼,可以通過在web.xml新增一個編碼過濾器解決:
- <filter>
- <filter-name>CharacterEncoding</filter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>UTF-8</param-value>
- </init-param>
- <init-param>
- <param-name>forceEncoding</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>CharacterEncoding</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
上面只能解決post的中文亂碼,對於get(含瀏覽器位址列直接提交方式),我們需要修改tomcat配置,在conf目錄下的server.xml中找到並如下修改:
如果我們只是測試,專案並沒有部署,可以直接在eclipse中的server下,找到server.xml,做出上面一樣的改動即可:
7、整合SpringDataJPA+Hibernate
你可以通過這篇文字瞭解JPA:JPA規範介紹及例項(Java資料持久化解決方案)
SpringDataJPA也正是這樣一種輕量級的解決方案,而首選的Hibernate就實現了JPA。
首先還是jar包,SpringDataJPA的jar包,在之前整合Spring時已經一併加入,下面是Hibernate(和mysql驅動)的jar包:
- <!-- hibernate -->
- <dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-core</artifactId>
- <version>${hibernate.version}</version>
- </dependency>
- <dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-ehcache</artifactId>
- <version>${hibernate.version}</version>
- </dependency>
- <dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-entitymanager</artifactId>
- <version>${hibernate.version}</version>
- </dependency>
- <dependency>
- <groupId>org.hibernate</groupId>
- <artifactId>hibernate-c3p0</artifactId>
- <version>${hibernate.version}</version>
- </dependency>
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>5.1.9</version>
- </dependency>
統一管理的版本為:
新增Jpa的配置檔案persistence.xml到META-INF目錄下,本文介紹時資料庫使用MySQL。並新增如下內容:
Spring配置檔案applicationContext.xml中增加JPA支援後的完整內容:
修改實體:
- package com.anxpp.demo.core.entity;
- import javax.persistence.Entity;
- import javax.persistence.GeneratedValue;
- import javax.persistence.GenerationType;
- import javax.persistence.Id;
- import javax.persistence.Table;
- @Entity
- @Table
- public class User {
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- private Integer id;
- private String name;
- public User() {
- }
- public User(String name) {
- this.name = name;
- }
- 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;
- }
- @Override
- public String toString() {
- return "id:"+id+",name:"+name;
- }
- }
可以刪掉dao層實現了,我們記住將dao層介面繼承自強大的JpaRepository:
- public interface UserDao extends JpaRepository<User, Serializable>{
- User findById(Integer id);
- }
是不是看上去特別簡潔,而且都不需要寫實現的,SpringDataJPA會自動幫我們完成。
修改service層介面:
- package com.anxpp.demo.core.service;
- import java.util.List;
- import com.anxpp.demo.core.entity.User;
- public interface UserService {
- User findById(Integer id);
- User save(String name);
- List<User> findAll();
- }
修改service層實現:
- package com.anxpp.demo.core.service.impl;
- import java.util.List;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import com.anxpp.demo.core.dao.UserDao;
- import com.anxpp.demo.core.entity.User;
- import com.anxpp.demo.core.service.UserService;
- @Service
- public class UserServiceImpl implements UserService{
- @Autowired
- UserDao userDao;
- @Override
- public User findById(Integer id) {
- return userDao.findById(id);
- }
- @Override
- public User save(String name) {
- return userDao.save(new User(name));
- }
- @Override
- public List<User> findAll() {
- return userDao.findAll();
- }
- }
修改controller,提供多個測試介面:
- package com.anxpp.demo.controller;
- import java.util.HashMap;
- import java.util.Map;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
- import com.anxpp.demo.core.service.UserService;
- @Controller
- @RequestMapping("/")
- public class demoController {
- @Autowired
- UserService userService;
- @RequestMapping("/")
- @ResponseBody
- public String index(){
- return "index";
- }
- @RequestMapping("/info")
- public String info(){
- return "info";
- }
- @RequestMapping("/findall")
- @ResponseBody
- public Map<String, Object> getUser(){
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("state", "success");
- map.put("data", userService.findAll());
- return map;
- }
- @RequestMapping("/findbyid")
- @ResponseBody
- public Map<String, Object> findById(Integer id){
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("state", "success");
- map.put("data", userService.findById(id));
- return map;
- }
- @RequestMapping("/add")
- @ResponseBody
- public Map<String, Object> save(String name){
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("state", "success");
- map.put("data", userService.save(name));
- return map;
- }
- }
執行效果:
那麼,如果需要新增一個查詢id大於指定值的指定姓氏的資料呢?
如果是SQL,我們會這樣寫(?表示引數):
- SELECT * FROM user WHERE id>? AND name like '?%';
但是這裡,我們連SQL(或者HQL)都可以不用寫,直接在dao層介面新增一個方法即可:
- List<User> findByIdGreaterThanAndNameLike(Integer id,String name);
你不需要懷疑,上面的方法執行偏偏就是能成功(注意:service實現的使用,呼叫該方法記得name+"%")!
原始碼:
github地址:https://github.com/anxpp/SpringMVC-SpringDataJpa-Hibernate-Demo
本地下載:SpringMVC + Spring Data JPA + Hibernate
CSDN下載(不需要積分):http://download.csdn.net/download/anxpp/9520498
相關文章
- 手把手教你搭建OpenDRIVE道路模型(下)模型
- 手把手教你在Mac OS下載、編譯及匯入Android原始碼Mac編譯Android原始碼
- 手把手教你使用LabVIEW OpenCV dnn實現影像分類(含原始碼)ViewOpenCVDNN原始碼
- 手把手教你入門和實踐特徵工程 的全方位萬字筆記,附程式碼下載特徵工程筆記
- 手把手教你使用LabVIEW OpenCV DNN實現手寫數字識別(含原始碼)ViewOpenCVDNN原始碼
- 手把手教你從零搭建深度學習專案(附連結)深度學習
- 抖音視訊批量下載,手把手教你下載抖音無水印視訊
- 手把手教你搭建mongodb副本集MongoDB
- 手把手教你搭建部落格
- 手把手教你搭建 Ceph+JuiceFSUI
- 手把手教你搭建Docker Registry私服Docker
- 手把手教你搭建自己的Angular元件庫Angular元件
- 手把手教你快速搭建專屬的storybook
- 老羅Android視訊[詳細版]全集下載(含原始碼)Android原始碼
- CRM系統原始碼下載PHP全開源搭建原始碼PHP
- SpringMVC檔案上傳與下載(附工程原始碼)SpringMVC原始碼
- 手把手教你搭建自己的Angular元件庫 - DevUIAngular元件devUI
- [手把手教你] 1分鐘搭建Hyperf
- 手把手教你快速搭建React元件庫React元件
- 手把手教你搭建OpenDRIVE道路模型(上)模型
- 手把手教你,如何在windows系統搭建mysql主從複製的環境WindowsMySql
- AOSP 原始碼下載原始碼
- 下載開原始碼原始碼
- apache kafka原始碼分析工程搭建(IDEA)ApacheKafka原始碼Idea
- 手把手教你擼一套Redux(Redux原始碼解讀)Redux原始碼
- 手把手教你使用easyexcel匯出資料【附帶原始碼】Excel原始碼
- 手把手教你搭建自己的深度學習機器深度學習
- TP開發的原始碼下載站系統,素材下載站原始碼系統,線上下載原始碼系統原始碼
- 手把手教你從零開始搭建SpringBoot後端專案框架Spring Boot後端框架
- 手把手教你搭建ffmpeg命令列環境命令列
- 手把手教你用vue搭建個人站Vue
- 手把手教你搭建一個 Elasticsearch 叢集Elasticsearch
- 手把手教你搭建SSH框架(Eclipse版)框架Eclipse
- 手把手教你搭建Docker私有倉庫HarborDocker
- 從原始碼探究JAVA的equals和==原始碼Java
- 建立第一個基於Prism框架的WPF應用例項(含原始碼下載)框架原始碼
- 原始碼的下載與編譯原始碼編譯
- im原始碼uniapp下載[php開源系統]+搭建教程原始碼APPPHP