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>
<?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>
<?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会自动帮你实现。 只要你满足特定的格式。 下面是 一些关键字
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+springdatajpa+freemarker
- spring+springdatajpa+freemarker
- Spring+SpringMVC+Springdatajpa+Freemarker
- Spring Boot 下配置SpringDataJpa
- springdataJPA
- springDataJpa
- 手动创建 SpringMvc +SpringDataJpa+Hibernate+ freemarker mavenProject+ 环境切换
- Spring+Freemarker
- spring & freemarker
- Spring FreeMarker
- Spring+Freemarker(国际化)
- Spring+Freemarker (转)
- FreeMarker整合Spring 3
- FreeMarker整合Spring 3
- freemarker+struts2+spring
- FreeMarker整合Spring 3
- Spring框架集成FreeMarker
- spring+struts2+freemarker整合
- 开机不登陆系统自动启动Vmware虚拟机(系统服务)
- jboss介绍
- Android 开发之 ---- 底层驱动开发(一)
- windows mobile6.0模拟器上网设置
- 线段树入门
- spring+springdatajpa+freemarker
- 线段树
- python判断一个进程是否正在运行
- python编译环境比较
- 这年的第几天
- DataGridView中绑定List泛型的问题
- android添加新驱动
- struts2设置<s:select>默认选中项的方法
- jQuery 入门教程(6): 淡入淡出效果