1️⃣ 数据库查询使用索引
2️⃣ 查询数据不使用*,使用具体字段
3️⃣ 语句大写
4️⃣ 使用exists代替in,not exists代替not in
5️⃣ 用>=代替>引
6️⃣ 尽可能使用commit,由于会释放一些资源 例如
html
数据库常见面试题程序员
原理:web
为何要用:面试
对JDBC访问数据库的代码作了封装,大大简化了数据访问层繁琐的重复性代码。算法
Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工做spring
hibernate使用Java反射机制,而不是字节码加强程序来实现透明性。sql
hibernate的性能很是好,由于它是个轻量级框架。映射的灵活性很出色。它支持各类关系数据库,从一对一到多对多的各类复杂关系。数据库
3编程
Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体如今表与表之间的关系进行操做,它们都是对对象进行操做,咱们程序中把全部的表与类都映射在一块儿,它们经过配置文件中的many-to-one、one-to-many、many-to-many、1️⃣ 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存
2️⃣ 二级缓存:
Sql、Criteria、object comptosition Hql:
为何用:
Spring即便一个AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协做对象)。而后能够很容易地在须要时替换具备相似接口的协做对象。
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了建立、配置和管理 bean 的方式,如图 1 所示。 组成 Spring 框架的每一个模块(或组件)均可以单独存在,或者与其余一个或多个模块联合实现。每一个模块的功能以下:
核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
Spring AOP:经过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。因此,能够很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。经过使用 Spring AOP,不用依赖 EJB 组件,就能够将声明性事务管理集成到应用程序中。
Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不一样数据库供应商抛出的错误消息。异常层次结构简化了错误处理,而且极大地下降了须要编写的异常代码数量(例如打开和关闭链接)。Spring DAO 的面向 JDBC 的异常听从通用的 DAO 异常层次结构。
Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。全部这些都听从 Spring 的通用事务和 DAO 异常层次结构。
Spring Web 模块:Web 上下文模块创建在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。因此,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工做。
Spring MVC 框架:MVC 框架是一个全功能的构建Web 应用程序的 MVC 实现。经过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
Spring 框架的功能能够用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象能够在不一样 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。
控制反转模式(也称做依赖性介入)的基本概念是:不建立对象,可是描述建立它们的方式。在代码中不直接与对象和服务链接,但在配置文件中描述哪个组件须要哪一项服务。容器(在 Spring 框架中是 IOC 容器) 负责将这些联系在一块儿。 在典型的 IOC 场景中,容器建立了全部对象,并设置必要的属性将它们链接在一块儿,决定什么时间调用方法。下表列出了 IOC 的一个实现模式。 Spring 框架的 IOC 容器采用类型 2 和类型3 实现。 面向方面的编程 面向方面的编程,即 AOP,是一种编程技术,它容许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。
AOP 的功能彻底集成到了 Spring 事务管理、日志和其余各类特性的上下文中。
Spring 设计的核心是 org.springframework.beans 包,它的设计目标是与 JavaBean 组件一块儿使用。这个包一般不是由用户直接使用,而是由服务器将其用做其余多数功能的底层中介。下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,容许经过名称建立和检索对象。BeanFactory 也能够管理对象之间的关系。 BeanFactory 支持两个对象模型。 □ 单态 模型提供了具备特定名称的对象的共享实例,能够在查询时对其进行检索。Singleton 是默认的也是最经常使用的对象模型。对于无状态服务对象很理想。 □ 原型 模型确保每次检索都会建立单独的对象。在每一个用户都须要本身的对象时,原型模型最适合。 bean 工厂的概念是 Spring 做为 IOC 容器的基础。IOC 将处理事情的责任从应用程序代码转移到框架。正如我将在下一个示例中演示的那样,Spring 框架使用 JavaBean 属性和配置数据来指出必须设置的依赖关系。 BeanFactory 接口 由于 org.springframework.beans.factory.BeanFactory 是一个简单接口,因此能够针对各类底层存储方法实现。最经常使用的 BeanFactory 定义是 XmlBeanFactory,它根据 XML 文件中的定义装入 bean,如清单 1 所示。 清单 1. XmlBeanFactory BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml")); 在 XML 文件中定义的 Bean 是被消极加载的,这意味在须要 bean 以前,bean 自己不会被初始化。要从 BeanFactory 检索 bean,只需调用 getBean() 方法,传入将要检索的 bean 的名称便可,如清单 2 所示。
清单 2. getBean() MyBean mybean = (MyBean) factory.getBean("mybean"); 每一个 bean 的定义均可以是 POJO (用类名和 JavaBean 初始化属性定义) 或 FactoryBean。FactoryBean 接口为使用 Spring 框架构建的应用程序添加了一个间接的级别。
工做机制: Struts的工做流程: 在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各类配置对象.. 当ActionServlet接收到一个客户请求时,将执行以下流程:
1️⃣ 检索和用户请求匹配的ActionMapping实例,若是不存在,就返回请求路径无效信息;
2️⃣ 若是ActionForm实例不存在,就建立一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;
3️⃣ 根据配置信息决定是否须要表单验证.若是须要验证,就调用ActionForm的validate()方法;
4️⃣ 若是ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象, 就表示表单验证成功;
5️⃣ ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪一个Action,若是相应的Action实例不存在,就先建立这个实例,而后调用Action的execute()方法;
6️⃣ Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给ActionForward对象指向的JSP组件;
7️⃣ ActionForward对象指向JSP组件生成动态网页,返回给客户;
JSP、Servlet、JavaBean技术的出现给咱们构建强大的企业应用系统提供了可能。但用这些技术构建的系统很是的繁乱,因此在此之上,咱们须要一个规则、一个把这些技术组织起来的规则,这就是框架,Struts便应运而生。 基于Struts开发的应用由3类组件构成:控制器组件、模型组件、视图组件 Struts的validate框架是如何验证的? 在struts配置文件中配置具体的错误提示,再在FormBean中的validate()方法具体调用。 说下Struts的设计模式 MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被建立,并被填入表单相应的数据,ActionServler根据Struts-config.xml 文件配置好的设置决定是否须要表单验证,若是须要就调用ActionForm的Validate()验证后选择将请求发送到哪一个Action,若是 Action不存在,ActionServlet会先建立这个对象,而后调用Action的execute()方法。Execute()从 ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给 ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。 单例模式 Factory(工厂模式):
定义一个基类===》实现基类方法(子类经过不一样的方法)===》定义一个工厂类(生成子类实例)
===》开发人员调用基类方法
Proxy(代理模式)
复制代码
1️⃣ spring mvc请全部的请求都提交给DispatcherServlet,它会委托应用系统的其余模块负责负责对请求进行真正的处理工做。
2️⃣ DispatcherServlet查询一个或多个HandlerMapping,找处处理请求的Controller.
3️⃣ DispatcherServlet请请求提交到目标Controller
4️⃣ Controller进行业务逻辑处理后,会返回一个ModelAndView
5️⃣ Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
6️⃣ 视图对象负责渲染返回给客户端。
首先,Hibernate中维持了两级缓存。第一级缓存由Session实例维护,其中保持了Session当前全部关联实体的数据,也称为内部缓存。而第二级缓存则存在于SessionFactory层次,由当前全部由本 SessionFactory构造的Session实例共享。出于性能考虑,避免无谓的数据库访问,Session在调用数据库查询功能以前,会先在缓存中进行查询。首先在第一级缓存中,经过实体类型和id进行查找,若是第一级缓存查找命中,且数据状态合法,则直接返回。 以后,Session会在当前“NonExists”记录中进行查找,若是“NonExists”记录中存在一样的查询条件,则返回null。 “NonExists”记录了当前Session实例在以前全部查询操做中,未能查询到有效数据的查询条件(至关于一个查询黑名单列表)。如此一来,若是 Session中一个无效的查询条件重复出现,便可迅速做出判断,从而得到最佳的性能表现。 对于load方法而言,若是内部缓存中未发现有效数据,则查询第二级缓存,若是第二级缓存命中,则返回。 如在缓存中未发现有效数据,则发起数据库查询操做(Select SQL),如通过查询未发现对应记录,则将这次查询的信息在“NonExists”中加以记录,并返回null。 根据映射配置和Select SQL获得的ResultSet,建立对应的数据对象。 将其数据对象归入当前Session实体管理容器(一级缓存)。 执行Interceptor.onLoad方法(若是有对应的Interceptor)。 将数据对象归入二级缓存。 若是数据对象实现了LifeCycle接口,则调用数据对象的onLoad方法。 返回数据对象。
这10中生成OID标识符的方法,increment 比较经常使用,把标识符生成的权力交给Hibernate处理.可是当同时多个Hibernate应用操做同一个数据库,甚至同一张表的时候.就推荐使用identity 依赖底层数据库实现,可是数据库必须支持自动增加,固然针对不一样的数据库选择不一样的方法.若是你不能肯定你使用的数据库具体支持什么的状况下.能够选择用native 让Hibernate来帮选择identity,sequence,或hilo. 另外因为经常使用的数据库,如Oracle、DB二、SQLServer、MySql 等,都提供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。咱们能够在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式。 不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引发表之间的互锁。数据库提供的主键生成机制,每每是经过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),以后每次插入数据会读取这个最大值,而后加上递增量做为新记录的主键,以后再把这个新的最大值更新回内部表中,这样,一次Insert操做可能致使数据库内部屡次表读写操做,同时伴随的还有数据的加锁解锁操做,这对性能产生了较大影响。所以,对于并发Insert要求较高的系统,推荐采用uuid.hex 做为主键生成机制
inverse属性默认是false,就是说关系的两端都来维护关系。 好比Student和Teacher是多对多关系,用一个中间表TeacherStudent维护。Gp)i 若是Student这边inverse=”true”, 那么关系由另外一端Teacher维护,就是说当插入Student时,不会操做TeacherStudent表(中间表)。只有Teacher插入或删除时才会触发对中间表的操做。因此两边都inverse=”true”是不对的,会致使任何操做都不触发对中间表的影响;当两边都inverse=”false” 或默认时,会致使在中间表中插入两次关系。
saveOrUpdate()方法能够实现update()的功能,但会多些步骤,具体以下: 若是对象在该session中已经被持久化,不进行操做;对象的标识符属性(identifier property)在数据库中不存在或者是个暂时的值,调用save()方法保存它;若是session中的另外一个对象有相同的标识符抛出一个异常;以上皆不符合则调用update()更新之。 Session.load/get方法都可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于: 若是未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException;load方法可返回实体的代理类实例,而get方法永远直接返回实体类;load方法能够充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。
(1)通常状况下,关系数据模型与对象模型之间有哪些匹配关系(多选) A)表对应类 B)记录对应对象 C)表的字段对应类的属性 D)表之间的参考关系对应类之间的依赖关系 (2)如下关于SessionFactory的说法哪些正确?(多选) A)对于每一个数据库事务,应该建立一个SessionFactory对象 B)一个SessionFactory对象对应一个数据库存储源。 C)SessionFactory是重量级的对象,不该该随意建立。若是系统中只有一个数据库存储源,只须要建立一个。 D)SessionFactory的load()方法用于加载持久化对象 (3)Customer类中有一个Set类型的orders属性,用来存放Order订单对象,在Customer.hbm.xml文件中,用哪一个元素映射orders属性? A) B) C) D) (4)元素有一个cascade属性,若是但愿Hibernate级联保存集合中的对象,casecade属性应该取什么值?(单选) A)none B)save C)delete D)save-update (5)如下哪些属于Session的方法? A)load() B)save() C)delete() D)update() E)open() F)close() (6)如下程序的打印结果是什么?(单选) tx = session.beginTransaction(); Customer c1=(Customer)session.load(Customer.class,new Long(1)); Customer c2=(Customer)session.load(Customer.class,new Long(1)); System.out.println(c1==c2); tx.commit(); session.close(); A)运行出错,抛出异常 B)打印false C)打印true (7)如下程序代码对Customer的name属性修改了两次: tx = session.beginTransaction(); Customer customer=(Customer)session.load(Customer.class, new Long(1)); customer.setName(\”Jack\”); customer.setName(\”Mike\”); tx.commit(); 执行以上程序,Hibernate须要向数据库提交几条update语句?(单选) A)0 B)1 C)2 D)3 (8)在持久化层,对象分为哪些状态?(多选) A)临时状态 B)独立状态 C)游离状态 D)持久化状态 (9)对于如下程序,Customer对象在第几行变为持久化状态?(单选) Customer customer=new Customer(); //line1 customer.setName(\”Tom\”); //line2 Session session1=sessionFactory.openSession(); //line3 Transaction tx1 = session1.beginTransaction(); //line4 session1.save(customer); //line4 tx1.commit(); //line5 session1.close(); //line6 A) line1 B)line2 C)line3 D)line4 E)line5 F)line6 (10)对于如下程序,Customer对象在第几行变为游离状态?(单选) Customer customer=new Customer(); //line1 customer.setName(\”Tom\”); //line2 Session session1=sessionFactory.openSession(); //line3 Transaction tx1 = session1.beginTransaction(); //line4 session1.save(customer); //line4 tx1.commit(); //line5 session1.close(); //line6 A) line1 B)line2 C)line3 D)line4 E)line5 F)line6 (11)如下哪种检索策略利用了外连结查询?(单选) A)当即检索 B)延迟检索 C)迫切左外连结检索 (12)假设对Customer类的orders集合采用延迟检索策略,编译或运行如下程序,会出现什么状况(单选) Session session=sessionFactory.openSession(); tx = session.beginTransaction(); Customer customer=(Customer)session.get(Customer.class,new Long(1)); tx.commit(); session.close(); Iterator orderIterator=customer.getOrders().iterator(); A)编译出错 B)编译经过,并正常运行 C)编译经过,但运行时抛出异常 (13)关于HQL与SQL,如下哪些说法正确?(多选) A)HQL与SQL没什么差异 B)HQL面向对象,而SQL操纵关系数据库 C)在HQL与SQL中,都包含select,insert,update,delete语句 D)HQL仅用于查询数据,不支持insert,update和delete语句 (14)事务隔离级别是由谁实现的?(单选) A)Java应用程序 B)Hibernate C)数据库系统 D)JDBC驱动程序 (15)悲观锁与乐观锁,哪一个具备较好的并发性能?(单选) A)悲观锁 B)乐观锁 答案: (1)A,B,C (2)B,C (3)A (4)D (5)A,B,C,D,F (6)C (7)B (8)A,C,D (9)D (10)F (11)C (12)C (13)B,D (14)C (15)B 1.strust的。 Action是否是线程安全的?若是不是 有什么方式能够保证Action的线程安全?若是是,说明缘由 2.MVC,分析一下struts是如何实现MVC的 3.struts中的几个关键对象的做用(说说几个关键对象的做用) 4.spring 说说AOP和IOC的概念以及在spring中是如何应用的 5.Hibernate有哪几种查询数据的方式 6.load()和get()的区别