<?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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd "> <!-- 取名:com.zhangsan com.xmcx --> <!--service的掃描--> <context:component-scan base-package="com.anyang.pss.service" /> <!--讀取jdbc.properties 這裏必需寫classpath:,否則web環境下就讀取不到這個文件 --> <context:property-placeholder location="classpath:jdbc.properties" /> <!--配置datasource--> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <!--maxActive: 最大鏈接數量 --> <property name="maxActive" value="20" /> <!--minIdle: 最小空閒鏈接 --> <property name="minIdle" value="2" /> <!--maxIdle: 最大空閒鏈接 --> <property name="maxIdle" value="5" /> <!--initialSize: 初始化鏈接 --> <property name="initialSize" value="5" /> <!-- 用來配置數據庫斷開後自動鏈接的 --> <!-- 鏈接被泄露時是否打印 --> <!--<property name="logAbandoned" value="true" />--> <!--removeAbandoned: 是否自動回收超時鏈接 --> <!-- <property name="removeAbandoned" value="true" />--> <!--removeAbandonedTimeout: 超時時間(以秒數爲單位) --> <!--<property name="removeAbandonedTimeout" value="10" />--> <!--maxWait: 超時等待時間以毫秒爲單位 1000等於60秒 --> <property name="maxWait" value="1000" /> <!-- 在空閒鏈接回收器線程運行期間休眠的時間值,以毫秒爲單位. --> <property name="timeBetweenEvictionRunsMillis" value="10000" /> <!-- 在每次空閒鏈接回收器線程(若是有)運行時檢查的鏈接數量 --> <property name="numTestsPerEvictionRun" value="5" /> <!-- 1000 * 60 * 30 鏈接在池中保持空閒而不被空閒鏈接回收器線程 --> <property name="minEvictableIdleTimeMillis" value="10000" /> <property name="validationQuery" value="SELECT NOW() FROM DUAL" /> </bean> <!--alt+ins配置: EntityManagerFactory--> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <!--鏈接數據庫的基本配置--> <property name="dataSource" ref="dataSource"/> <!-- packagesToScan:掃描相應的包(jpa的掃描) --> <property name="packagesToScan" value="com.anyang.pss.domain" /> <!-- jpaVendorAdapter:JPA的適配器[肯定這個jpa是哪一種框架來實現的] JPA:ORM規範 -> 有多種實現(hibernate,openjpa,...) --> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <!--方言--> <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" /> <!--是否顯示sql--> <property name="showSql" value="true" /> <!-- 建表策略 DDL:建庫建表建約束 true:至關於update false:至關於什麼都不作 --> <property name="generateDdl" value="false" /> </bean> </property> </bean> <!--配置相應的事務對象--> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <!-- 配置事務的支持(支持使用註解加事務) 它默認會去找一個transactionManager的bean --> <tx:annotation-driven transaction-manager="transactionManager" /> <!-- 配置SpringDataJpa -> 讓我們的某一層的代碼支持SpringDataJpa 只要發現我們的接口繼承了JpaRepository,它就會自動去完成相應的CRUD --> <jpa:repositories base-package="com.anyang.pss.repository" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager" /> </beans>
2. 配置項目導包前端
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <org.springframework.version>4.2.5.RELEASE</org.springframework.version> <org.hibernate.version>4.3.8.Final</org.hibernate.version> <spring-data-jpa.version>1.9.0.RELEASE</spring-data-jpa.version> <com.fasterxml.jackson.version>2.5.0</com.fasterxml.jackson.version> <org.slf4j.version>1.6.1</org.slf4j.version> </properties> <dependencies> <!-- Spring的支持包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework.version}</version> </dependency> <!--spring 對於模板技術,郵件,定時任務的支持--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${org.springframework.version}</version> <scope>test</scope> </dependency> <!-- 引入web前端的支持 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${org.springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${org.springframework.version}</version> </dependency> <!-- SpringMCV上傳須要用到io包--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> <!-- 文件上傳用到的包 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2.2</version> </dependency> <!-- SpringMVC的json支持包 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${com.fasterxml.jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${com.fasterxml.jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${com.fasterxml.jackson.version}</version> </dependency> <!-- hibernate的支持包 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${org.hibernate.version}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${org.hibernate.version}</version> </dependency> <!-- SpringData的支持包 --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-jpa</artifactId> <version>${spring-data-jpa.version}</version> </dependency> <!-- SpringData的擴展包 --> <dependency> <groupId>com.github.wenhao</groupId> <artifactId>jpa-spec</artifactId> <version>3.1.1</version> <!-- 把全部的依賴都去掉 --> <exclusions> <exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.5</version> </dependency> <!-- 測試包 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <!-- 這個scope 只能做用在編譯和測試時,同時沒有傳遞性。表示在運行的時候不添加此jar文件 --> <scope>provided</scope> </dependency> <!-- 日誌文件 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${org.slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${org.slf4j.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency> <!-- 代碼生成器模版技術 --> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.6</version> </dependency> <!-- shiro的支持包 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-all</artifactId> <version>1.4.0</version> <type>pom</type> </dependency> <!-- shiro與Spring的集成包 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency> <!-- poi支持的jar包 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.11</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.11</version> </dependency> <!-- 圖片壓縮功能 --> <!-- 縮略圖 --> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.6</version> </dependency> <!-- 定時調度 --> <dependency> <groupId>quartz</groupId> <artifactId>quartz</artifactId> <version>1.5.2</version> </dependency> <!-- 郵件支持 --> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.1</version> </dependency> </dependencies> <build> <finalName>asfactory</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>8.1.15.v20140411</version> <configuration> <stopPort>9966</stopPort> <stopKey>foo</stopKey> <webAppConfig> <contextPath>/</contextPath> </webAppConfig> </configuration> </plugin> </plugins> </build>
SpringData -> SpringDataJpa:操做數據庫變得更好簡單
<h2>1.pom.xml配置</h2>
- 1.基本的SSJ的導入
- 2.SpringDataJpa
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${spring-data-jpa.version}</version>
</dependency>java
2.SpringDataJpa基本配置
1.配置對應的Spring-data-jpa
<jpa:repositories base-package="cn.itsource.aisell.repository"
entity-manager-factory-ref="entityManagerFactory"
transaction-manager-ref="transactionManager"
></jpa:repositories>mysql
2.繼承JpaRepository
`interface EmployeeRepository extends JpaRepository<配置類,主鍵類型>, JpaSpecificationExecutor<Employee>
` 只要繼承JpaRepository,框架就會經過poxy完成基礎的CRUD實現git
繼承JpaSpecificationExecutor使得框架實現的類具有com.github.wenhao.jpa的包裝工能,可以更加簡單的書寫高級條件查詢github
3.完成相應的CRUD
employeeRepository.findAll();
employeeRepository.findOne(Long id);
employeeRepository.save(對象); //添加或者修改
employeeRepository.delete(id/對象);
employeeRepository.findAll(Pageable) -> 分頁
Pageable pageable = new PageRequest(0, 5); //0就是第一頁
employeeRepository.findAll(Sort) -> 排序
Sort sort = new Sort(Sort.Direction.DESC,"username");
若是要把分頁和排序結合起來: new PageRequest(0, 5,sort);web
3.高級查詢
1.名稱規則
findByUsername(String username) -> 根據名稱查詢 username = ?
findByUsernameLike(String username) -> username like ?
findByUsernameLikeAndEmailLike(String username) -> username like ? and email like ?
詳細規則請看文件(idea也有提示)
2.Query註解
@Query("jpql的語句")
@Query("select o from Employee o where o.name like ?1")
//@Query("select o from Employee o where o.name like :name")
@Query(nativeQuery = true,value="select * from employee")spring
二.高級查詢與分頁
1.JpaSpecificationExecutor
能夠不寫SQL也可以完成功能
1.咱們的Repository繼承JpaSpecificationExecutor
EmployeeRepository extends JpaRepository<Employee,Long>, JpaSpecificationExecutor<Employee>{....}
2.findAll的查詢方法
employeeRepository.findAll(Specification<T> spec)
employeeRepository.findAll(Specification<T> spec,Pageable pageable)
new Specification<Employee>{
//root:(根,表)獲取字段
//query:where,group by ,order by...
//cb: 條件判斷(一個或者多個)
@Override
public Predicate toPredicate(Root<Employee> root,
CriteriaQuery<?> query,
CriteriaBuilder cb) {
Path path = root.get("username");//拿到要作查詢的字段
Predicate p = cb.like(path, "%1%");//like表明作模糊查詢,後面就是它的條件值
return p;
}
}sql
2.jpa-spec[這個包的使用須要藉口繼承JpaSpecificationExecutor<?>]
<dependency>
<groupId>com.github.wenhao</groupId>
<artifactId>jpa-spec</artifactId>
<version>3.1.0</version>
</dependency>
//第一個參數: true -> 條件過濾啓用
//第二個參數: 須要過濾的屬性
//第三個參數: 過濾條件的 ?對應的值
Specification<Person> specification = Specifications.<Person>and()
.eq(StringUtils.isNotBlank(request.getName()), "name", name)
.gt(Objects.nonNull(request.getAge()), "age", 18)
.build();
3.Query的抽取
Query做用:接收前臺傳過來的查詢條件(分頁,數據)
BaseQuery:公共的查詢【規範,公共的代碼】
int currentPage=1;
getJpaPage{return currentPage-1}
int pageSize=10;
String orderName;
Boolean orderType=true;
提供getter,setter方法
//規定子類必需提供一個拿到條件的方法
protected abstract Specification createSpec();
//提供獲取排序的方法
Sort createSort(){
//1.若是orderName沒有值,就返回null【不排序】
//2.若是orderType是DESC,就升級(反之就降序)
}
EmployeeQuery:Employee單獨的查詢
username,email,age,...
Specification createSpec(){...}
---以上實現的功能有,基礎數據庫的增刪該查,高級查詢(通常的高級查詢,jpa-spec的高級查詢),表格父類抽取(表格的父類須要打上註解數據庫
@MappedSuperclass //抑制表格生成apache
)
未完成:藉口父類的抽取