SpringHomeSpring Boot

Spring Boot & Spring Data &a

2018-08-05  本文已影响163人  大批

:) 本篇会分别介绍 Spring Data ,JPA ,Spring Data JPA

JPA简介

jpa全称是 Java Persistence API,jpa定义了各种注解(用来定义实体,映射关系)。JPA仅仅是一个规范,它的实现比较出名的是Hibernate

JPA实体

import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name = "user")
public class User  implements Serializable {

    @Id
    // 主键自动增长
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    // 默认对应字段 number
    private String number;

   // 省略 getter & setter 
}

实体还需要一个默认的无参构造函数

使用spring boot简单测试jpa

      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
             xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="JPA" transaction-type="RESOURCE_LOCAL">
        <!-- 配置jpa ORM产品 -->
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <!-- 添加对应的持久化类 -->
        <class>com.suse.yudapi.entity.User</class>
        <properties>
            <!-- jpa中连接数据库 -->
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/demo" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="123456"></property>

            <!-- jpa中配置hibernate基本属性 -->
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="create"/>
        </properties>

    </persistence-unit>
</persistence>
public class JPAMain {

    public static void main(String[] args){
        EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
        EntityManager manager = factory.createEntityManager();
        manager.getTransaction().begin();
        User user = new User();
        user.setName("yudapi");
        user.setNumber("12312312");
        manager.persist(user);
        manager.getTransaction().commit();
    }

}

JPA的CRUD操作

public class JPAMain {

    public static void main(String[] args){

        EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPA");
        EntityManager manager = factory.createEntityManager();

        User user = new User();
        user.setName("yudapi");
        user.setNumber("12312312");
        // 新增
        manager.getTransaction().begin();
        manager.persist(user);
        manager.getTransaction().commit();
        // 查找
        User userInfo = manager.find(User.class, 1L);
        System.out.println(userInfo.getName()+"  "+userInfo.getNumber());
        // 更新
        userInfo.setName("update after");
        manager.getTransaction().begin();
        manager.persist(userInfo);
        manager.getTransaction().commit();
        System.out.println(userInfo.getName()+"  "+userInfo.getNumber());
        // 删除
        manager.getTransaction().begin();
        manager.remove(userInfo);
        manager.getTransaction().commit();
    }
}

JPA中的集合映射

@Entity
@Table(name = "books")
@Embeddable
public class Book implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String number;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }
}
@ElementCollection(targetClass = Book.class)
List<Book> books;

自动创建的表结构是两个实体分别创建一个表,使用了一个中间表来存储关联关系

JPA实体间的映射

// in user entity
@OneToOne
UserEx userEx; // 这个实体的id会在user表里面有一个外键字段
// in user entity
@ManyToOne(cascade = CascadeType.ALL)
Tag tag;

JPA级联操作

JPQL JPA的查询语言


Spring Data 介绍

Spring Data 提供了一个数据访问层的抽象,这个抽象定义了基本的访问数据的接口。这里的数据来源就不一定是数据库了,也可能是缓存,也可能是nosql数据库等,针对不同的底层数据存储方式都可以使用同一套代码进行访问

Spring Data 核心概念

@Indexed
public interface Repository<T, ID> {
}
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
    <S extends T> S save(S var1);

    <S extends T> Iterable<S> saveAll(Iterable<S> var1);

    Optional<T> findById(ID var1);

    boolean existsById(ID var1);

    Iterable<T> findAll();

    Iterable<T> findAllById(Iterable<ID> var1);

    long count();

    void deleteById(ID var1);

    void delete(T var1);

    void deleteAll(Iterable<? extends T> var1);

    void deleteAll();
}

spring data中的这些接口都不需要实现,具体的实现是由spring data通过动态代理针对不同的存储技术实现的,我们只需要按照约定将接口定义好就可以了

spring data demo

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) DEFAULT NULL,
  `number` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
@Entity
@Table(name = "user")
public class User  implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String number;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

public interface UserRepository extends CrudRepository<User,Long> { }
@SpringBootApplication
@RestController
@EnableJpaRepositories
public class App {
    public static void main(String[] args){
        SpringApplication.run(App.class,args);
    }
}
@SpringBootApplication
@RestController
@EnableJpaRepositories
public class App {

    @Autowired
    UserRepository userRepository;

    @RequestMapping("/insertUser")
    public User insertUser(){
        User user = new User();
        user.setName("dapi");
        user.setNumber("123456");
        user = userRepository.save(user);
        return user;
    }

    public static void main(String[] args){
        SpringApplication.run(App.class,args);
    }
}

@EnableJpaRepositories这个注解是激活 jpa 的方式来生成代理,有些时候我们的应用可能还用了其他的存储技术,比如mogodb这个时候就可以使用@EnableMogoRepositories,@EnableJpaRepositories可以添加一个basePackages属性可以指定只代理特定包下面的Repositor接口



↓ 详细介绍使用spring data的详细步骤

定义Repository接口

@RepositoryDefinition(domainClass = User.class,idClass = Long.class)
public interface UserRepository  {
    <S extends User> S save(S user);
}

定义查询方法

@RepositoryDefinition(domainClass = User.class,idClass = Long.class)
public interface UserRepository  {
    <S extends User> S save(S user);

    List<User> findByName(String name);
}
@RepositoryDefinition(domainClass = User.class,idClass = Long.class)
public interface UserRepository  {
    <S extends User> S save(S user);
     
    // 定义排序
    List<User> findByName(String name, Sort orders);
}

    @RequestMapping("/filterName")
    public List<User> filterName(){
        // 使用排序
        Sort orders = new Sort(Sort.Direction.DESC,"id");
        return userRepository.findByName("dapi",orders);
    }
@RepositoryDefinition(domainClass = User.class,idClass = Long.class)
public interface UserRepository  {
    <S extends User> S save(S user);

    List<User> findByName(String name, Pageable pageable);
}

Pageable pageable = PageRequest.of(0,1);
return userRepository.findByName("dapi",pageable);

这两个参数不能同时使用,如果想要同时支持分页和选择,仅仅是构造Pageable的时候不同。PageRequest pageable = PageRequest.of(0,1,Sort.Direction.DESC,"id");

创建Repository实例

class MyRepositoryImpl<T, ID extends Serializable>
        extends SimpleJpaRepository<T, ID> {
    private final EntityManager entityManager;

    MyRepositoryImpl(JpaEntityInformation entityInformation, EntityManager entityManager) {
        super(entityInformation, entityManager);
        this.entityManager = entityManager;
    }
    @Transactional
    public <S extends T> S save(S entity) {
    }
}

spring data web

// http://localhost:8080/filterName?page=0&size=1&sort=id,DESC
    @RequestMapping("/filterName")
    public List<User> filterName(Pageable pageable){
        // PageRequest pageable = PageRequest.of(0,1,Sort.Direction.DESC,"id");
        return userRepository.findByName("dapi",pageable);
    }

Spring Data JPA简介

依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

配置

@SpringBootApplication
@RestController
@EnableJpaRepositories
@EnableTransactionManagement
public class App {

    @Autowired
    UserRepository userRepository;

    @RequestMapping("/insertUser")
    public User insertUser(){
        User user = new User();
        user.setName("dapixxx");
        user.setNumber("123456");
        user = userRepository.save(user);
        return user;
    }


    public static void main(String[] args){
        SpringApplication.run(App.class,args);
    }
}

保存实体

查询方法

@Entity
@NamedQuery(name = "User.findByEmailAddress",
query = "select u from User u where u.emailAddress = ?1")
public class User {
}

public interface UserRepository extends JpaRepository<User, Long> {
      List<User> findByLastname(String lastname);
      User findByEmailAddress(String emailAddress);
}

public interface UserRepository extends JpaRepository<User, Long> {
        @Query("select u from User u where u.emailAddress = ?1")
        User findByEmailAddress(String emailAddress);
}
public interface UserRepository extends JpaRepository<User, Long> {
        @Query("select u from User u where u.firstname like %?1")
        List<User> findByFirstnameEndsWith(String firstname);
}
public interface UserRepository extends JpaRepository<User, Long> {
        @Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery =
true)
        User findByEmailAddress(String emailAddress);
}
public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
nativeQuery = true)
Page<User> findByLastname(String lastname, Pageable pageable);
}
public interface UserRepository extends JpaRepository<User, Long> {
        @Query("select u from User u where u.firstname = :firstname or u.lastname =:lastname")
        User findByLastnameOrFirstname(@Param("lastname") String lastname,
            @Param("firstname") String firstname);
}

投影

class Person {
    @Id UUID id;
    String firstname, lastname;
    Address address;
    static class Address {
        String zipCode, city, street;
    }
}

interface NamesOnly {
    String getFirstname();
    String getLastname();
}

interface PersonRepository extends Repository<Person, UUID> {
    Collection<NamesOnly> findByLastname(String lastname);
}


 
End

[2]  spring boot JDBC
[4]  spring boot Mybatis

上一篇 下一篇

猜你喜欢

热点阅读