spring+springdatajpa+freemarker

来源:互联网 发布:网络银商 知乎 编辑:程序博客网 时间:2024/05/18 00:27

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

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

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

首先 建立一个maven项目。

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

<?xml version="1.0" encoding="UTF-8"?><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">  <display-name>test2</display-name>  <!-- 编码过滤。 使用 utf-8编码 -->  <filter>  <filter-name>encodingFilter</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>encodingFilter</filter-name>  <url-pattern>/*</url-pattern></filter-mapping><!-- spring的核心控制器配置。 --><servlet><servlet-name>spring-servlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 配置文件的位置。默认 好像是 ApplicationContext.xml? 不太确定 太久不用默认的了 反正我都是自己配置一个新的 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-servlet-config.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>spring-servlet</servlet-name><url-pattern>/*</url-pattern></servlet-mapping></web-app>


建立 spring-servlet-config.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"><!--配置文件 --><context:property-placeholder location="classpath:config.properties"/><context:annotation-config /><mvc:annotation-driven /><!-- 扫描这个包下面的注解,自动注入bean --><context:component-scan base-package="com.aurora.test2" />        <!-- 将配置文件分开 便于管理 --><import resource="spring-mvc.xml"/>   <import resource="spring-orm.xml"/></beans>


spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="viewResolver"          class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">          <property name="cache" value="true" />          <property name="prefix" value="" />        <property name="suffix" value=".ftl" />          <property name="contentType" value="text/html;charset=UTF-8"></property>          <property name="requestContextAttribute" value="request" />          <property name="exposeSpringMacroHelpers" value="true" />          <property name="exposeRequestAttributes" value="true" />          <property name="exposeSessionAttributes" value="true" />      </bean>       <bean id="multipartResolver"            class="org.springframework.web.multipart.commons.CommonsMultipartResolver">        <property name="maxUploadSize" value="1000000"/>     </bean>           <bean id="freemarkerConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean">    <property name="location" value="classpath:freemarker.properties"/></bean>        <bean id="freemarkerConfig"class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"><property name="templateLoaderPath" value="/WEB-INF/view/" /><property name="freemarkerSettings" ref="freemarkerConfiguration"/></bean><mvc:default-servlet-handler/><mvc:resources location="/images/**" mapping="/images/"/><mvc:resources location="/uploads/**" mapping="/uploads/"/></beans>

spring-orm.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:jpa="http://www.springframework.org/schema/data/jpa"    xmlns:p="http://www.springframework.org/schema/p"    xmlns:tx="http://www.springframework.org/schema/tx"    xmlns="http://www.springframework.org/schema/beans"    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd" >    <bean        id="dataSource"        class="com.alibaba.druid.pool.DruidDataSource"        destroy-method="close"        init-method="init" >        <property            name="url"            value="${jdbc.url}" />        <property            name="username"            value="${jdbc.user}" />        <property            name="password"            value="${jdbc.password}" />        <property            name="filters"            value="stat" />        <property            name="maxActive"            value="20" />        <property            name="initialSize"            value="1" />        <property            name="maxWait"            value="60000" />        <property            name="minIdle"            value="1" />        <property            name="timeBetweenEvictionRunsMillis"            value="3000" />        <property            name="minEvictableIdleTimeMillis"            value="300000" />        <property            name="validationQuery"            value="SELECT 'x'" />        <property            name="testWhileIdle"            value="true" />        <property            name="testOnBorrow"            value="false" />        <property            name="testOnReturn"            value="false" />        <property            name="poolPreparedStatements"            value="true" />        <property            name="maxPoolPreparedStatementPerConnectionSize"            value="20" />    </bean>    <!-- entity manager config -->    <bean        id="emf"        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"        p:dataSource-ref="dataSource" />    <!-- transaction manager config -->    <bean        id="txManager"        class="org.springframework.orm.jpa.JpaTransactionManager"        p:entityManagerFactory-ref="emf" />    <tx:annotation-driven transaction-manager="txManager" />    <jpa:repositories        base-package="com.aurora.test2.dao"        entity-manager-factory-ref="emf"        transaction-manager-ref="txManager" /></beans>
config.properties

#jdbcjdbc.url=jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:xxxxjdbc.user=xxxjdbc.password=xxx

freemarker.properties

tag_syntax=auto_detecttemplate_update_delay=2default_encoding=UTF-8output_encoding=UTF-8locale=zh_CNdate_format=yyyy-MM-ddtime_format=HH:mm:ssdatetime_format=yyyy-MM-dd HH:mm:ss

hibernate.properties

hibernate.show_sql=truehibernate.format_sql=true

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

<?xml version="1.0" encoding="UTF-8"?><persistence version="2.0"xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="        http://java.sun.com/xml/ns/persistence        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"><persistence-unit name="xiaoyu" transaction-type="RESOURCE_LOCAL"><provider>org.hibernate.ejb.HibernatePersistence</provider></persistence-unit></persistence>

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

<dependencies>    <dependency>  <groupId>ch.qos.logback</groupId>  <artifactId>logback-classic</artifactId>  <version>1.0.9</version>  </dependency>  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-webmvc</artifactId>  <version>3.2.1.RELEASE</version>  </dependency>  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-orm</artifactId>  <version>3.2.1.RELEASE</version>  </dependency>  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-tx</artifactId>  <version>3.2.1.RELEASE</version>  </dependency>  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-context-support</artifactId>  <version>3.2.1.RELEASE</version>  </dependency>  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-jms</artifactId>  <version>3.2.1.RELEASE</version>  </dependency>  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-jdbc</artifactId>  <version>3.2.1.RELEASE</version>  </dependency>  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-web</artifactId>  <version>3.2.1.RELEASE</version>  </dependency>  <dependency>  <groupId>org.springframework.data</groupId>  <artifactId>spring-data-jpa</artifactId>  <version>1.3.0.RELEASE</version>  </dependency>  <dependency>  <groupId>org.hibernate</groupId>  <artifactId>hibernate-entitymanager</artifactId>  <version>4.1.9.Final</version>  </dependency>  <dependency>  <groupId>org.freemarker</groupId>  <artifactId>freemarker</artifactId>  <version>2.3.19</version>  </dependency>  <dependency>  <groupId>javax.inject</groupId>  <artifactId>javax.inject</artifactId>  <version>1</version>  </dependency>  <dependency>  <groupId>com.alibaba</groupId>  <artifactId>druid</artifactId>  <version>0.2.11</version>  </dependency>  <dependency>  <groupId>commons-fileupload</groupId>  <artifactId>commons-fileupload</artifactId>  <version>1.2.2</version>  </dependency>  <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.23</version></dependency>  </dependencies>

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

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

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


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

<context:component-scan base-package="com.aurora.test2" />

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

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

controller

package com.aurora.test.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;@Controller@RequestMapping(value="/test")  //控制器mappublic class TestController {//@Autowired//private FeedbackService feedbackService;  //注入 服务@RequestMapping(value="/list") //请求mappublic ModelAndView list() {ModelAndView mv = new ModelAndView();mv.setViewName("test_list");//mv.addObject("count", feedbackService.count());//mv.addObject("system",feedbackService.systemFeedback());//mv.addObject("named",feedbackService.testNamed());return mv;}@RequestMapping(value="/list/{id}")public ModelAndView userList(@PathVariable Long id) {ModelAndView mv = new ModelAndView();mv.setViewName("user_list");//mv.addObject("feedbacks", feedbackService.userFeedbacks(id));return mv;}}
service层

FeedbackService.java

package com.aurora.test.service;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import com.aurora.test.dao.FeedbackRepository;import com.aurora.test.dao.UserRepository;import com.aurora.test.entity.Feedback;import com.aurora.test.entity.User;@Service@Transactionalpublic class FeedbackService {@Autowiredprivate FeedbackRepository feedbackRepository;@Autowiredprivate UserRepository userRepository;public long count() {return feedbackRepository.count();}public Feedback systemFeedback() {return feedbackRepository.systemFeedback();}public List<Feedback> userFeedbacks(Long userId) {User user = userRepository.findOne(userId);return feedbackRepository.findByUser(user);}public Feedback testNamed() {return feedbackRepository.testNamed();}}

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

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

一个简单的例子

 

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

@Query("from Feedback f where f.user.id=?1")public List<Feedback> listCunstom(Long userId);


一些参数可以这样

public interface UserRepository extends JpaRepository<User, Long> {  @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")  User findByLastnameOrFirstname(@Param("lastname") String lastname,                                 @Param("firstname") String firstname);}


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

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

findByUser(User user)

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

KeywordSampleJPQL snippetAndfindByLastnameAndFirstname… where x.lastname = ?1 and x.firstname = ?2OrfindByLastnameOrFirstname… where x.lastname = ?1 or x.firstname = ?2BetweenfindByStartDateBetween… where x.startDate between 1? and ?2LessThanfindByAgeLessThan… where x.age < ?1GreaterThanfindByAgeGreaterThan… where x.age > ?1AfterfindByStartDateAfter… where x.startDate > ?1BeforefindByStartDateBefore… where x.startDate < ?1IsNullfindByAgeIsNull… where x.age is nullIsNotNull,NotNullfindByAge(Is)NotNull… where x.age not nullLikefindByFirstnameLike… where x.firstname like ?1NotLikefindByFirstnameNotLike… where x.firstname not like ?1StartingWithfindByFirstnameStartingWith… where x.firstname like ?1 (parameter bound with appended %)EndingWithfindByFirstnameEndingWith… where x.firstname like ?1 (parameter bound with prepended %)ContainingfindByFirstnameContaining… where x.firstname like ?1 (parameter bound wrapped in %)OrderByfindByAgeOrderByLastnameDesc… where x.age = ?1 order by x.lastname descNotfindByLastnameNot… where x.lastname <> ?1InfindByAgeIn(Collection<Age> ages)… where x.age in ?1NotInfindByAgeNotIn(Collection<Age> age)… where x.age not in ?1TruefindByActiveTrue()… where x.active = trueFalsefindByActiveFalse()… where x.active = false
还有另外一种 我不是很喜欢用 通过

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

官方例子

@Entity@NamedQuery(name = "User.findByEmailAddress",  query = "select u from User u where u.emailAddress = ?1")public class User {}
dao层

public interface UserRepository extends JpaRepository<User, Long> {  List<User> findByLastname(String lastname);  User findByEmailAddress(String emailAddress);}

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

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

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

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




















































原创粉丝点击