Hibernate是什么?

Hibernate与MyBatis都是流行的持久层开发框架,只不过Hibernate是全自动ORM框架,不需要关心sql编写。

Hibernate 是一个高性能的对象/关系映射(ORM)持久化存储和查询的服务,不仅负责从Java类到数据库表的映射 (还包括从Java数据类型到SQL数据类型的映射),还提供了面向对象的数据查询检索机制,从而极大地缩短了手动处理SQL和JDBC上的开发时间。 同时,Hibernate还实现了JPA规范,在SpringBoot中,JPA的默认实现就是使用的Hibernate。

JPA和Hibernate?

JPA

JPA(Java Persistence API)是Sun官方提出的Java持久化规范,它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。

可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。

JPA仅仅是一种规范,也就是说JPA仅仅定义了一些接口,而接口是需要实现才能工作的。所以底层需要某种实现,而Hibernate就是实现了JPA接口的ORM框架。

Hibernate

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架。 Hibernate可以自动生成SQL语句、自动执行,从而使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。

实际上,JPA规范制定过程中就是借鉴了Hibernate等这些开源的持久框架,也就是说Hibernate的出现比JPA还要早些。

在Hibernate中使用的注解就是JPA注解,Hibernate实现了JPA规范。

Spring Data JPA

spirng data jpa是spring提供的一套简化JPA开发的框架,按照约定好的【方法命名规则】写dao层接口,就可以在不写接口实现的情况下,实现对数据库的访问和操作。同时提供了很多除了CRUD之外的功能,如分页、排序、复杂查询等等。

Spring Data JPA 可以理解为 JPA 规范的再次封装抽象,底层还是使用了 Hibernate 的 JPA 技术实现。

SpringData

Spring Data 是持久层通用解决方案,支持 关系型数据库 Oracle、MySQL、非关系型数据库NoSQL、Map-Reduce 框架、云基础数据服务 、搜索服务。

Spring Data是一个开源框架而Spring Data JPA是这个框架的模块。

一、新建SpringBoot项目

在pom.xml中引入maven依赖

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.17</version><scope>runtime</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.2</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version></dependency>

创建数据库

create table books
(book_id int(5) primary key auto_increment,title varchar(200),category varchar(100)
)
INSERT INTO `books` (`book_id`, `title`, `category`) VALUES(1, '123', 'qwe'),(2, '456', 'asd'),(3, '789', 'zxc');

配置文件application.yml

spring:jpa:properties:hibernate:dialect: org.hibernate.dialect.MySQLDialectnew_generator_mappings: falseformat_sql: truedatasource:url: jdbc:mysql://localhost:3306/ss?serverTimezone=UTC&useSSL=false&autoReconnect=true&tinyInt1isBit=false&useUnicode=true&characterEncoding=utf8username: rootpassword: 123qwe

创建如图以下包

在config下编写数据源配置

@Configuration
@EnableTransactionManagement(order = 2)
public class DataSourceConfig {@Resourceprivate DruidProperties druidProperties;/*** 单数据源连接池配置*/@Beanpublic DruidDataSource singleDatasource() {DruidDataSource dataSource = new DruidDataSource();druidProperties.config(dataSource);return dataSource;}
}
@Component
@ConfigurationProperties(prefix = "spring.datasource")
public class DruidProperties {private String url;private String username;private String password;private String driverClassName = "com.mysql.cj.jdbc.Driver";private Integer initialSize = 10;private Integer minIdle = 3;private Integer maxActive = 60;private Integer maxWait = 60000;private Boolean removeAbandoned = true;private Integer removeAbandonedTimeout = 180;private Integer timeBetweenEvictionRunsMillis = 60000;private Integer minEvictableIdleTimeMillis = 300000;private String validationQuery = "SELECT 'x'";private Boolean testWhileIdle = true;private Boolean testOnBorrow = false;private Boolean testOnReturn = false;private Boolean poolPreparedStatements = true;private Integer maxPoolPreparedStatementPerConnectionSize = 50;private String filters = "stat";public void config(DruidDataSource dataSource) {dataSource.setDbType(JdbcConstants.MYSQL);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);dataSource.setDriverClassName(driverClassName);// 定义初始连接数dataSource.setInitialSize(initialSize);// 最小空闲dataSource.setMinIdle(minIdle);// 定义最大连接数dataSource.setMaxActive(maxActive);// 获取连接等待超时的时间dataSource.setMaxWait(maxWait);// 超过时间限制是否回收dataSource.setRemoveAbandoned(removeAbandoned);// 超过时间限制多长dataSource.setRemoveAbandonedTimeout(removeAbandonedTimeout);// 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);// 配置一个连接在池中最小生存的时间,单位是毫秒dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);// 用来检测连接是否有效的sql,要求是一个查询语句dataSource.setValidationQuery(validationQuery);// 申请连接的时候检测dataSource.setTestWhileIdle(testWhileIdle);// 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能dataSource.setTestOnBorrow(testOnBorrow);// 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能dataSource.setTestOnReturn(testOnReturn);// 打开PSCache,并且指定每个连接上PSCache的大小dataSource.setPoolPreparedStatements(poolPreparedStatements);dataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);// 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:// 监控统计用的filter:stat// 日志用的filter:log4j// 防御SQL注入的filter:walltry {dataSource.setFilters(filters);} catch (SQLException e) {e.printStackTrace();}}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getDriverClassName() {return driverClassName;}public void setDriverClassName(String driverClassName) {this.driverClassName = driverClassName;}public Integer getInitialSize() {return initialSize;}public void setInitialSize(Integer initialSize) {this.initialSize = initialSize;}public Integer getMinIdle() {return minIdle;}public void setMinIdle(Integer minIdle) {this.minIdle = minIdle;}public Integer getMaxActive() {return maxActive;}public void setMaxActive(Integer maxActive) {this.maxActive = maxActive;}public Integer getMaxWait() {return maxWait;}public void setMaxWait(Integer maxWait) {this.maxWait = maxWait;}public Integer getTimeBetweenEvictionRunsMillis() {return timeBetweenEvictionRunsMillis;}public void setTimeBetweenEvictionRunsMillis(Integer timeBetweenEvictionRunsMillis) {this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;}public Integer getMinEvictableIdleTimeMillis() {return minEvictableIdleTimeMillis;}public void setMinEvictableIdleTimeMillis(Integer minEvictableIdleTimeMillis) {this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;}public String getValidationQuery() {return validationQuery;}public void setValidationQuery(String validationQuery) {this.validationQuery = validationQuery;}public Boolean getTestWhileIdle() {return testWhileIdle;}public void setTestWhileIdle(Boolean testWhileIdle) {this.testWhileIdle = testWhileIdle;}public Boolean getTestOnBorrow() {return testOnBorrow;}public void setTestOnBorrow(Boolean testOnBorrow) {this.testOnBorrow = testOnBorrow;}public Boolean getTestOnReturn() {return testOnReturn;}public void setTestOnReturn(Boolean testOnReturn) {this.testOnReturn = testOnReturn;}public Boolean getPoolPreparedStatements() {return poolPreparedStatements;}public void setPoolPreparedStatements(Boolean poolPreparedStatements) {this.poolPreparedStatements = poolPreparedStatements;}public Integer getMaxPoolPreparedStatementPerConnectionSize() {return maxPoolPreparedStatementPerConnectionSize;}public void setMaxPoolPreparedStatementPerConnectionSize(Integer maxPoolPreparedStatementPerConnectionSize) {this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;}public String getFilters() {return filters;}public void setFilters(String filters) {this.filters = filters;}public Boolean getRemoveAbandoned() {return removeAbandoned;}public void setRemoveAbandoned(Boolean removeAbandoned) {this.removeAbandoned = removeAbandoned;}public Integer getRemoveAbandonedTimeout() {return removeAbandonedTimeout;}public void setRemoveAbandonedTimeout(Integer removeAbandonedTimeout) {this.removeAbandonedTimeout = removeAbandonedTimeout;}
}

在entity下创建实体类

@Entity
@Table(name = "books")
@Data
public class Book implements Serializable {private static final long serialVersionUID = 1L;@Id@GeneratedValue(strategy = GenerationType.AUTO)@Column(name = "book_id")private int bookId;@Column(name = "title")private String title;@Column(name = "category")private String category;
}

创建在repository下创建Dao层接口和在impl下创建Dao实现类

public interface BookDao {List<Book> getAllBooks();Book getBookById(int bookId);void addBook(Book book);void updateBook(Book book);void deleteBook(int bookId);boolean bookExists(String title,String category);
}

@Repository
public class IBookDao implements BookDao {@PersistenceContextprivate EntityManager entityManager;@Overridepublic List<Book> getAllBooks() {String sql = "FROM Book as book ORDER BY book.bookId";return (List<Book>)entityManager.createQuery(sql).getResultList();}@Overridepublic Book getBookById(int bookId) {return entityManager.find(Book.class,bookId);}@Overridepublic void addBook(Book book) {entityManager.persist(book);}@Overridepublic void updateBook(Book book) {Book book1 = getBookById(book.getBookId());book1.setTitle(book.getTitle());book1.setCategory(book.getCategory());entityManager.flush();entityManager.clear();}@Overridepublic void deleteBook(int bookId) {entityManager.remove(getBookById(bookId));}@Overridepublic boolean bookExists(String title, String category) {String sql = "FROM Book as book WHERE book.title=?0 and book.category=?1";int count = entityManager.createQuery(sql).setParameter(0,title).setParameter(1,category).getResultList().size();return count > 0;}
}

创建业务层Service,注入BookDao

@Service
public class BookService {@Autowiredprivate BookDao bookDao;public Book getBookById(int bookId){Book book= bookDao.getBookById(bookId);return book;}public List<Book> getAllBooks(){return bookDao.getAllBooks();}public synchronized boolean addBook(Book book){if(bookDao.bookExists(book.getTitle(),book.getCategory())){return false;}else {bookDao.addBook(book);return true;}}public void updateBook(Book book){bookDao.updateBook(book);}public void deleteBook(int bookId){bookDao.deleteBook(bookId);}
}

测试类 编写测试代码

再上图中测试类下编写以下代码

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
public class HibernateApplicationTests {@Autowiredprivate BookService bookService;@Test@Rollback(false)public void contextLoads() {Book book = bookService.getBookById(1);assertThat(book.getTitle(),is("123"));List<Book> list = bookService.getAllBooks();assertThat(list,notNullValue());assertThat(list.size(), is(3));boolean flag = bookService.addBook(book);assertThat(flag, is(false));book.setTitle("012");bookService.updateBook(book);Book book1 = bookService.getBookById(1);System.out.println(book1);assertThat(book1.getTitle(), is("012"));bookService.deleteBook(1);Book article2 = bookService.getBookById(1);assertThat(article2, nullValue());}}

依次执行上面测试代码中的增删改查。根据数据库和控制台输出查看结果是否测试通过。简单的集成Hibernate已经完成。更多可以了解JPA复杂语句查询以及根据实体类自动创建数据库。

SpringBoot集成Hibernate相关推荐

  1. springboot 集成hibernate 集成struts2

    springboot集成hibernate 首先添加依赖 操作数据库必须需要的一个依赖   jpa:数据持久化API 将数据写入数据库称之为持久化  只要将数据写入数据库就需要用到数据持久化API & ...

  2. SpringBoot集成Cache缓存(Redis缓存,RedisTemplate方式)

    1.说明 SpringBoot集成Redis缓存, 首先创建一个Spring Boot工程, 使用Maven向导方式创建:SpringBoot集成Maven工程 然后引入redis的spring bo ...

  3. SpringBoot 集成log4j2

    SpringBoot集成log4j2 1. Log4j2优点 2. Log4j2日志级别 2.1 级别 2.2 视图 3. SpringBoot整合Log4j2配置 4. log4j2.yml配置 1 ...

  4. springboot集成graphql(一)

    背景:基于上篇springboot集成jooq继续 GraphQL Playgroundhttps://github.com/prisma-labs/graphql-playground/releas ...

  5. SpringBoot集成mysql-connector-java数据库驱动

    官方文档:https://dev.mysql.com/doc/connector-j/8.0/en/ MySQL使用MySQL Connector/J 用Java编程语言开发的客户端应用程序提供连接, ...

  6. Jpa第一话 -- Springboot集成Jpa和Mybatis以及Jpa的最全使用

    本文主要记录spring-boot-starter-data-jpa的详细使用. 在做一些小型无并发的项目时,说实话第一个想到的就是Jpa,一个Entity走天下. 1.Spring Jpa的使用 基 ...

  7. 达梦DCA之SpringBoot集成达梦数据库

    受"华为.中兴事件"影响,我国科技尤其是上游核心技术受制于人的现状对我国经济发展.社会稳定等都提出了严峻考验.大力发展科技产业,鼓励科技创新,成为当下时不我待的命题.中美贸易战以来 ...

  8. Springboot集成Swagger

    Springboot集成Swagger 1. Swagger概述 2. Swagger注解说明 3. Springboot集成Swagger 3.1 引入依赖 3.2 工具类 3.3 配置类 3.4 ...

  9. java常用日志框架日志门面及实现 SLF4J 、Jboss-logging 、JCL、Log4j、Logback、Log4j2、JUL,springboot集成 log4j、log4j2

    java常用日志框架日志门面SLF4J .Jboss-logging .JCL.Log4j及实现 Logback.Log4j2.JUL,springboot集成 log4j.log4j2 .logba ...

最新文章

  1. 排序算法(一) 冒泡排序
  2. 关于#pragma code_seg
  3. 如何查看SharePoint未知错误
  4. RBAC模型:设计思路
  5. react-native在windows环境下的项目启动
  6. 头上有多少根头发算秃头?
  7. JDBC 防御性编程
  8. 【HDU - 4509】湫湫系列故事——减肥记II(合并区间模板 or 离散化标记 or 线段树)
  9. 贪心——今年暑假不AC(hdu2037)
  10. MOSS项目开发 周记(第一周)
  11. Java使用RSA加密解密及签名校验
  12. e7用什么主板_主板当中的纽扣电池有什么用?电池没电了会怎样?
  13. Android wakelock机制
  14. 在php中使用for、while、do-while循环实现从1加到100
  15. 银河麒麟操作系统下载地址收集
  16. 云计算基础(纯理论)
  17. Android性能优化——启动优化简述
  18. 5.29 C语言练习(计算数字个数:从键盘输入一串字符,输出字符串里的数字字符数。)
  19. 铝巨人铝模软件_助力建筑工业化发展PKPM-LMB铝模设计软件正式发布
  20. 计算机网络——网络层知识点

热门文章

  1. 泛统计理论初探——初探Gibbs采样
  2. [C++] memset函数用法理解
  3. python取列表前几个元素_python list输出最后10个元素
  4. 视频教程-Access2013数据库入门教程-Office/WPS
  5. c语言xb 3,2015年计算机二级《C语言》考前押题密卷(3)
  6. java快递100接口开发_java swing开发的一个抓取快递100查询接口的小工具
  7. 【ERP】常见错误收集
  8. 转 基于Spark的大数据精准营销中搜狗搜索引擎的用户画像挖掘
  9. flash as3.0 五子棋的游戏制作
  10. 【Matlab指纹识别】指纹识别门禁系统【含GUI源码 1692期】