<?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
)
未完成:借口父类的抽取