文章目录
一、JPA
1.ORM
由于Hibernate现在使用的很少,此处只介绍spring data jpa,但是springdatajpa的底层实际上还是使用的hibernate的jpa技术实现,和mybatis-plus的操作十分类似,只不过不需要扫描持久层的包
1)ORM思想:利用java中实体类操作数据库,这样就需要建立实体类与表的之间的关系映射以及属性和字段的映射关系,
2)已有的ORM框架:hibernate
2.JPA规范
1)JPA的全称是Java Persistence API, 即Java 持久化API,是SUN公司推出的一套基于ORM的规范,内部是由一系列的接口和抽象类构成,只是一种规范,如果使用的话,还需要加入服务厂商实现规范的jar包。
2)由于JPA是sun公司制定的API规范,所以我们不需要导入额外的JPA相关的jar包,只需要导入JPA的提供商的jar包
3)JPA的查询语言是面向对象的,而非数据库,支持面向对象的特性,封装继承多态
二、SpringBoot-SpringDataJpa
1.概述
1)可以很好的与SpringBoot项目集成,
2)dao层只需要写接口,不需要写实现类
3)可以跨数据库操作
2.环境搭建(以Mysql为例)
1)在IDEA中使用spring initializer工具创建项目并且加入spirngdatajpa功能,根据所连接的数据库添加相应的驱动
2)pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3)application.yml
如果不开懒加载的话,无法执行dao的方法
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springdadajpa?useSSL=false&serverTimeZone=UTC&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=123456
# 配置是否自动创建数据库表
spring.jpa.generate-ddl=false
#指定数据库类型
spring.jpa.database=mysql
#显示sql语句
spring.jpa.show-sql=true
#数据库方言:支持的特有语法
spring.jpa.database-platform=org.hibernate.dialect.MySQL55Dialect
#开启懒加载
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
3.牛刀小试
1)dao
public interface IUserDao extends JpaRepository<User,Integer> {//接口中得泛型是实体类和实体类中主键的类型
}
2)entity
@Table(name="t_user")
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)//使用主键自增
private Integer id;
private String name;
private String sex;
private Integer age;
}
4.细节问题
1)没有像Mybatis那样设置mapperscan,是如何知道dao接口的
2)如何创建dao对象的
dao接口继承一个通用的接口(一些简单的增删改查方法),在hibernate(类似mybatis)使用动态代理根据我们的接口创建实体类并且创建对象。
3)JpaRepository继承关系图
还有一个子类SimpleJpaRepository类实现了JpaRepository接口,而我们的代理类继承了SimpleJpaRepository类,实现了IUserDao接口,如果我们需要自己定义一个方法,只需要在IUserDao中添加抽象方法即可
三、常用API
1.CRUD
支持批量操作
System.out.println(dao.getById(1));//主键查询
dao.findAll();//查询所有数据
User user = new User();
user.setAge(20);
user.setName("黎洋");
user.setSex("男");
int id = dao.save(user).getId();//增加(再查询一次返回信息),如果主键存在就是更新,
dao.deleteById(id);//删除
2.分页和排序
1)分页
PageRequest page = PageRequest.of(1,2);
Page<User> users = dao.findAll(page);
System.out.println(users.getTotalElements());//总记录条数
System.out.println(users.getTotalPages());//总页数
System.out.println(users.getSize());//每页的大小
users.getContent().forEach(System.out::println);
2)排序
//排序
List<User> age = dao.findAll(Sort.by(Sort.Direction.ASC, "age"));
age.forEach(System.out::println);
//先排序+分页
Page<User> page = dao.findAll(PageRequest.of(0,3,Sort.by(Sort.Direction.DESC,"age")));
page.getContent().forEach(System.out::println);
3.条件查询
1)简单查询
在SpringDataJpa中允许直接使用方法名来实现简单查询:
①一个条件方法命名为findAll或者是find+实体类中的属性名+查询条件(属性类型 参数名)
User findByNameEquals(String name);//equals
List<User> findAllByAgeBetween(int min,int max);//between .. and ..
②多个条件方法命名为findAll或者是find+实体类中得属性名+查询条件+or/and+实体类中的属性名+查询条件(类型1 参数名,类型2 参数名)
List<User> findAllBySexEqualsAndAgeGreaterThanEqual(String sex,int minAge);
dao.findAllBySexEqualsAndAgeGreaterThanEqual("女",18).forEach(System.out::println);//找到清纯成年少女
2)复杂查询
利用Query注解查询
@Query("select o from User o where o.name like ?1") //JPQL
@Query(nativeQuery = true,value = "select * from t_user where name like ?1") //SQL
List<User> findAllByNameLike(String name);
3)一对多,一对一,暂时没用上
4、注解说明
1)@Entity,@Table
这两个都是用来标明实体类与数据库中表的映射关系,如果类名与表明不相等,那么通过注解的name属性指定
如果是使用Entity的话,建议和Table一起使用或者在启动类加上实体类的包扫描,在项目中碰见使用entity时出现实体类没有spring管理的错误,当然最好的事方法是直接使用table