Why use JPA
工作中接触项目情况一般都是数据库表建好后码猿进行业务开发。
也会出现既有JPA又有MybatisPlus的情况。为什么会这样呢?
If:让你从头到脚丫子去负责一个项目你怎么快速构建项目架构以及数据库表呢?
这个时候JPA就派上用场了。
作用:
1. ORM映射+自动建表
2. 作为持久化层的框架使用。类似MybatisPlus一样
- 这个地方主要强调的就是他建表的功能
那么怎么操作呢?
- 先搞定JPA的依赖和配置.本猿使用SpringBoot构建的项目。
<!--版本和springboot保持一致即可-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--该依赖配合idea插件lombok自动生成get、set、构造、toString、equals等方法-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
spring:
jpa:
hibernate:
# 配置jpa自动更新
ddl-auto: update
# 日志中显示执行的sql
show-sql: true
application:
name: spring-data-jpa-demo
# 数据库连接配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.200.128:3306/japtest?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: root
server:
port: 6620 #端口号
- 建立对应的实体类。
本猿在这里是先建立一个抽象父类。作用在于他里边的属性可以被其他实体类所继承。例如每个表都需要id字段、修改时间、创建人、业务需要的话还需要开启MP的逻辑删除等等
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import java.util.Date;
/**实体类父类
* 子类可以继承这些属性*/
@Data
@MappedSuperclass//声明该类不是一个实体类,做资源传递使用
public abstract class BaseEntity {
@Id//注意jpa自带有主键策略。不过一般工作中微服务都使用uuid来保证唯一
@Column(name = "id",length = 64)
private Long id;
@Column(name = "del_flag", length = 2)
private String delFlag;
@Column(name = "CREATED_BY")
private String createdBy;
@Column(name = "CREATED_DATE")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createdDate;
}
ok接下来创建一个子类即可。例如用户类User
注意子类得注解@EntityListeners(AuditingEntityListener.class)不能丢
import com.yh.springdatajpa.common.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "TB_USER")
@EntityListeners(AuditingEntityListener.class)
public class User extends BaseEntity {
@Column(name = "name",length = 30)//指定字段的长度
private String name;
@Column(name = "age")
private Integer age;
@Column(name = "address")
private String address;
@Column(name = "class_name")//符合驼峰命名规则的可以不用指定name属性
private String className;
}
- 使用该对象即可自动创建sql表
本猿在测试类中直接new了该对象
@SpringBootTest
class SpringDataJpaApplicationTests {
@Test
void testCreateTable() {
User user = new User();
System.out.println(user);
}
}
- 使用navicat观察创建情况
结果:表创建成功,且指定的字段长度生效,主键也生效!
大功告成!!!
补充一下吧
对于其持久化的功能,其官方规定为仓库JpaRepository<实体类,主键类型>。
使用的话在Repository包(即原来的Dao)下创建实体类对应的仓库。如上边的UserRepository
import com.yh.springdatajpa.pojo.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
然后在sercvice中注入调用即可。
本猿这里在Test类中测试一个保存方法
@Autowired
private UserRepository userRepository;
@Test
void testSaveTable() {
User user = new User("lisi",18,"bj","school");
user.setId(1l);//未设置主键自增策略手动赋值
user.setDelFlag("0");//逻辑删除中0默认为未删除
user.setCreatedBy("root");
user.setCreatedDate(new Date());
User save = userRepository.save(user);
System.out.println(save);
}
查看数据库保存成功
其余方法可以对比mybatisplus使用
补充:插入中文导致乱码问题
这就是jpa的一个弊端。解决方案暂无。