01---SpringDataJpa

什么是SpringDataJpa

SpringData是Spring的子框架,而SpringDataJpa是SpringData的子框架,
总之SpringDataJpa也是Spring的一个子框架。

导包
<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>
    <!--jpa事务管理器的包-->
    <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>
    <!-- SpringMVC上传需要用到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>
    <!--hibernate对于jpa的支持包-->
    <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>
    <!-- 对Java原生的lang包进行了扩展 -->
    <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>aisell</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>
集成SpringDataJpa
首先集成Spring和jpa
  • 准备jdbc.properties资源文件
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///pss
jdbc.username=root
jdbc.password=123456
  • 准备applicationContext.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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
">

    <!--扫描Dao层-->
    <!--<context:component-scan base-package="cn.itsource.aisell.repository"/>-->
    <!--扫描Service层-->
    <context:component-scan base-package="cn.itsource.aisell.service"/>

    <!--引入jdbc配置文件 必须加上classpath-->
    <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}"/>
    </bean>

    <!--配置EntityManagerFactory (四大金刚,方言,建表策略,显示sql)-->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <!--数据源 引入四大金刚 -->
        <property name="dataSource" ref="dataSource"/>
        <!--packagesToScan扫描指定的包  jpa包扫描-->
        <property name="packagesToScan" value="cn.itsource.aisell.domain"/>
        <!--配置jpa适配器 jpa只是一个ORM规范,hibernate等要实现它-->
        <property name="jpaVendorAdapter">
            <!--让Spring知道我们使用hibernate适配实现-->
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <!--配置方言-->
                <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
                <!--建表策略 true就是update false就是不开启-->
                <property name="generateDdl" value="false"/>
                <!--显示sql-->
                <property name="showSql" value="true"/>
            </bean>
        </property>
    </bean>

    <!--创建一个jpa事务对象-->
        <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
            <property name="entityManagerFactory" ref="entityManagerFactory"/>
        </bean>

    <!--开启支持事务注解-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
集成SpringDataJpa
  • 准备domain层
@Entity
@Table(name = "employee")
public class Employee extends BaseDomain {
    private String username;
    private String password;
    private String email;
    private Integer age;
}
  • 将主键自增策略,id等提取成为父类
  • 在jpa中,domain的父类必须加注解@MappedSuperclass
@MappedSuperclass//在jpa中domain的父类必须加注解@MappedSuperclass
public class BaseDomain {

    @Id
    @GeneratedValue
    protected Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}
  • Repository层(dao层)
/*
*  JpaRepository<Employee,Long> 继承了这个接口,CRUD的功能就帮我们实现了
*       参数一对象domain对象
*       参数二代表主键类型
* */
public interface EmployeeRepository extends JpaRepository<Employee,Long>{
}
  • 配置扫描Repository
    需要加入头部信息
    xmlns:jpa=“http://www.springframework.org/schema/data/jpa”
    http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
 <!--扫描Dao层 只要发现类继承了Repository,就会完成相应的功能,创建实现类-->
    <jpa:repositories base-package="cn.itsource.aisell.repository"
                      entity-manager-factory-ref="entityManagerFactory"
                      transaction-manager-ref="transactionManager"/>
CRUD
  • 测试类 注入对象
  • 添加
    在这里插入图片描述
  • 删除
    在这里插入图片描述
  • 修改
    在这里插入图片描述
  • 查询
    在这里插入图片描述
分页查询和排序
  • 分页查询
    在这里插入图片描述
  • 排序
    在这里插入图片描述
  • 分页查询+排序
    在这里插入图片描述
名称规则查询

接口
在这里插入图片描述测试
在这里插入图片描述

@Query注解查询

接口
在这里插入图片描述
测试
在这里插入图片描述

JpaSpecificationExecutor
  • JpaSpecificationExecutor是一个jpa的规范执行者
  • 不能单独使用,需要配合着 jpa 中的其他接口一起使用
  • 完成多条件查询,并且支持分页与排序。
  • 写个类继承这个接口
    要传入类型,它才会查询返回对应类型
public interface EmployeeRepository extends JpaRepository<Employee,Long>,JpaSpecificationExecutor<Employee>{}
  • 简单查询
    在这里插入图片描述

  • 分页+排序+模糊查询
    在这里插入图片描述

jpa-spec插件
  • 对JpaSpecificationExecutor的封装,让JpaSpecificationExecutor变得更加简单
  • 参考文档
    https://github.com/wenhao/jpa-spec/blob/master/docs/3.1.0_cn.md
  • 导包
 <!-- 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>
  • 简单查询事例
    在这里插入图片描述
  • 分页+排序+模糊查询
    在这里插入图片描述
抽取查询对象Query
  • 创建父类BaseQuery
    父类中用来写一些公共的查询条件;
    优点
    公共的代码,可以让我们少写代码;
    可以让代码更加规范;
    可以提高扩展性。
/*
* 用来写一些公共的查询条件
* 抽取父类
* 1.公共的代码
* 2.规范代码
* 2.扩展性强
* **/
public abstract class BaseQuery {
    //当前页
    private int currentPage = 1;
    //每页条数
    private int pageSize = 5;
    //排序字段
    private String orderName;
    //排序方式 true=DESC false=ASC
    private boolean orderType = false;

    //排序方法
    public Sort createSort(){
        //如果用户输入排序字段 就进行排序
        if (StringUtils.isNotBlank(orderName)){
            //如果传入的类型为true就为升序,否则就为降序
            Sort sort = new Sort(orderType?Sort.Direction.DESC:Sort.Direction.ASC,orderName);
            return sort;
        }
        //没有输入字段就返回null
        return null;
    }

    //让所有子类都实现这个方法
    abstract Specification createSpec();

    //让页数从0开始
    public int getJpaPage() {
        return currentPage-1;
    }
  • EmployeeQuery
    设置当前对应的Domain的特有查询字段;
    实现 createSpec()。
    //用来接收员工的查询条件
public class EmployeeQuery extends BaseQuery {
    private String username;
    private String email;
    private Integer age;


    //创建查询对象
    @Override
    public Specification createSpec(){
        Specification<Employee> spec = Specifications.<Employee>and()
                .like(StringUtils.isNotBlank(username),"username", "%"+username+"%")
                .like(StringUtils.isNotBlank(email),"email", "%"+email+"%")
                .gt(age!=null,"age",age)
                .build();
        return spec;
    }
  • 测试
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值