spring+springdatajpa+freemarker
2013-03-08 11:14
507 查看
最近需要使用springMVC 使用 spring data jpa作为dao层。 以前没有接触过。赶紧学学。记录一下。
spring data 帮我们封装了很多dao层实现。 让我们只需要定义接口就可以直接使用很多基本的查询。
自己从0开始建项目 熟悉一下框架的搭建。 使用的 eclipse for javaee 。使用 maven管理。
首先 建立一个maven项目。
添加 web.xml 作为 web应用的 核心配置。这个可不能少。
建立 spring-servlet-config.xml
spring-mvc.xml
spring-orm.xml
freemarker.properties
hibernate.properties
还需要在 resources/META-INF/ 下面 配置 persistence.xml
需要在 pom.xml 里面 添加依赖包
还需要注意一点 之前 我们配置freemarker的根目录
ok 运行一下 项目启动了。 环境就搭好了。
下面开始添加java代码 注意 刚刚配置了 注解注入的 包路径是
所以 我们的java代码的包路径必须是这个。
在该包下 建立 mvc看框架. controller 包. dao包 entity 包 service包
controller
FeedbackService.java
entity 建立了2个 简单的 单表映射 就不写了。
主要是dao层。 spring data 是只需要写接口就可以了。
一个简单的例子
一些参数可以这样
通过注解的 query 来写 hql语句 就可以了。
还可以通过查询的方法名来实现一些查询。比如
findByUser(User user)
定义这个方法 就可以了 不用实现。spring data会自动帮你实现。 只要你满足特定的格式。 下面是 一些关键字
还有另外一种 我不是很喜欢用 通过
@NamedQuery 来这个 跟以前的一样。就是在entity上面使用 @NamedQuery 定义语句。 然后 在借口里面也定义这个方法就可以了。
官方例子
如果这些都不能满足你的需求(一般情况 肯定够用了)
想要不适用 springdata 的 就用原来的 jpa 就需要这样了。
像普通的 dao 层一样 定义一个 接口 FeedbackDao.java 实现类 FeedbackRepositoryImpl.java
然后在定义一个 接口 UserRepository.java extends JpaRepository<Feedback, Long>,FeedbackDao
我们使用 UserRepository接口 就可以使用自定义的方法 和 自动实现的方法。很方便。
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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://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.xsd http://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.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.2.xsd http://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
#jdbc jdbc.url=jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:xxxx jdbc.user=xxx jdbc.password=xxx
freemarker.properties
tag_syntax=auto_detect template_update_delay=2 default_encoding=UTF-8 output_encoding=UTF-8 locale=zh_CN date_format=yyyy-MM-dd time_format=HH:mm:ss datetime_format=yyyy-MM-dd HH:mm:ss
hibernate.properties
hibernate.show_sql=true hibernate.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") //控制器map public class TestController { //@Autowired //private FeedbackService feedbackService; //注入 服务 @RequestMapping(value="/list") //请求map public 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 @Transactional public class FeedbackService { @Autowired private FeedbackRepository feedbackRepository; @Autowired private 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会自动帮你实现。 只要你满足特定的格式。 下面是 一些关键字
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 定义语句。 然后 在借口里面也定义这个方法就可以了。
官方例子
@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接口 就可以使用自定义的方法 和 自动实现的方法。很方便。
相关文章推荐
- Spring+SpringMVC+Springdatajpa+Freemarker
- spring+springdatajpa+freemarker
- springboot学习三(springboot结合spring data jpa和freemarker显示)
- Spring Data JPA
- Spring ORM+Hibernate?Out!换 Spring Data JPA
- 扩展spring data jpa的数据更新方法时注意事项
- Spring orm +Spring data jpa 入门
- Spring Data JPA基础知识
- spring jpa data 查询多对一映射
- 了解 Spring Data JPA
- spring-data-jpa 新增 修改 删除 查询 分页
- spring data jpa 查询时的统计
- jpa学习4--spring data jpa 中的JpaRepository 方法定义规范
- Spring Data JPA
- Spring Data Jpa 实现分页(Spring MVC+easyui)
- 初识Spring Data与JPA Repository
- Spring data JPA先排序再分页。
- Spring-Data-Jpa配合MySQL实现简单的增、删、查、改
- 纯干货,Spring-data-jpa详解,全方位介绍。
- SpringDataJpa的Specification查询