这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战
Jpa的概念
JPA(JavaPersistenceAPI)中文名Java持久层API,是JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。Sun引入新的JPAORM规范出于两个原因:其一,简化现有JavaEE和JavaSE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。JPA包括以下三方面的内容一套API标准,在javax.persistence的包下面,用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。面向对象的查询语言:JavaPersistenceQueryLanguage(JPQL),这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。(这段是抄的)
SpringDataJpa
顾名思义SpringDataJap就是Spring遵循jpa的规范基于ORM框架开发的一套jap框架,让使用者可以通过代码非常方便的操作数据库,实现增删改查的功能,极大地简化开发,提升开发效率。
SpringDataJpa 快速入门
新建一个工程,导入依赖,这里我们用SpringBoot,导入mysql的依赖,Jpa的依赖,还有我们导入 lombok,就不用写getset了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
然后是我们的配置文件application.properties
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db_jpa?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
#创建数据库的方式类型
spring.jpa.hibernate.ddl-auto=update
#显示sql语句
spring.jpa.show-sql=true
我们做了两个配置一个是显示sql语句,一个是创建数据库的方式类型,我们选的是update,常用的也是update 其他几个类型分别是
- creat :每次都回去根据你的实体类生成表,不管有没有实体类有没有改变,表里边是否有数据,都会执行,这样我们上次的数据都被删除掉了,这里我们不用
- create-drop:每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除
- update : 我们今天用的,第一次运行时会根据实体类在我们连接的数据库去生成表,之后实体类更新,会根据实体类去更新表,但不会删除数据
- validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
创建实体类
@Entity
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "username")
private String userName;
private Integer age;
private String address;
@Transient
private String sex;
}
@Entity 代表是一个实体类
@Data 帮我们生成getset方法
@Id 主键
@GeneratedValue(strategy = GenerationType.IDENTITY) 主键自增策略
@Column(name = "username")当属姓名不一致时用来指定列名,当我们的用驼峰命名时,在生成列名会加下划线,比如我们上边的userName生成的列明是user_name,我们使用Column时他们保持一致
@Transient 表示这个属性数据库不创建,就是jap帮我们生成表时不生成这个列
创建接口
/*
* 自定义集成jap的接口
* CrudRepository提供增删改擦的借口
*
* CrudRepository<User,Integer>
*/
public interface UserRepository extends CrudRepository<User,Integer> {
}
CrudRepository<T, ID> 的第一个参数使我们要操作的对象,ID时我们操作表的主键类型
测试类
新增
@Test
public void testSave(){
User user = new User();
user.setAge(20);
user.setUserName("李四1109");
user.setAddress("苏高新文体中心");
User save = userRepository.save(user);
}
控制台打印
数据库,新增成功
查询
@Test
public void testGet(){
System.out.println(userRepository.findById(1).get());
System.out.println("---------------------------------------");
Iterable<User> all = userRepository.findAll();
for (User user : all) {
System.out.println(user);
}
System.out.println("_--------------------------------------");
}
控制台
修改
@Test
public void testUpdate(){
User user = new User();
user.setAge(21);
user.setUserName("李四1109");
user.setAddress("苏高新文体中心");
user.setId(1);
User save = userRepository.save(user);
}
修改就是通过主键保存
删除
@Test
public void testCountAndDele(){
long count = userRepository.count();
System.out.println(count);
userRepository.deleteById(1);
userRepository.deleteAll();
System.out.println(userRepository.count());
}