• 用Spring Data JPA 基于内存存储pojo的简单案例


    poject结构如下:


    Customer.java类是一个pojo类,代码如下:

    package hello;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    
    @Entity
    public class Customer {
    
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private long id;
        private String firstName;
        private String lastName;
    
        private Customer() {}
    
        public Customer(String firstName, String lastName) {
            this.firstName = firstName;
            this.lastName = lastName;
        }
    
        @Override
        public String toString() {
            return String.format(
                    "Customer[id=%d, firstName='%s', lastName='%s']",
                    id, firstName, lastName);
        }
    
    }
    

    @Entity:说明该类是一个jpa entity,如果缺少@Table注解则默认匹配表Customer

    @Id:jpa通过它定义识别对象Id,使用注解@GeneratedValue让id自动增长

    toString:重写了对象打印出来的方法

    CustomerRepository.java是jpa用来存储Customer对象的仓库。

    package hello;
    
    import java.util.List;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    
    public interface CustomerRepository extends JpaRepository<Customer, Long> {
    
        List<Customer> findByLastName(String lastName);
    
    }
    


    CustomerRepository继承了JpaRepository,除了能使用基本的增删改查外,还可以自己定义查找方法,如:findByLastName,关键在于findBy后面的属性要与Customer中的属性对应,在eclipse中编写的时候如果没有对应的属性eclipse也会提示你属性找不到。

    这里只定义了一个接口,并没有具体实现,包括findByLastName方法,为什么?这就是Spring Data Jpa的魅力之处,因为它致力于在运行程序的时候从Repository接口处自动为它创建相应实现类。通过@EnableJpaRepositories注解实现。

    Application.java应用主类,Spring Data JPA测试类

    package hello;
    
    import static org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType.H2;
    
    import java.util.List;
    
    import javax.persistence.EntityManagerFactory;
    import javax.sql.DataSource;
    
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.support.AbstractApplicationContext;
    import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
    import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
    import org.springframework.orm.jpa.JpaTransactionManager;
    import org.springframework.orm.jpa.JpaVendorAdapter;
    import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
    import org.springframework.orm.jpa.vendor.Database;
    import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
    import org.springframework.transaction.PlatformTransactionManager;
    
    @Configuration
    @EnableJpaRepositories
    public class Application {
        
        @Bean
        public DataSource dataSource() {
            return new EmbeddedDatabaseBuilder().setType(H2).build();
        }
    
        @Bean
        public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) {
            LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
            lef.setDataSource(dataSource);
            lef.setJpaVendorAdapter(jpaVendorAdapter);
            lef.setPackagesToScan("hello");
            return lef;
        }
    
        @Bean
        public JpaVendorAdapter jpaVendorAdapter() {
            HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
            hibernateJpaVendorAdapter.setShowSql(false);
            hibernateJpaVendorAdapter.setGenerateDdl(true);
            hibernateJpaVendorAdapter.setDatabase(Database.H2);
            return hibernateJpaVendorAdapter;
        }
    
        @Bean
        public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
            return new JpaTransactionManager(entityManagerFactory);
        }
    
    
        public static void main(String[] args) {
            AbstractApplicationContext context = new AnnotationConfigApplicationContext(Application.class);
            CustomerRepository repository = context.getBean(CustomerRepository.class);
    
            // save a couple of customers
            repository.save(new Customer("Jack", "Bauer"));
            repository.save(new Customer("Chloe", "O'Brian"));
            repository.save(new Customer("Kim", "Bauer"));
            repository.save(new Customer("David", "Palmer"));
            repository.save(new Customer("Michelle", "Dessler"));
    
            // fetch all customers
            List<Customer> customers = repository.findAll();
            System.out.println("Customers found with findAll():");
            System.out.println("-------------------------------");
            for (Customer customer : customers) {
                System.out.println(customer);
            }
            System.out.println();
    
            // fetch an individual customer by ID
            Customer customer = repository.findOne(1L);
            System.out.println("Customer found with findOne(1L):");
            System.out.println("--------------------------------");
            System.out.println(customer);
            System.out.println();
    
            // fetch customers by last name
            List<Customer> bauers = repository.findByLastName("Bauer");
            System.out.println("Customer found with findByLastName('Bauer'):");
            System.out.println("--------------------------------------------");
            for (Customer bauer : bauers) {
                System.out.println(bauer);
            }
    
            context.close();
        }
    
    }
    


    @EnableJpaRepositories:告诉JPA找到继承了repository的接口,并为它创建相应的实现类,JpaRepository也继承了repository。

    DataSource:声明一个存储对象的数据库

    LocalContainerEntityManagerFactoryBean:对象的操作类,通过lef.setPackagesToScan("hello");避免了创建persistence.xml,它告诉JPA到hello包下面找bean类

    JpaVendorAdapter:为LocalContainerEntityManagerFactoryBean定义了基于hibernate的JPA适配器

    PlatformTransactionManager:用于处理事务持久化

    最后运行程序,结果如下:

    Customers found with findAll():
    -------------------------------
    Customer[id=1, firstName='Jack', lastName='Bauer']
    Customer[id=2, firstName='Chloe', lastName='O'Brian']
    Customer[id=3, firstName='Kim', lastName='Bauer']
    Customer[id=4, firstName='David', lastName='Palmer']
    Customer[id=5, firstName='Michelle', lastName='Dessler']
    
    Customer found with findOne(1L):
    --------------------------------
    Customer[id=1, firstName='Jack', lastName='Bauer']
    
    Customer found with findByLastName('Bauer'):
    --------------------------------------------
    Customer[id=1, firstName='Jack', lastName='Bauer']
    Customer[id=3, firstName='Kim', lastName='Bauer']

    该项目需要用到的jar包,通过maven的pom.xml获得

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.springframework</groupId>
        <artifactId>gs-accessing-data-jpa</artifactId>
        <version>0.1.0</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>0.5.0.M4</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-orm</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
            </dependency>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
            </dependency>
        </dependencies>
    
        <properties>
            <!-- use UTF-8 for everything -->
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <start-class>hello.Application</start-class>
        </properties>
    
        <build>
            <plugins>
                <plugin> 
                    <artifactId>maven-compiler-plugin</artifactId> 
                    <version>2.3.2</version> 
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
        <repositories>
            <repository>
                <id>spring-snapshots</id>
                <name>Spring Snapshots</name>
                <url>http://repo.spring.io/libs-snapshot</url>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
            <repository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>http://repo.spring.io/libs-milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
            <repository>
                <id>org.jboss.repository.releases</id>
                <name>JBoss Maven Release Repository</name>
                <url>https://repository.jboss.org/nexus/content/repositories/releases</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    
        <pluginRepositories>
            <pluginRepository>
                <id>spring-snapshots</id>
                <name>Spring Snapshots</name>
                <url>http://repo.spring.io/libs-snapshot</url>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </pluginRepository>
            <pluginRepository>
                <id>spring-milestones</id>
                <name>Spring Milestones</name>
                <url>http://repo.spring.io/libs-milestone</url>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </pluginRepository>
        </pluginRepositories>
    
    </project>
    


    这是从spring官网学习的,有不对的地方欢迎指导




  • 相关阅读:
    算法70----只有两个键的键盘【动态规划】
    Shell
    Shell
    Shell
    Shell
    Shell
    Tools
    Jenkins
    Java
    Product
  • 原文地址:https://www.cnblogs.com/james1207/p/3366054.html
Copyright © 2020-2023  润新知