101. spring boot 有哪些方式可以实现热部署?
SpringBoot热部署实现有两种方式:
①. 使用spring loaded
在项目中添加如下代码:
<build>
<plugins>
<plugin>
<!-- springBoot编译插件-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<!-- spring热部署 -->
<!-- 该依赖在此处下载不下来,可以放置在build标签外部下载完成后再粘贴进plugin中 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.6.RELEASE</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
添加完毕后需要使用mvn指令运行:
首先找到IDEA中的Edit configurations ,然后进行如下操作:(点击左上角的"+",然后选择maven将出现右侧面板,在红色划线部位输入如图所示指令,你可以为该指令命名(此处命名为MvnSpringBootRun))
点击保存将会在IDEA项目运行部位出现,点击绿色箭头运行即可
②. 使用spring-boot-devtools
在项目的pom文件中添加依赖:
<!--热部署jar-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
然后:使用 shift+ctrl+alt+"/" (IDEA中的快捷键) 选择"Registry" 然后勾选 compiler.automake.allow.when.app.running
102. jpa 和 hibernate 有什么区别?
-
JPA Java Persistence API,是Java EE 5的标准ORM接口,也是ejb3规范的一部分。
-
Hibernate,当今很流行的ORM框架,是JPA的一个实现,但是其功能是JPA的超集。
-
JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现。那么Hibernate是如何实现与JPA的这种关系的呢。Hibernate主要是通过三个组件来实现的,即hibernate-annotation、hibernate-entitymanager和hibernate-core。
-
hibernate-annotation是Hibernate支持annotation方式配置的基础,它包括了标准的JPA annotation以及Hibernate自身特殊功能的annotation。
-
hibernate-core是Hibernate的核心实现,提供了Hibernate所有的核心功能。
-
hibernate-entitymanager实现了标准的JPA,可以把它看成hibernate-core和JPA之间的适配器,它并不直接提供ORM的功能,而是对hibernate-core进行封装,使得Hibernate符合JPA的规范。
103 什么是 spring cloud?
从字面理解,SpringCloud就是致力于分布式系统,云服务的框架。
SpringCloud是整个Spring家族中新的成员,是最近云服务火爆的必然产物。
SpringCLoud为开发人员提供了快速构建分布式系统中一些常见模式的工具,例如:
- 配置管理
- 服务注册与发现
- 断路器
- 智能路由
- 服务间调用
- 负载均衡
- 微代理
- 控制总线
- 一次性令牌
- 全局锁
- 领导选举
- 分布式会话
- 集群状态
- 分布式消息
- 。。。。。
使用SpringCLoud开发人员可以开箱即用的实现这些模式的服务和应用程序。这些服务可以在任何环境下运行,包括分布式环境,也包括开发人员自己的笔记本电脑以及各种托管平台。
104. spring cloud 断路器的作用是什么?
在SpringCloud中使用了Hystrix来实现断路器的功能,断路器可以防止一个应用程序多次试图执行一个操作,即很可能失败,允许他继续而不等待故障恢复或者浪费CPU周期,而它确定该故障是持久的。断路器模式也使应用程序能够检测故障是否已经解决,如果问题似乎已经得到纠正,应用程序可以尝试调用操作。
断路器增加了稳定性和灵活性,以一个系统,提供稳定性,而系统从故障中恢复,并尽量减少此故障对性能的影响。它可以帮组快速的拒绝对一个操作,即很可能失败,而不是等待操作超时(或者不返回)的请求,以保持系统的响应时间。如果断路器提高每次改变状态的时间的事件,该信息可以被用来检测由断路器保护系统的部件的健康状况,或已提醒管理员当断路器跳闸,已在打开状态
105. spring cloud 的核心组件有哪些?
服务发现——Netflix Eureka
一个RESTful服务,用来定位运行在AWS地区(Region)中的中间层服务。由两个组件组成:Eureka服务器与Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互,作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量,资源利用率以及出错状态的加权负载均衡。
客服端负载均衡——NetflixRibbon
Ribbon,主要提供客户侧的软件负载均衡算法。Ribbon客户端组件提供一系列完善的配置选项,比如连接超时,重试,重试算法等。Ribbon内置可插拔,可定制的负载均衡组件。
断路器——Netflix Hystrix
断路器可以防止一个应用程序多次试图执行一个操作,即很可能失败,允许他继续二部等待故障恢复或者浪费CPU周期,而它确定该故障是持久的。断路器模式也使应用程序能够检测故障是否已经解决。如果问题似乎已经得到纠正,应用程序可以尝试调用操作。
服务网关——Netflix Zuul
类似nginx,反向代理的功能,不过netflix自己增加了一些配合其他组件的特性。
分布式配置——Spring Cloud Config
这个还是静态的,得配合Spring Cloud Bus实现动态的配置更新
106. 为什么要使用 hibernate?
- 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
- Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作。
- Hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
- Hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
107. 什么是 ORM 框架?
对象-关系映射(Object-Relational Mapping,简称ORM),面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
108. hibernate 中如何在控制台查看打印的 sql 语句?
参考:blog.youkuaiyun.com/Randy_Wang_/article/details/79460306
109. hibernate 有几种查询方式?
1. hql查询
2. sql查询
3. 条件查询
hql查询,sql查询,条件查询
HQL: Hibernate Query Language. 面向对象的写法:
Query query = session.createQuery("from Customer where name = ?");
query.setParameter(0, "苍老师");
Query.list();
QBC: Query By Criteria.(条件查询)
Criteria criteria = session.createCriteria(Customer.class);
criteria.add(Restrictions.eq("name", "花姐"));
List<Customer> list = criteria.list();
SQL:
SQLQuery query = session.createSQLQuery("select * from customer");
List<Object[]> list = query.list();
SQLQuery query = session.createSQLQuery("select * from customer");
query.addEntity(Customer.class);
List<Customer> list = query.list();
Hql: 具体分类
1、 属性查询 2、 参数查询、命名参数查询 3、 关联查询 4、 分页查询 5、 统计函数
HQL和SQL的区别
HQL是面向对象查询操作的,SQL是结构化查询语言 是面向数据库表结构的
110. hibernate 实体类可以被定义为 final 吗?
可以将Hibernate的实体类定义为final类,但这种做法并不好。因为Hibernate会使用代理模式在延迟关联的情况下提高性能,如果你把实体类定义成final类之后,因为Java不允许对final类进行扩展,所以Hibernate就无法再使用代理了,如此一来就限制了使用可以提升性能的手段。不过,如果你的持久化类实现了一个接口而且在该接口中声明了所有定义于实体类中的所有public的方法轮的话,你就能够避免出现前面所说的不利后果。
111. 在 hibernate 中使用 Integer 和 int 做映射有什么区别?
在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。
112. hibernate 是如何工作的?
hibernate工作原理:
-
通过Configuration config = new Configuration().configure();//读取并解析hibernate.cfg.xml配置文件
-
由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>读取并解析映射信息
-
通过SessionFactory sf = config.buildSessionFactory();//创建SessionFactory
-
Session session = sf.openSession();//打开Sesssion
-
Transaction tx = session.beginTransaction();//创建并启动事务Transation
-
persistent operate操作数据,持久化操作
-
tx.commit();//提交事务
-
关闭Session
-
关闭SesstionFactory
113. get()和 load()的区别?
- load()没有使用对象的其他属性的时候,没有SQL 延迟加载
- get()没有使用对象的其他属性的时候,也生成了SQL 立即加载
114. 说一下 hibernate 的缓存机制?
Hibernate中的缓存分为一级缓存和二级缓存。
一级缓存就是Session级别的缓存,在事务范围内有效,是内置的,不能被卸载。二级缓存是SessionFactory级别的缓存,从应用启动到应用结束有效。是可选的,默认没有二级缓存,需要手动开启。保存数据库后,缓存在内存中保存一份,如果更新了数据可就要同步更新。
什么样的数据适合存放到第二级缓存中?
- 很少被修改的数据 帖子的最后回复时间
- 经常被查询的数据 电商的地点
- 不是很重要的数据,允许出现偶尔并发的数据
- 不会被并发访问的数据
- 常量数据
扩展:Hibernate的二级缓存默认是不支持分布式缓存的。使用 memcache,redis等中央缓存来代替二级缓存。
115. hibernate 对象有哪些状态?
Hibernate里对象有三种状态:
- Transient(瞬时):对象刚new出来,还没设置ID,设置了其他值。
- Persistent(持久):调用了save(),saveOrUpdate(),就变成Persistent,有ID。
- Detached(脱管):当session close()完之后,变成Detached。
116. 在 hibernate 中 getCurrentSession 和 openSession 的区别是什么?
openSession从字面上可以看得出来,是打开一个新的session对象,而且每次使用都是打开一个新的session,假如连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session。
getCurrentSession,从字面上可以看得出来,是获取当前上下文一个session对象,当第一次使用此方法时,会自动产生一个session对象,并且连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一,简单而言,getCurrentSession就是:如果有已经使用的,用旧的,如果没有,建新的。
注意:在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务(即是使用一个数据库的情况),所以在一般情况下比较少使用openSession或者说openSession是比较老旧的一套接口了。
117. hibernate 实体类必须要有无参构造函数吗?为什么?
必须。因为Hibernate框架会调用这个默认构造方法来构造实例对象,即Class类的newInstance方法,这个方法就是通过调用默认构造方法来创建实例对象的。
另外再提醒一点,如果你没有提供任何构造方法,虚拟机会自动提供默认构造方法(无参构造器),但是如果你提供了其他有参数的构造方法的话,虚拟机就不再为你提供默认构造方法,这时必须手动把无参构造器写在代码里,否则new Xxxx()是会报错的,所以默认的构造方法不是必须的,只在有多个构造方法时才是必须的,这里“必须”指的是“必须手动写出来”。
Mybatis
118. mybatis 中 #{}和 ${}的区别是什么?
- #{}是预编译处理,${}是字符串替换;
- Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
- Mybatis在处理${}时,就是把${}替换成变量的值;
- 使用#{}可以有效的防止SQL注入攻击,提高系统安全性。
119. mybatis 有几种分页方式?
- 数组分页
- sql分页
- 拦截器分页
- RowBounds分页
120. mybatis 逻辑分页和物理分页的区别是什么?
- 物理分页速度上并不一定快于逻辑分页,逻辑分页速度上也并不一定快于物理分页。
- 物理分页总是优于逻辑分页:没有必要将属于数据库端的压力加诸到应用端来,就算速度上存在优势,然而其他性能上的优点足以弥补这个缺点。