Spring+SpringMVC+Springdatajpa+Freemarker

最近需要使用springMVC 使用 spring data jpa作为dao层。 以前没有接触过。赶紧学学。记录一下。

spring data 帮我们封装了很多dao层实现。 让我们只需要定义接口就可以直接使用很多基本的查询。

自己从0开始建项目 熟悉一下框架的搭建。 使用的 eclipse for javaee  。使用 maven管理。

首先 建立一个maven项目。

添加 web.xml 作为 web应用的 核心配置。这个可不能少。 

[html] view plaincopy
  1.   
[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">  
  3.   <display-name>test2</display-name>  
  4.     <!-- 编码过滤。 使用 utf-8编码 -->  
  5.     <filter>  
  6.       <filter-name>encodingFilter</filter-name>  
  7.       <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  8.       <init-param>  
  9.         <param-name>encoding</param-name>  
  10.         <param-value>UTF-8</param-value>  
  11.       </init-param>  
  12.       <init-param>  
  13.         <param-name>forceEncoding</param-name>  
  14.         <param-value>true</param-value>  
  15.       </init-param>  
  16.     </filter>  
  17.     <filter-mapping>  
  18.       <filter-name>encodingFilter</filter-name>  
  19.       <url-pattern>/*</url-pattern>  
  20.     </filter-mapping>  
  21.       
  22.     <!-- spring的核心控制器配置。 -->  
  23.     <servlet>  
  24.         <servlet-name>spring-servlet</servlet-name>  
  25.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  26.         <!-- 配置文件的位置。默认 好像是 ApplicationContext.xml? 不太确定 太久不用默认的了 反正我都是自己配置一个新的 -->  
  27.         <init-param>  
  28.             <param-name>contextConfigLocation</param-name>  
  29.             <param-value>classpath:spring-servlet-config.xml</param-value>  
  30.         </init-param>  
  31.         <load-on-startup>1</load-on-startup>  
  32.     </servlet>  
  33.     <servlet-mapping>  
  34.         <servlet-name>spring-servlet</servlet-name>  
  35.         <url-pattern>/*</url-pattern>  
  36.     </servlet-mapping>  
  37. </web-app>  


建立 spring-servlet-config.xml

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xmlns:context="http://www.springframework.org/schema/context"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
  7.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd  
  8.         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">  
  9.     <!--配置文件 -->    
  10.     <context:property-placeholder location="classpath:config.properties"/>  
  11.       
  12.     <context:annotation-config />  
  13.     <mvc:annotation-driven />  
  14.     <!-- 扫描这个包下面的注解,自动注入bean -->  
  15.     <context:component-scan base-package="com.aurora.test2" />  
  16.         <!-- 将配置文件分开 便于管理 -->  
  17.     <import resource="spring-mvc.xml"/>  
  18.    <span style="white-space:pre">   </span><import resource="spring-orm.xml"/>  
  19. </beans>  


spring-mvc.xml

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd  
  6.         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">  
  7.   
  8.     <bean id="viewResolver"    
  9.         class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">    
  10.         <property name="cache" value="true" />    
  11.         <property name="prefix" value="" />  
  12.         <property name="suffix" value=".ftl" />    
  13.         <property name="contentType" value="text/html;charset=UTF-8"></property>    
  14.         <property name="requestContextAttribute" value="request" />    
  15.         <property name="exposeSpringMacroHelpers" value="true" />    
  16.         <property name="exposeRequestAttributes" value="true" />    
  17.         <property name="exposeSessionAttributes" value="true" />    
  18.     </bean>    
  19.      <bean id="multipartResolver"   
  20.            class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
  21.         <property name="maxUploadSize" value="1000000"/>  
  22.      </bean>  
  23.          
  24.     <bean id="freemarkerConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean">  
  25.         <property name="location" value="classpath:freemarker.properties"/>  
  26.     </bean>  
  27.       
  28.       
  29.     <bean id="freemarkerConfig"  
  30.         class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
  31.         <property name="templateLoaderPath" value="/WEB-INF/view/" />  
  32.         <property name="freemarkerSettings" ref="freemarkerConfiguration"/>  
  33.     </bean>  
  34.     <mvc:default-servlet-handler/>  
  35.     <mvc:resources location="/images/**" mapping="/images/"/>  
  36.     <mvc:resources location="/uploads/**" mapping="/uploads/"/>  
  37. </beans>  

spring-orm.xml

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xmlns:jpa="http://www.springframework.org/schema/data/jpa"  
  4.     xmlns:p="http://www.springframework.org/schema/p"  
  5.     xmlns:tx="http://www.springframework.org/schema/tx"  
  6.     xmlns="http://www.springframework.org/schema/beans"  
  7.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  8.         http://www.springframework.org/schema/beans/spring-beans.xsd  
  9.         http://www.springframework.org/schema/data/jpa   
  10.         http://www.springframework.org/schema/data/jpa/spring-jpa-1.2.xsd  
  11.         http://www.springframework.org/schema/tx   
  12.         http://www.springframework.org/schema/tx/spring-tx-3.2.xsd" >  
  13.   
  14.     <bean  
  15.         id="dataSource"  
  16.         class="com.alibaba.druid.pool.DruidDataSource"  
  17.         destroy-method="close"  
  18.         init-method="init" >  
  19.   
  20.         <property  
  21.             name="url"  
  22.             value="${jdbc.url}" />  
  23.   
  24.         <property  
  25.             name="username"  
  26.             value="${jdbc.user}" />  
  27.   
  28.         <property  
  29.             name="password"  
  30.             value="${jdbc.password}" />  
  31.   
  32.         <property  
  33.             name="filters"  
  34.             value="stat" />  
  35.   
  36.         <property  
  37.             name="maxActive"  
  38.             value="20" />  
  39.   
  40.         <property  
  41.             name="initialSize"  
  42.             value="1" />  
  43.   
  44.         <property  
  45.             name="maxWait"  
  46.             value="60000" />  
  47.   
  48.         <property  
  49.             name="minIdle"  
  50.             value="1" />  
  51.   
  52.         <property  
  53.             name="timeBetweenEvictionRunsMillis"  
  54.             value="3000" />  
  55.   
  56.         <property  
  57.             name="minEvictableIdleTimeMillis"  
  58.             value="300000" />  
  59.   
  60.         <property  
  61.             name="validationQuery"  
  62.             value="SELECT 'x'" />  
  63.   
  64.         <property  
  65.             name="testWhileIdle"  
  66.             value="true" />  
  67.   
  68.         <property  
  69.             name="testOnBorrow"  
  70.             value="false" />  
  71.   
  72.         <property  
  73.             name="testOnReturn"  
  74.             value="false" />  
  75.   
  76.         <property  
  77.             name="poolPreparedStatements"  
  78.             value="true" />  
  79.   
  80.         <property  
  81.             name="maxPoolPreparedStatementPerConnectionSize"  
  82.             value="20" />  
  83.     </bean>  
  84.   
  85.     <!-- entity manager config -->  
  86.   
  87.     <bean  
  88.         id="emf"  
  89.         class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"  
  90.         p:dataSource-ref="dataSource" />  
  91.   
  92.     <!-- transaction manager config -->  
  93.   
  94.     <bean  
  95.         id="txManager"  
  96.         class="org.springframework.orm.jpa.JpaTransactionManager"  
  97.         p:entityManagerFactory-ref="emf" />  
  98.   
  99.     <tx:annotation-driven transaction-manager="txManager" />  
  100.   
  101.     <jpa:repositories  
  102.         base-package="com.aurora.test2.dao"  
  103.         entity-manager-factory-ref="emf"  
  104.         transaction-manager-ref="txManager" />  
  105.   
  106. </beans>  
config.properties

[plain] view plaincopy
  1. #jdbc  
  2. jdbc.url=jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:xxxx  
  3. jdbc.user=xxx  
  4. jdbc.password=xxx  

freemarker.properties

[plain] view plaincopy
  1. tag_syntax=auto_detect  
  2. template_update_delay=2  
  3. default_encoding=UTF-8  
  4. output_encoding=UTF-8  
  5. locale=zh_CN  
  6. date_format=yyyy-MM-dd  
  7. time_format=HH:mm:ss  
  8. datetime_format=yyyy-MM-dd HH:mm:ss  

hibernate.properties

[html] view plaincopy
  1. hibernate.show_sql=true  
  2. hibernate.format_sql=true  

还需要在 resources/META-INF/ 下面 配置 persistence.xml

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <persistence version="2.0"  
  3.     xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="  
  5.         http://java.sun.com/xml/ns/persistence  
  6.         http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">  
  7.   
  8.     <persistence-unit name="xiaoyu" transaction-type="RESOURCE_LOCAL">  
  9.         <provider>org.hibernate.ejb.HibernatePersistence</provider>  
  10.     </persistence-unit>  
  11. </persistence>  

需要在 pom.xml 里面 添加依赖包

[html] view plaincopy
  1. <dependencies>  
  2.     <dependency>  
  3.         <groupId>ch.qos.logback</groupId>  
  4.         <artifactId>logback-classic</artifactId>  
  5.         <version>1.0.9</version>  
  6.     </dependency>  
  7.     <dependency>  
  8.         <groupId>org.springframework</groupId>  
  9.         <artifactId>spring-webmvc</artifactId>  
  10.         <version>3.2.1.RELEASE</version>  
  11.     </dependency>  
  12.     <dependency>  
  13.         <groupId>org.springframework</groupId>  
  14.         <artifactId>spring-orm</artifactId>  
  15.         <version>3.2.1.RELEASE</version>  
  16.     </dependency>  
  17.     <dependency>  
  18.         <groupId>org.springframework</groupId>  
  19.         <artifactId>spring-tx</artifactId>  
  20.         <version>3.2.1.RELEASE</version>  
  21.     </dependency>  
  22.     <dependency>  
  23.         <groupId>org.springframework</groupId>  
  24.         <artifactId>spring-context-support</artifactId>  
  25.         <version>3.2.1.RELEASE</version>  
  26.     </dependency>  
  27.     <dependency>  
  28.         <groupId>org.springframework</groupId>  
  29.         <artifactId>spring-jms</artifactId>  
  30.         <version>3.2.1.RELEASE</version>  
  31.     </dependency>  
  32.     <dependency>  
  33.         <groupId>org.springframework</groupId>  
  34.         <artifactId>spring-jdbc</artifactId>  
  35.         <version>3.2.1.RELEASE</version>  
  36.     </dependency>  
  37.     <dependency>  
  38.         <groupId>org.springframework</groupId>  
  39.         <artifactId>spring-web</artifactId>  
  40.         <version>3.2.1.RELEASE</version>  
  41.     </dependency>  
  42.     <dependency>  
  43.         <groupId>org.springframework.data</groupId>  
  44.         <artifactId>spring-data-jpa</artifactId>  
  45.         <version>1.3.0.RELEASE</version>  
  46.     </dependency>  
  47.     <dependency>  
  48.         <groupId>org.hibernate</groupId>  
  49.         <artifactId>hibernate-entitymanager</artifactId>  
  50.         <version>4.1.9.Final</version>  
  51.     </dependency>  
  52.     <dependency>  
  53.         <groupId>org.freemarker</groupId>  
  54.         <artifactId>freemarker</artifactId>  
  55.         <version>2.3.19</version>  
  56.     </dependency>  
  57.     <dependency>  
  58.         <groupId>javax.inject</groupId>  
  59.         <artifactId>javax.inject</artifactId>  
  60.         <version>1</version>  
  61.     </dependency>  
  62.     <dependency>  
  63.         <groupId>com.alibaba</groupId>  
  64.         <artifactId>druid</artifactId>  
  65.         <version>0.2.11</version>  
  66.     </dependency>  
  67.     <dependency>  
  68.         <groupId>commons-fileupload</groupId>  
  69.         <artifactId>commons-fileupload</artifactId>  
  70.         <version>1.2.2</version>  
  71.     </dependency>  
  72.     <dependency>  
  73.         <groupId>mysql</groupId>  
  74.         <artifactId>mysql-connector-java</artifactId>  
  75.         <version>5.1.23</version>  
  76.     </dependency>  
  77.   </dependencies>  

还需要注意一点 之前 我们配置freemarker的根目录

[html] view plaincopy
  1. <bean id="freemarkerConfig"  
  2.     class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">  
  3.     <property name="templateLoaderPath" value="/WEB-INF/view/" />  
  4.     <property name="freemarkerSettings" ref="freemarkerConfiguration"/>  
  5. </bean>  
所以 必须要在 /web-inf/ 目录下 建立 view文件夹。

ok 运行一下 项目启动了。 环境就搭好了。


下面开始添加java代码 注意 刚刚配置了 注解注入的 包路径是 

[html] view plaincopy
  1. <context:component-scan base-package="com.aurora.test2" />  

所以 我们的java代码的包路径必须是这个。

在该包下 建立 mvc看框架.  controller 包. dao包 entity 包 service包

controller

[java] view plaincopy
  1. package com.aurora.test.controller;  
  2.   
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.PathVariable;  
  5. import org.springframework.web.bind.annotation.RequestMapping;  
  6. import org.springframework.web.servlet.ModelAndView;  
  7.   
  8. @Controller  
  9. @RequestMapping(value="/test")  //控制器map  
  10. public class TestController {  
  11.       
  12.     //@Autowired  
  13.     //private FeedbackService feedbackService;  //注入 服务  
  14.       
  15.     @RequestMapping(value="/list"//请求map  
  16.     public ModelAndView list() {  
  17.         ModelAndView mv = new ModelAndView();  
  18.         mv.setViewName("test_list");  
  19.         //mv.addObject("count", feedbackService.count());  
  20.         //mv.addObject("system",feedbackService.systemFeedback());  
  21.         //mv.addObject("named",feedbackService.testNamed());  
  22.         return mv;  
  23.     }  
  24.   
  25.     @RequestMapping(value="/list/{id}")  
  26.     public ModelAndView userList(@PathVariable Long id) {  
  27.         ModelAndView mv = new ModelAndView();  
  28.         mv.setViewName("user_list");  
  29.         //mv.addObject("feedbacks", feedbackService.userFeedbacks(id));  
  30.         return mv;  
  31.     }  
  32. }  
service层

FeedbackService.java

[java] view plaincopy
  1. package com.aurora.test.service;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.springframework.beans.factory.annotation.Autowired;  
  6. import org.springframework.stereotype.Service;  
  7. import org.springframework.transaction.annotation.Transactional;  
  8.   
  9. import com.aurora.test.dao.FeedbackRepository;  
  10. import com.aurora.test.dao.UserRepository;  
  11. import com.aurora.test.entity.Feedback;  
  12. import com.aurora.test.entity.User;  
  13.   
  14. @Service  
  15. @Transactional  
  16. public class FeedbackService {  
  17.     @Autowired  
  18.     private FeedbackRepository feedbackRepository;  
  19.     @Autowired  
  20.     private UserRepository userRepository;  
  21.       
  22.     public long count() {  
  23.         return feedbackRepository.count();  
  24.     }  
  25.       
  26.     public Feedback systemFeedback() {  
  27.         return feedbackRepository.systemFeedback();  
  28.     }  
  29.       
  30.     public List<Feedback> userFeedbacks(Long userId) {  
  31.         User user = userRepository.findOne(userId);  
  32.         return feedbackRepository.findByUser(user);  
  33.     }  
  34.       
  35.     public Feedback testNamed() {  
  36.         return feedbackRepository.testNamed();  
  37.     }  
  38. }  

entity 建立了2个 简单的 单表映射 就不写了。

主要是dao层。 spring data 是只需要写接口就可以了。

一个简单的例子

 

[java] view plaincopy
  1. package com.aurora.test2.dao;  
  2.   
  3. import org.springframework.data.jpa.repository.JpaRepository;  
  4.   
  5. import com.aurora.test2.entity.User;  
  6.   
  7. public interface UserRepository extends JpaRepository<User, Long> {  
  8.   
  9. }  
这样就可以了 可以 使用 默认的 很多 方法。 绝大部分 这就已经足够了。基本的增删查改 甚至分页什么的 都可以了。但是 也许 你需要一些特殊的查询。比较复杂 需要些sql。你可以这样

[java] view plaincopy
  1. @Query("from Feedback f where f.user.id=?1")  
  2. public List<Feedback> listCunstom(Long userId);  


一些参数可以这样

[java] view plaincopy
  1. public interface UserRepository extends JpaRepository<User, Long> {  
  2.   
  3.   @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")  
  4.   User findByLastnameOrFirstname(@Param("lastname") String lastname,  
  5.                                  @Param("firstname") String firstname);  
  6. }  


通过注解的 query 来写 hql语句 就可以了。

还可以通过查询的方法名来实现一些查询。比如

findByUser(User user)

 定义这个方法 就可以了 不用实现。spring data会自动帮你实现。 只要你满足特定的格式。 下面是 一些关键字

Keyword Sample JPQL snippet
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Between findByStartDateBetween … where x.startDate between 1? and ?2
LessThan findByAgeLessThan … where x.age < ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull findByAgeIsNull … where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection<Age> ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection<Age> age) … where x.age not in ?1
True findByActiveTrue() … where x.active = true
False findByActiveFalse() … where x.active = false

还有另外一种 我不是很喜欢用 通过

@NamedQuery 来这个 跟以前的一样。就是在entity上面使用 @NamedQuery 定义语句。 然后 在借口里面也定义这个方法就可以了。

官方例子

[java] view plaincopy
  1. @Entity  
  2. @NamedQuery(name = "User.findByEmailAddress",  
  3.   query = "select u from User u where u.emailAddress = ?1")  
  4. public class User {  
  5.   
  6. }  
dao层

[java] view plaincopy
  1. public interface UserRepository extends JpaRepository<User, Long> {  
  2.   
  3.   List<User> findByLastname(String lastname);  
  4.   
  5.   User findByEmailAddress(String emailAddress);  
  6. }  

如果这些都不能满足你的需求(一般情况 肯定够用了)
想要不适用 springdata 的 就用原来的 jpa  就需要这样了。

像普通的 dao 层一样 定义一个 接口 FeedbackDao.java 实现类 FeedbackRepositoryImpl.java 

然后在定义一个 接口  UserRepository.java extends JpaRepository<Feedback, Long>,FeedbackDao

我们使用 UserRepository接口 就可以使用自定义的方法 和 自动实现的方法。很方便。

阅读更多
换一批

没有更多推荐了,返回首页