一.JPA
特点:JPA可以根据方法名自动匹配sql语句.
JPA是一个标准
Hibernate是JPA的一个实现,宗旨是尽量少写sql语句.
使用JPA
1.application.properties配置:
在springBoot工程下的application.properties配置文件中的相关配置:
#配置数据库链接 spring.datasource.url=jdbc:mysql://数据库信息?useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.username=test spring.datasource.password=****** #配置数据库初始化的模式,会自动读取resources文件下面的data.sql文件(自定义)进行执行 #还会读取schema.sql文件 #schema.sql一般会写建表语句 #data.sql里面会写数据库插入的语句 spring.datasource.initialization-mode=always #关于JPA的配置 #执行sql语句的时候,是否在控制台打印 spring.jpa.show-sql=true #none 关闭根据实体类创建表的功能 #create 如果表不存在,则根据实体类的配置创建表 #update 如果实体类的配置更改了,与表对应不上,那么会更新表的结构 #create-drop 工程启动的时候先删除表在创建表。 spring.jpa.hibernate.ddl-auto=none
2.创建实体类
JPA会根据配置的实体类自动创建相应的表.
package com.example.demo.entity; import lombok.Data; import javax.persistence.*; @Data @Entity //上面这两个注解是lombok里面的 //使用JPA需要配置实体类与表的对应关系 @Table(name = "dep") //配置实体类对应的表的名字是什么 public class Dep { //主键列需要配置ID注解 @Id //配置注解自增长的方式 @GeneratedValue(strategy = GenerationType.IDENTITY) private Long uuid; //name : 自定义表名 //unique : 是否唯一 //nullable : 是否为空. @Column(name = "dep_name" ,unique = true,nullable = false) private String name; //默认情况下。实体类的驼峰式的属性会自动映射到列的下划线形式 private String depTele; //建立表的之间的关联. //OneToOne :一对一 //OneToMany :一对多 //ManyToMany : 多对对 @ManyToMany(fetch = FetchType.EAGER)
//创建外键 @JoinTable(name = "role_menu",joinColumns = @JoinColumn(name = "role_id"), inverseJoinColumns = @JoinColumn(name = "menu_id")) private Set<MenuEntity> menus; }
3.创建接口
创建一个接口,继承于JpaRepository<class,Long>
该接口有很多对数据库操作的方法,不需要实现,用的时候只需要利用多态调用父接口的方法就能对数据库进行操作.
比如:findById()方法,根据id查询所有.
1.这里面也可以自定义一些方法,不过方法名要符合规则.
2.可以利用@Query注解为自定义的方法配置自己的sql语句.
3.可以定义一个方法,由实现类来重写方法,在实现类里面重写更复杂的sql
package com.example.demo.repository; import com.example.demo.entity.Dep; import org.apache.ibatis.annotations.Param; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import java.util.List; public interface DepRepository extends JpaRepository<Dep,Long> { //JPA可以根据方法名自动生成SQL语句 List<Dep> findAllByNameContaining(String name);
//为方法配置自定义的sql @Query(value = "select * from dep where name like concat('%', :name,'%')",nativeQuery = true) List<Dep> findByname(@Param("name") String name);
//定义一个方法,有实现类来重写该方法,重写sql语句, List<Dep> findAllTest(); }
接口的实现类.
不需要在类上写implements实现上面的接口,JPA会根据类名的命名规则自动匹配实现类.
注入一个EntityManager对象,该对象会根据sql语句和实体类对数据操作.
//JPA会根据类名的规则,自动将该类的作为对应接口的实现类 @Repository public class DepRepositoryImpl { @Resource private EntityManager entityManager; public List<Dep> findAllTest(){ String sql = "select * from dep"; Query query = this.entityManager.createNativeQuery(sql, Dep.class); List list = query.getResultList(); return list; } }
4.直接在Service层调用接口方法对数据库进行操作.
//注入接口对象 @Resource private DepRepository depRepository; Optional<Dep> optional = this.depRepository.findById(uuid); //获取到的optional是一个代理对象 //这个代理对象是与数据库绑定的 //当改变这个代理对象的属性的值时,会自动改变数据库中的值 if (optional.isPresent()){ //把代理对象转为实体类对象 Dep dep = optional.get(); return dep; }
二.lombok
lombok主要是对创建的实体类的一些简化,
一些常用的lombok注解:
@Data : 给实体类配置get和set,tostring方法
@AllgrgsConstructor ;配置一个全参的构造方法
@NoArgsConstrutor : 添加一个空的构造方法
@Builder :创建建造者模式来创建对象.
@Getter : 创建get方式
@Setter ; 创建set方法
@Slf4j :创建日志对象.
package com.example.demo.entity; import lombok.*; @Data //真加getter&setter,toString,equals,hashcode //@Getter //只真加getter方法 其他同理 @AllArgsConstructor //添加一个全参数的构造方法 @NoArgsConstructor //添加一个无参数的构造方法 @Builder //真加一个建造者模式来创建对象 public class Emp { private Long uuid; private String name; private String email; private String tele; }