springdataJPA

JPA规范本质上就是一种ORM规范,但不是ORM框架

JPA 如何使用

接口继承JpaRepository

使用步骤

1 引入依赖

 <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.4.33.Final</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

2. resource下配置yml文件

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/book?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: 123456
  jpa:
    hibernate:
      ddl-auto: update  # 是否自动生/更新成表,根据什么策略 
      		# create  运行即创建表。覆盖之前的数据。
      		# create-drop 程序结束,清空表
      		# update 没有则创建,有表更新,元数据不清空
      		# validate 校验数据与数据库字段类型是否相同
      		# node 禁用DDL
      naming:
          strategy:org.hibernate.cfg.ImprovedNamingStrategy
     show-sql: true   # 是否在控制台展示sql语句
     open-in-view: false # Spring Boot 自动加载 Spring  # Data JPA

3 编写实体类entity

@Data
@Entity
@Table(name = 'nentity')
public class entity{
	@Id
    @GeneratedValue(strategy = GenerationType.AUTO)
	 /**
     * strategy	参数用于 声明主键的生成策略
     * 			TABLE: 使用一个特定的数据库表格存放主键。
     *          SEQUENCE:根据底层数据库的序列来生成主键
				IDENTITY:主键自增
				AUTO:主键由程序控制。(默认)
     */
     @Column(name = "id")
     private String id;

	@Column(name='age',length=10,nullable=true)
	private String age;
	
	@Column(name='name',length=50,nullable=true)
	private String name;
}

4 编写dao

/**
* 接口继承JpaRepository接口
**/
public interface EntityDao extends JpaRepository<Entity,Integer>{

	/**
	*  命名方式:: 
	* 	findBy + 关键字 + 查询条件
	**/
	List<Users> findByName(String name);

    List<Users> findByNameAndAge(String name,Integer age);

    List<Users> findByNameLike(String name);

    void updateNameById(@Param("id") Integer id, @Param("newName") String newName);

/**
* 根据参数位置注入
**/
@Query(value = "select id,age,name from Entity e where e.age>?1 and e.name=?2")
List<Book> findByPriceRange(int age,String name);

/**
* 根据参数名称注入
**/
@Query(value = "select name,age from Entity e where e.name = :name AND e.age =:age ")
List<Book> findByNamedParam(@Param("name") String name, @Param("age") int age,);

 Page<Entity> findByage(Integer age,Pageable pageable);
}

5 编写Service

	@Service
	@Translation
	public class EntityService{
		@Autowired
		private EntityDao entityDao;

public Entity saveEntity(Entity entity){
	Entity entity1 = entityDao.save(entity);
	return entity1;
}
public boolean deleteById(Integer id){
	entityDao.deleteById(id);
}

public Page<Entity > getEmpByPage(Integer pageNum,Integer pageSize){
PageRequest pageable=PageRequest.of(pageNum-1,pageSize);
Page<Entity > page = entityDao.findAll(pageable);
return page;
}

    @Query("update Entity set u.name=:newName where u.id=:id")
    void updateEntityById(@Param("id") Integer id, @Param("newName") String newName);
	}

CrudRepository类提供的方法:
CrudRepository

6.编写Controller

@RestController
@RequestMapping("/jpatest")
public class EntityController{
	@Autowired
	private ENtityService service;

	@RequestMapping("/add")
	public Entity saveEntity(Entity entity){
		Entity entity = entityService.saveEntity(entity);
		return entity;
	}
	@DeleteMapping("/delete")
	public boolean deleteEntity(Integer id){
		return service.deleteById(id);
	}
	@RequestMapping(value = "/PageQuery")
	  public Stream<Entity> findAllOrder(@RequestParam("age") Integer age, @RequestParam("page") Integer page){
	    //Jpa 分页查询
	    Sort sort = Sort.by(Sort.Direction.DESC,"orderdate"); //通过订单日期进行排序,orderdate 是OrderBean 中的变量,不是数据库中的字段(*)
	    Pageable pageable = PageRequest.of(page,3,sort);  // page 从 0 开始 ,3 是指每个page的大小,这个意思是按照订单日期排序分页查询,每次查询三个数据
	    return entityDao.findByage(age,pageable).get();
	  }
}

jpa 实体类相关注解

@Entity 实体类
@Table 关联实体类和表
@Column 关联实体类属性和表字段
@Id 对应表中主键id
@GeneratedValue 主键生成策略
@OneToMany 配置1对多关系
@ManyToOne 配置多对1关系
@OneToOne 配置11关系
@ManyToMany 配置多对多关系 多对多关系中一般不设置级联保存、级联删除、级联更新等操作。
@JoinColumn: 配置外键,参数:name:外键名称,referencedColumnName: 主表主键名称

JPA 优缺点

优点

  • 1 使用jpa,与数据库交互负担降低了很多。
  • 2 隐藏O / R映射和数据库访问处理, 代码容易写。
  • 3 是面向对象的查询语言,可持久化

持久化对象的步骤:

1-创建尸体管理器工厂

EntityManagerFactoryemf=Persistence.createEntityManagerFactory(“Student_details”);

2- 从工厂获取尸体

EntityManager em=emf.createEntityManager();

3- 初始化实体管理器

em.getTransaction().begin();

4- 将数据持久化到关系数据库中。

Student s1 = new Student();
s1.setName(“stu”);
em.persist(s1); # 持久化,插入实体
=========
em.find
用于寻找实体
em.find(Studeng.class,args).setName(“abc”)
用于更新实体
em.remove(student)
用于删除实体
==========

5 - commit

em.getTransaction().commit();

6- 释放工厂资源

emf.close();
em.close();

** Java对象

**缺点**
  • 因为sql语句是自动生成的可读性是比较差的,对于一些高级业务或者复杂的查询都需要自己来实现sql

JPQL

一种面向对象的查询语言, 用于对持久性实体执行数据库操作

使用实体对象模型代替数据库表来操作SQL查询

1- 它既简单又健壮。
2- 它是与平台无关的查询语言。
3- JPQL查询可以在元数据中静态声明, 也可以在代码中动态构建。
4-它可以与任何数据库一起使用, 例如MySQL, Oracle。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值