Spring-data-Jpa项目搭建

Posted 薛定谔的猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring-data-Jpa项目搭建相关的知识,希望对你有一定的参考价值。

传送门:Spring Data 学习   Spring Data 开发环境搭建   Spring-data-jpa详解

简介

Spring Data是什么

    Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷

Spring Data JPA能干什么

  可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。

Spring Data JPA 有什么
 
  主要来看看Spring Data JPA提供的接口,也是Spring Data JPA的核心概念:
    1:Repository:最顶层的接口,是一个空的接口,目的是为了统一所有Repository的类型,且能让组件扫描的时候自动识别。
    2:CrudRepository :是Repository的子接口,提供CRUD的功能
    3:PagingAndSortingRepository:是CrudRepository的子接口,添加分页和排序的功能
    4:JpaRepository:是PagingAndSortingRepository的子接口,增加了一些实用的功能,比如:批量操作等。
    5:JpaSpecificationExecutor:用来做负责查询的接口
    6:Specification:是Spring Data JPA提供的一个查询规范,要做复杂的查询,只需围绕这个规范来设置查询条件即可

特征

  • 强大的存储库和自定义对象映射抽象
  • 从存储库方法名称中进行动态查询导出
  • 实现域基类提供基本属性
  • 支持透明审核(创建,最后更改)
  • 集成自定义存储库代码的可能性
  • Easy Spring通过JavaConfig和自定义XML命名空间进行集成
  • 与Spring MVC控制器进行高级集成
  • 跨店存储的实验支持

 

搭建过程

1.配置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: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-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd"
       default-lazy-init="true">

    <description>Spring公共配置</description>

    <!--数据库连接-->
    <context:property-placeholder location="classpath:/config/jdbc.properties"/>

    <!--扫描service包-->
    <context:component-scan base-package="com.wang.service"/>

    <!-- Jpa Entity Manager 配置 -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
        <property name="packagesToScan" value="com.wang.entity"/>
        <property name="jpaProperties">
            <props>
                <!-- 命名规则 My_NAME->MyName -->
                <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.mysql5InnoDBDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>

        <property name="jpaDialect">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
        </property>
    </bean>
    <bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

    <!-- Spring Data Jpa配置 -->
    <jpa:repositories base-package="com.wang.reposity" transaction-manager-ref="transactionManager"
                      entity-manager-factory-ref="entityManagerFactory"/>

    <!-- Jpa 事务配置 -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

    <!-- 使用annotation定义事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 数据源配置, 使用Tomcat JDBC连接池 -->
    <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
        <!-- Connection Info -->
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        <!-- Connection Pooling Info -->
        <property name="maxActive" value="${jdbc.pool.maxActive}"/>
        <property name="maxIdle" value="${jdbc.pool.maxIdle}"/>
        <property name="minIdle" value="0"/>
        <property name="defaultAutoCommit" value="true"/>
    </bean>


</beans>

 

2.创建一个实体类

package com.wang.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

@Entity
@Table(name="jpa_persons")
public class Person {
    private Integer id;
    private String lastName;
    private String email;
    private Date birth;

    public Person(){}

    @GeneratedValue  // 按照数据库默认的方式进行自增
    @Id
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public Date getBirth() {
        return birth;
    }
    public void setBirth(Date birth) {
        this.birth = birth;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", lastName=\'" + lastName + \'\\\'\' +
                ", email=\'" + email + \'\\\'\' +
                ", birth=" + birth +
                \'}\';
    }
}

  

3.编写Reposity接口类

package com.wang.reposity;

import com.wang.entity.Person;
import org.springframework.data.repository.Repository;

/**
 * 操作person类的接口
 * 需要继承自Repository
 * 参1: 代表当前操作的实体类
 * 参2: 代表实体类的主键类型
 * @author dell
 *
 *Repository是springdata的核心接口,这个接口的实现规定了spring data操作数据库的规范--命名规范
 *查询是以get或者是find或者是read开头
 */
public interface PersonRepository extends Repository<Person, Integer> {
    Person getByLastName(String lastName);
}

  

4.测试

package com.wang.reposity;

import com.wang.entity.Person;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestSpringData {

    private ApplicationContext context;
    private PersonRepository personRepository;

    @org.junit.Before  //该注解含义在执行@Test注解之前先执行这个代码
    public void Before(){
        context=new ClassPathXmlApplicationContext("/spring/spring-context.xml");
        personRepository=context.getBean(PersonRepository.class);
        System.out.println("测试前");
    }

    @Test
    public void testHellord(){
        Person person = personRepository.getByLastName("wang");
        System.out.println(person);

    }

}

  

以上是关于Spring-data-Jpa项目搭建的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Data-JPA尝鲜:快速搭建CRUD+分页后台实例

JPA---Spring-data-JPA---Hibernate

JPA---Spring-data-JPA---Hibernate

Spring-data-jpa 的@modifying注解

Spring-data-jpa 投影生成查询不正确

Spring Boot with Spring-Data-JPA学习案例