首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

從零手搭 SpringMVC + Spring Data JPA + Hibernate 完整教程

     編輯:Java 相關知識

專案演進路線圖

  1. Maven 基礎 Java 專案
  2. 轉為 Dynamic Web Module
  3. 整合 Spring + SpringMVC
  4. 新增 JSON 支援 (Jackson)
  5. 配置靜態資源訪問
  6. 解決中文亂碼
  7. 整合 Spring Data JPA + Hibernate

1. Maven 專案建立

建立 maven-archetype-quickstart,GroupId/ArtifactId 自定,得到標準目錄結構與 pom.xml。

2. 轉為 Web 專案

Properties → Project Facets → 勾選 Dynamic Web Module → 生成 WebContent/WEB-INF/web.xml。

<web-app version="3.0">
  <welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list>
</web-app>

3. Spring + SpringMVC 整合

pom.xml 關鍵依賴(版本統一管理)

<properties><spring.version>4.2.5.RELEASE</spring.version></properties>
<dependencies>
  <!-- Spring Core, Web, ORM, TX, JDBC, WebMVC, AOP, Context, Test -->
  <dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId><version>1.10.1.RELEASE</version></dependency>
</dependencies>

applicationContext.xml

<context:component-scan base-package="com.anxpp.demo"/>
<mvc:annotation-driven/>

web.xml 掛載 Spring

<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
<context-param><param-name>contextConfigLocation</param-name><param-value>WEB-INF/applicationContext.xml</param-value></context-param>
<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:springmvc-servlet.xml</param-value></init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>

分層代碼結構

  • Entity: User (id, name)
  • DAO: UserDao interface + UserDaoImpl (@Repository)
  • Service: UserService interface + UserServiceImpl (@Service, @Autowired UserDao)
  • Controller: DemoController (@Controller, @RequestMapping("/"), @Autowired UserService)

部署關鍵:Maven 依賴發布

Properties → Deployment Assembly → Add → Java Build Path Entries → Maven Dependencies,否則運行時缺 JAR。

4. JSON 支援 (Jackson)

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.5.0</version></dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.5.0</version></dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.5.0</version></dependency>

Controller 直接返回 Map<String, Object>,@ResponseBody 自動轉 JSON。

5. 靜態資源配置

<mvc:default-servlet-handler/>
<mvc:resources mapping="/resources/**" location="/public-resources/">
  <mvc:cache-control max-age="3600" cache-public="true"/>
</mvc:resources>

6. 亂碼解決

  • POST:CharacterEncodingFilter (web.xml)
  • GET:Tomcat server.xml <Connector URIEncoding="UTF-8"/>

7. Spring Data JPA + Hibernate 整合

新增依賴

<properties><hibernate.version>5.1.0.Final</hibernate.version></properties>
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>${hibernate.version}</version></dependency>
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>${hibernate.version}</version></dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.9</version></dependency>

META-INF/persistence.xml

<persistence-unit name="demo" transaction-type="RESOURCE_LOCAL">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  <class>com.anxpp.demo.core.entity.User</class>
  <properties>
    <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
    <property name="hibernate.connection.url" value="jdbc:mysql://127.0.0.1:3306/demo?createDatabaseIfNotExist=true"/>
    <property name="hibernate.connection.username" value="root"/>
    <property name="hibernate.connection.password" value="root"/>
    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
  </properties>
</persistence-unit>

applicationContext.xml 擴充 JPA

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="jpaVendorAdapter">
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
      <property name="generateDdl" value="true"/>
      <property name="database" value="MYSQL"/>
    </bean>
  </property>
  <property name="persistenceUnitName" value="demo"/>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
  <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<jpa:repositories base-package="com.anxpp.demo"/>

Entity 加註解

@Entity @Table
public class User {
    @Id @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String name;
    // getter/setter/toString
}

DAO 只需繼承 JpaRepository

public interface UserDao extends JpaRepository<User, Serializable> {
    User findById(Integer id);
    // 衍生查詢:方法名即語義
    List<User> findByIdGreaterThanAndNameLike(Integer id, String name);
}

Service/Controller 正常注入使用

無需寫 DAO 實現,Spring Data JPA 自動代理實現所有 CRUD 與衍生查詢。

驗證成果

  • GET /findall → 返回所有用戶 JSON
  • GET /findbyid?id=1 → 返回單用戶
  • GET /add?name=Tom → 新增用戶
  • 衍生查詢 findByIdGreaterThanAndNameLike 直接可用,無需寫 SQL/JPQL

總結

從零開始,逐層疊加,最終得到一個擁有 RESTful API、JSON 輸出、靜態資源、事務管理、JPA 自動化持久層的現代化 Spring 應用骨架。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved