目录
前言一、SpringBoot整合JPA-Hibernate1.1 引入依赖1.2 修改application.properties配置1.3 创建实体类(注解式开发无需.hbm.xml文件)1.4 定义数据库接口1.5 service层1.6 Controller层
二、 QueryDSL2.1 引入依赖2.2 配置2.3 使用
总结
前言
概念了解
ORM:对象关系映射,为了解决面向对象与关系数据库存在的互不匹配的现象的技术。(表字段映射实体类)ORM框架:连接数据库的桥梁,只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中 常用的ORM框架有Mybatis、HibernateJPA(Java Persistence API):是一种ORM规范。把开发者从繁琐的SQL代码中解脱出来。Hibernate 实现了 JPA 规范Spring Data Jpa: spring 提供的一套简化 JPA 开发的框架,可以在不写接口实现的情况下,实现对数据库的访问和操作。也有如分页、排序、复杂查询等等功能。(Spring Data JPA 可以理解为 JPA 规范的再次封装抽象,底层还是使用了 Hibernate 的 JPA 技术实现。)QueryDSL:在 SpringData JPA 的基础上,更近一步,更面向对象提供了统一的类型安全的查询方式。
提示:以下是本篇文章正文内容,下面案例可供参考
一、SpringBoot整合JPA-Hibernate
1.1 引入依赖
1.2 修改application.properties配置
#连接数据库
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3366/springboot-demo?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
# jpa的相关配置
# 数据库类型
spring.jpa.database = MYSQL
# 打印sql
spring.jpa.show-sql = true
# 指定数据库的初始化模式
# none不指定、
# create应用运行时,会删除并重新创建数据库(数据清空)
# create-drop 当sessionFactory关闭,表会自动删除
# validate 应用运行时,会检查数据库中的表与java实体类是否匹配。如果不匹配,则运行失败
# update 当在java实体类中新增了一个字段,在应用重新运行时,会将字段添加到数据库表中的新列,但不会移除先前存在的列或约束
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
1.3 创建实体类(注解式开发无需.hbm.xml文件)
常用注解:
类注解:
@Entity 标识实体类,被Entity标注的实体类将会被JPA管理控制,在程序运行时,JPA会识别并映射到指定的数据库表@Table 想生成的数据库表名与实体类名称不同时,使用 @Table(name=“数据库表名”),与@Entity标注并列使用
属性注解:
@Id 映射为数据库主键@GeneratedValue与@Id一同使用,用于标注主键的生成策略,通过 strategy 属性指定。(DENTITY:主键自增,AUTO:JPA 自动选择合适的策略默认选项。)@Column 参数:name: 指定映射的字段名,默认不唯一、默认可为空、默认可插入、默认允许更新@Transient 忽略该属性,不会映射到数据库中@OneToOne 一对一,targetEntity: 指定关联实体类型、cascade:级联操作策略、fetch:该属性的加载读取策略、mappedBy: 指定关联关系。@ManyToOne@OneToMany@ManyToMany@Enumerated 希望数据库中存储的是枚举对应的String类型,在属性上加@Enumerated(EnumType.STRING)
@Entity
@Table(name = "school")
public class School {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(length = 40)
private String name;
@OneToOne(cascade = CascadeType.ALL)
private SchoolMaster schoolMaster;
//get、set方法
}
1.4 定义数据库接口
// hibernate的接口,springboot整合hibernate用的是jpa,接口要继承JpaRepository
// 里面已经集成了增删改查方法,额外的查询需要我们手动添加方法HQL
public interface SchoolRepository extends JpaRepository
//JPA方法名命名规则
public School findTopById(Long id);
// 这是HQL :xx 指传入参数,跟下面注解@Param对应
//@Query(value = "SELECT s FROM School s WHERE name=:name")
//List
// 原生SQL
@Query(value = "SELECT * FROM School WHERE name=?", nativeQuery = true) nativeQuery为true代表使用SQL语言
public School findByName(@Param("name") String name);
}
1.5 service层
@Service
public class SchoolService {
@Autowired
private SchoolRepository schoolRepository;
public List
return schoolRepository.findByName(name);
}
public void save(School school){
schoolRepository.save(school);
}
}
1.6 Controller层
@Controller
public class SchoolController {
@Autowired
private SchoolService schoolService;
@RequestMapping("/findByName")
@ResponseBody
public String findByName(String name){
return schoolService.findByName(name).toString();
}
@RequestMapping("/save")
@ResponseBody
public String save(){
School school = new School();
school.setName("张三");
schoolService.save(school);
return "插入成功,id=" + school.getId();
}
}
二、 QueryDSL
SpringData JPA 封装了一些列的类和方法(Specification、Pageable分页),不需要写 SQL,以一种面向对象的方式进行数据的查询。 而QueryDSL 则是在 SpringData JPA 的基础上,更面相对象。
2.1 引入依赖
为了满足 QueryDSL 查询的规范,我们需要为每一个持久化类生成一个对应的 EntityPath,这个过程可通过 maven 插件自动生成。添加该插件,执行 maven compile 后,会在 entity 同名的包下生成 Q 开头的类。
2.2 配置
1、注入一个 JPAQueryFactory 对象,通过它来执行各种查询操作,可类比 JdbcTemplate。
@Configuration
public class QuerydslConfig {
@Bean
public JPAQueryFactory jpaQuery(EntityManager entityManager) {
return new JPAQueryFactory(entityManager);
}
}
2.3 使用
@RestController
public class SchoolController {
@Autowired
private JPAQueryFactory jpaQueryFactory;
@GetMapping("/findByName")
public List
QSchool qSchool = QSchool.school;
School school = jpaQueryFactory
.selectFrom(qSchool)
.where(qSchool.name.like(name))
.fetchFirst();
return school.getName();
}
}
总结
Mybatis可以进行更细致的SQL优化,数据库的移植性较差,针对不同的数据库编写不同的SQL。
Hibernate对数据库提供了较为完整的封装,封装了基本的DAO层操作,有较好的数据库移植性。
文章链接
发表评论