Hibernate常见概念以及关键技术

Hibernate常见概念以及关键技术
Hibernate常见概念以及关键技术

软件开发的分层思想:

三层架构:

数据表现层业务逻辑层数据持久层

SUN的桌面应用Swing AWT 普通Java类JDBC

SUN的WEB基本应用JSP 普通Servlet JDBC

SUN的WEB高级应用JSF SessionBean Persistence

WEB国内流行开源Struts Spring Hibernate

一、对象持久化的理论

1.对象持久化:内存中的对象转存到外部持久设备上,在需要的时候还可以恢复。

2.对象持久化的原因(目标):// 是基础工作!是信息共享的主要原因

物理:1) 内存不能持久,需要在硬盘上持久保存//(物理上,物理的都不是根本原因)

2) 内存容量有限,需要在容量更大的硬盘上保存

应用:3) 共享(Internet的本质:信息的收集、整理、发布) //最重要的原因

4) 检索(大规模) //也很重要

5) 管理(备份、安全)

3.怎样进行对象持久化?(仅从JA V A方面讲)

物理:1) 对象序列化

2) DB技术(JDBC 数据库)

4.怎样利用数据库做对象持久化?

优点:功能完备、理论上效率高

缺点:复杂(难)、代码量大、面向R(过程;二维表关系)

2) EJB 仅讲Entity Bean

优点:封装JDBC

缺点:更复杂的API、重量级(侵入式)、功能不完备、难共享

缺点的后果:开发周期长、测试困难、面向过程

以上是2.0之前的版本,但3.0跟Hibernate基本一样

3) ORM 轻量级框架(Hibernate)

现阶段最佳的持久化工具:文档齐全、服务很好、工业标准、大量应用、易学

优点:封装JBDC、简单的API、轻量级(只做持久化)(用类库)、PO(持久对象)->POJO(纯JA V A)、开源

缺点:不够JDBC灵活

5.结论:

1)对象持久化是必须的

2)必须使用DB来实现

3)Hibernate必须的(现阶段最佳选择)

开源工具的通常问题:1.文档不全;2.服务不全;3.标准化不够

而Hibernate避免了所有这些问题

二、ORM和Hibernate的相关知识(理解)

1) ORM:Object Relational Mapping

对象-关系映射实现了面向对象世界中对象到关系数据库中的表的自动的(和透明的)持久化,

使用元数据(meta data)描述对象与数据库间的映射。

2) Hibernate是非常优秀、成熟的O/R Mapping框架。它提供了强大的对象和关系数据库映射以及查询功能。

规范:

1.一个映射文件对应一个持久类(一一对应)

2.映射文件的名字和它所描述的持久类的名字保持一致

3.映射文件应该与它所描述的类在同一包中

po -> (pojo)

-> oid(唯一,中性)

-> getters/setters

-> 构造方法

三、Hibernate核心API(理解)

Configuration类:

Configuration对象用于配置和启动Hibernate。Hibernate应用通过Configuration实例来指定对象-关系映射文

件的位置或者动态配置Hibernate的属性,然后创建SessionFactory实例。

SessionFactory接口:

一个SessionFactory实例对应一个数据存储源。应用从SessionFactory中获取Session 实例。

1)它是线程安全的,这意味着它的一个实例能够被应用的多个线程共享。

2)它是重量级的,这意味着不能随意创建或者销毁,一个数据库只对应一个SessionFactory。

通常构建SessionFactory是在某对象Bean的静态初始化代码块中进行。

如果应用只是访问一个数据库,只需创建一个SessionFactory实例,并且在应用初始化的时候创建该实例。

如果应用有同时访问多个数据库,则需为每个数据库创建一个单独的SessionFactory。

Session接口:

是Hibernate应用最广泛的接口。它提供了和持久化相关的操作,如添加,删除,更改,加载和查询对象。

1)它是线程不安全的,因此在设计软件架构时,应尽量避免多个线程共享一个Session实例。

2)Session实例是轻量级的,这意味着在程序可以经常创建和销毁Session对象,

例如为每个客户请求分配单独的Session实例。

原则:一个线程一个Session;一个事务一个Session。

Transaction接口:

是Hibernate的事务处理接口,它对底层的事务接口进行封装。

Query和Criteria接口:

这两个是Hibernate的查询接口,用于向数据库查询对象,以及控制执行查询的过程。

Query实例包装了一个HQL查询语句。

Criteria接口完全封装了基于字符串形式的查询语句,比Query接口更面向对象。Criteria更擅长于执行动态查询。

补充:find方法也提供数据查询功能,但只是执行一些简单的HQL查询语句的快捷方式(已过时),远没有Query接口强大!

四、Hibernate开发步骤:(重点:必须掌握)

开始:(设置环境变量和配置)

在myeclipse里导入Hibernate的文件包(包括各数据库的驱动和其他的jar包,对版本敏感,注意各版本的兼容)

按hibernate规范编写名字为hibernate.cfg.xml文件(默认放在工程文件夹下) 步骤一:设计和建立数据库表

可以用Hibernate直接生成映射表。

Oracle里建表:create table t_ad (oid number(15) primary key,

ACTNO varchar(20) not null unique,BALANCE number(20));

步骤二:持久化类的设计

POJO----

POJO 在Hibernate 语义中理解为数据库表所对应的Domain Object。(此类中只含有属性、构造方法、get/set方法)

这里的POJO就是所谓的“Plain Ordinary Java Object”,字面上来讲就是无格式普通Java 对象,

简单的可以理解为一个不包含逻辑代码的值对象(Value Object 简称VO)。

步骤三:持久化类和关系数据库的映射

编写*.hbm.xml文件

---该文件配置持久化类和数据库表之间的映射关系

discriminator-value=“discriminator_value”//区分不同子类的值,多态时使用。默认与类名一样

dynamic-update=“true | false”//是否动态更新SQL。false:每次都更新所有属性;true:只更新修改的

dynamic-insert=“true | false”//是否动态插入SQL。false:每次都插入所有属性;true:只插入非空的

select-before-update=“true | false”//是否在update前查询对象是否被修改过,修改过才update

polymorphism=“implicit | explicit”//设置多态是显性(explicit)的还是隐性(implicit)的

where=“查询时使用的SQL的条件子句”//查询时使用的SQL的条件子句

lazy=“true | false”//设置延迟加载策略

/>

一个实体对应一个xml文件,组件用id,非组件用property。

*.hbm.xml文件样板:

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"">

t_hi

hi

步骤四:Hibernate配置文件

hibernate.cfg.xml或hibernate.properties

1.需要配置那些信息:持久化映射,方言,特性,登陆信息

多数使用默认的设置。

A、dialect:方言,就是拼驱动程序和SQL语句。每种数据库对应一种方言。其实就是指定了用那一种数据库。

Oracle数据库方言:org.hibernate.dialect.OracleDialect

MySql数据库方言:org.hibernate.dialect.MySQLDialect

B、Object Persistence:对象持久化。把内存中的数据保存到一个永久的介质中,比如说数据库。

C、ORM:对象关系映射,是一个自动的过程

注:持久对象与临时对象最大的区别是有没有数据库id标识。

2.hibernate.cfg.xml的样板:

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"">

jdbc:mysql://localhost:3306/test

com.mysql.jdbc.Driver

root

password

update

true

name="cache.provider_class">org.hibernate.cache.EhCacheProvider

false

false

org.hibernate.dialect.MySQLDialect

mysql

1

thread

步骤五:使用Hibernate API

//读取Hibernate.cfg.xml配置文件,并读到内存中为后续操作作准备

Configuration config = new Configuration().configure();

//SessionFactory缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。

SessionFactory sessionFactory = config.buildSessionFactory();

//Session是持久层操作的基础,相当于JDBC中的Connection。

Session session = sessionFactory.openSession();

try{ //为保持事务的原子性,必须捕捉异常。所有事务都放在这一代码块里。

//操作事务时(增、删、改)必须显式的调用Transaction(默认:autoCommit=false)。

Transaction tx = session.beginTransaction();

for(int i=0; i<=1000; i++){

Student stu = new Student(...);

session.save(stu);//set value to stu

//批量更新:为防止内存不足,分成每20个一批发送过去。

if(i%20==0){session.flush();session.clear();}//不是大批量更新,则不需要写这一行

//默认时,会自动flush:查询之前、提交时。

} https://www.360docs.net/doc/5813714642.html,mit();//提交事务,Hibernate不喜欢抛异常,如有需要,自己捕捉。

//查询方法。如果有必要,也可以用事务(调用Transaction)

String hql = "from Student s where s.stuNo like ? and s.Sal > ?";//Student是类而不是表

List list = session.createQuery(hql)

.setString(0, "a00_").setDouble(1, 3000.0)//设置HQL的第一二个问号取值

.list();//Hibernate里面,没有返回值的都默认返回List StringBuffer sb = new StringBuffer();

for(Student st :(List)list){//(List)强制类型转换

sb.append(st.getOid()+" "+st.getName()+"\n");//拿到Student类里的属性

}System.out.print(sb.toString());//直接打印sb也可以,它也是调用toString,但这样写效率更高

} catch (HibernateException e) {

e.printStackTrace();

session.getTransaction().rollback();//如果事务不成功,则rollback

} finally {

session.close();//注意关闭顺序,session先关,Factory最后关(因为它可以启动多个session)

sessionFactory.close();//关闭SessionFactory,虽然这里没看到它,但在HbnUtil 里开启了。

}

五、Hibernate主键策略(上面的步骤三的一部分)

主键:在关系数据库中,主键用来标识记录并保证每条记录的唯一性(一般可保证全数据库唯一)。必须满足以下条件:

1)不允许为空。

2)不允许主键值重复。

3)主键值不允许改变。

1.自然主键:以有业务含义的字段为主键,称为自然主键。

优点:不用额外的字段。

缺点:当业务需求发生变化时,必须修改数据类型,修改表的主键,增加了维护数据库的难度。

2.代理主键:增加一个额外的没有任何业务含义的一般被命名为ID的字段作为主键。

缺点:增加了额外字段,占用部分存储空间。

优点:提高了数据库设计的灵活性。

Hibernate用对象标识(OID)来区分对象:

Student stu = (Student)session.load(Student.class,101); //这代码加载了OID为101的Student对象

Hibernate推荐使用代理主键,因此Hibernate的OID与代理主键对应,一般采用整数型,包括:short、int、long。

1、主键生成策略:(Hibernate支持多种主键生成策略)

generator节点中class属性的值:

1) assigned:assigned:由用户自定义ID,无需Hibernate或数据库参与。

元素没有指定时的默认生成策略。

2) hilo:通过hi/lo(高/低位)算法生成主键,需要另外建表保存主键生成的历史状态(这表只需要一个列和高位初始值)。

hi/lo算法产生的标识只在一个特定的DB中是唯一的。所有数据库都可用。

如果同一个数据库里多张表都需要用;可以建多张主键表,也可以共用同一字段,但最好是用同一张主键表的不同字段。

high_val

nextval

5

3) sequence:采用数据库提供的Sequence机制。

Oracle,DB2等数据库都提供序列发生器生成主键,Hibernate也提供支持。

序列名

4) seqhilo:功能同hilo,只是自动建表保存高位值。主键生成的历史状态保存在Sequence中。

只能用于Oracle等支持Sequence的数据库。

high_val_seq 5

5) increment:主键按数值顺序递增。

作用类型:long,short,int

使用场景:在没有其他进程同时往同一张表插数据时使用,在cluster下不能使用

6) indentity:采用数据库提供的主键生成机制。特点:递增。(Oracle不支持)

通常是对DB2,Mysql, MS Sql Server, Sybase, Hypersonic SQL(HSQL)内置的标识字段提供支持。

返回类型:long,short, int

注:使用MySql递增序列需要在数据库建表时对主健指定为auto_increment属性。用Hibernate建表则不需要写。

(oid int primary key auto_increment)

7) native:由Hibernate根据底层数据库自行判断采用indentity, hilo或sequence中的一种。

是最通用的实现,跨数据库时使用。Default.sequence为hibernate_sequence

8) foreign:由其他表的某字段作为主键,通常与联合使用;共享主健(主

键与外键),两id值一样。

car

9) UUID:

uuid.hex:由Hibernate基于128位唯一值产生算法生成十六进制数(长度为32的字符串---使用了IP地址)。

uuid.string:与uuid.hex一样,但是生成16位未编码的字符串,在PostgreSQL等数据库中会出错。

特点:全球唯一;ID是字符串。

10)select:通过DB触发器(trigger)选择一些唯一主键的行,返回主键值来分配主键

11)sequence-identity:特别的序列发生策略,使用DB序列来生成值,通常与JDBC3的getGenneratedKeys一起用,

使得在执行insert时就返回生成的值。Oracle 10g(支持JDK1.4)驱动支持这一策略。

2、复合主键策略

步骤一:创建数据库表,设定联合主键约束

步骤二:编写主持久化类以及主键类;编写主键类时,必须满足以下要求:

1)实现Serializable接口

2)覆盖equals和hashCode方法

3)属性必须包含主键的所有字段

步骤三:编写*.hbm.xml配置文件

六、Hibernate的查询方案(应该熟悉各种查询的使用方法)

1、利用Session接口提供的load方法或者get方法

2、Hibernate提供的主要查询方法

1)Criteria Query(条件查询)的步骤:

(1)通过Session来创建条件查询对象Criteria

Criteria criteria = session.createCriteria(Course.class);

(2)构建条件---创建查询条件对象Criterion

Criterion criterion1 = Property.forName("id").ge(39);//通过Property来创建

Criterion criterion2 = Restrictions.le("cycle", 5); //通过Restrictions来创建

(3)查询对象关联条件

criteria.add(criterion1);

(4)执行条件查询

List courses = criteria.list();

2)HQL(Hibernate Qurey Language)

特点:语法上与SQL类似;完全面向对象的查询;支持继承、多态、关联

(1) FROM子句

例如:查询所有的学生实例

Query query=session.createQuery("from Student"); query.list();

(2) SELECT子句

选择哪些对象和属性返回到结果集

A、SELECT语句后可以跟多个任意类型的属性,返回结果保存在Object类型的数组中

//A、B、C、都是查询学生的姓名和年龄

Query query=session.createQuery("select https://www.360docs.net/doc/5813714642.html,,stu.age from Student as stu");

List os=query.list();//返回的Object数组中有两个元素,第一个是姓名,第二个是年龄

B、SELECT语句后可以跟多个任意类型的属性,返回结果也可以保存在List中

Query query=session.createQuery

("select new List(https://www.360docs.net/doc/5813714642.html,,stu.age) from Student as stu");

List lists=query.list();

C、SELECT语句后可以跟多个任意类型的属性,返回结果也可以是一个类型安全的POJO对象

Query query=session.createQuery

("select new Student(https://www.360docs.net/doc/5813714642.html,,stu.age) from Student as stu");

List stuList=query.list();//注意:Student类必须有Student(String,int)的构造方法

D、SELECT子句中可以使用聚集函数、数学操作符、连接

支持的聚集函数:avg、sum、min、max、count ….

(3) WHERE子句,限制返回结果集的范围

(4) ORDER BY子句,对返回结果集进行排序

3)Native SQL(原生SQL查询)

可移植性差:资源层如果采用了不同的数据库产品,需要修改代码---非不得已,不推荐使用

步骤一:调用Session接口上的createSQLQuery(String sql)方法,返回SQLQuery

步骤二:在SQLQuery对象上调用addEntity(Class pojoClass) //设置查询返回的实体

例如:SQLQuery query =session.createSQLQuery(“select * from student limit 2,10”)

query.addEntity(Student.class);

List stuList=query.list();

七、Hibernate对象的状态

实体对象的三种状态:

1) 暂态(瞬时态)(Transient)---实体在内存中的自由存在,它与数据库的记录无关。

po在DB中无记录(无副本),po和session无关(手工管理同步)

如:Customer customer = new Customer(); customer.setName("eric");

这里的customer对象与数据库中的数据没有任何关联

2) 持久态(Persistent)---实体对象处于Hibernate框架的管理中。

po在DB中有记录,和session有关(session自动管理同步)

3)游离态(脱管态)(Detached)

处于Persistent状态的实体对象,其对应的Session实例关闭之后,那么,此对象处于Detached状态。

po在DB中有记录,和session无关(手工管理同步)

无名态:po处于游离态时被垃圾回收了。没有正本,只有DB中的副本。

po处于暂态时被垃圾回收了,则死亡。(唯一可以死亡的状态)

实质上,这三个状态是:持久对象的正副本与同步的关系

原则:尽量使用持久态。

暂态--->持久态

A.调用Session接口上的get()、load()方法

B.调用Session接口上的save()、saveOrUpdate()方法

持久态--->暂态

delete();

游离态--->持久态

update()、saveOrUpdate()、lock();

(lock不建议用,危险;肯定没变化时用,有则用updata)

持久态--->游离态

evict()、close()、clear()

(一般用evict,只关闭一个实体的连接;close关闭整个连接,动作太大)

八、映射(重点掌握和理解,注意配置的细节)

关联关系:A有可能使用B,则AB之间有关联关系(Java里指A有B的引用)。

双边关系、传递性、方向性、名称、角色(权限)、数量(1:1;1:m;n:m)、关联强度

委托:整体跟部分之间是同一类型。代理:整体跟部分之间不是同一类型。

A. 单一实体映射:最简单、基本映射(最重要);任何其他映射种类的基础。

原则:1.类->表;一个类对应一个表。

2.属性->字段:普通属性、Oid;一个属性对应一个字段。

B. 实体关系映射:

a.关联关系映射:(最难、量最多)

1.基数关系映射:

一对一(one to one) (共享主键、唯一外键)

一对多(one to many) (1:m) 作级联,删one后连着删many

多对一(many to one) (m:1) 不作级联,删many中一个,不删one

多对多(many to many)(n:m = 1:n + m:1)

2.组件关系映射:(一个类作为另一个类的零件,从属于另一个类,没有自己的XML)

单一组件关系映射

集合组件关系映射

b.继承关系映射:(最普遍。两个类有继承关系,在本质上他们就是一对一关系。共享主健。)

有三种映射方案:

1.一个类一个表(效率很低;最后考虑使用,一般是数据量较大和父子类重复字段不多的时候用)

只有当子类中的属性过多时才考虑每个类建一个表的策略。

2.一个实体一个表(多表查询效率低,不考虑多态时用)

不考虑多态时,最好是用只针对具体类建表,而考虑多态时尽量使用所有类建一个表

3.所有类一个表(查询效率最高,结构简单;字段数不超过100个时使用,首选)

c.集合映射(值类型)

Set 不重复、无顺序

List 可重复、有顺序

Map

Bag 可重复、无顺序(bag本身也是list实现的)

双向关联(Bidirectional associations)(相当于两个单向关联)

单向关联(Unidirectional associations)

"一"方的配置:

"多"方的配置:

name="customer"

class="many_to_one.vo.Customer"

column="customer_id"

not-null="true"

cascade="save-update"

/>

cascade属性:设定级联操作(插入、修改、删除)。

cascad属性值描述

-------------------------------------------------------------------------

none 保存、更新或删除当前对象时,忽略其他关联对象,默认属性

save-update 通过Session的save()、update()以及saveOrUpdate()方法来保持、更新当前对象时级联

所有关联的新建对象,并且级联更新所有有关联的游离对象delete 当通过Session的delete()方法来删除当前对象时,级联删除所有关联对象

all 包含所有的save-update以及delete行为

delete-orphan 删除所有和当前对象解除关联关系的对象

all-delete-orphan 包含all与delete-orphan的动作

inverse属性:表示是否将当前属性的值的变化反映到数据库中去。

false --- 表示反映到数据库中

true ---表示不反映到数据库中

Set的lazy属性:

A.不设置lazy值,默认true 现象:查询Customer时,不会主动查询关联表Orders(SQL语句)

B.设置lazy=false 现象:出现查询Orders表的SQL语句

3、多对多

默认情况下,由两方共同维护关联关系。也就是两个对象关联属性的值的改变都会反映到数据库中。

九、Hibernate控制的事务

事务保证原子操作的不可分,也就是操作的同时成功或同时失败。

hibernate的事务隔离级别和JDBC中大致相同。

设置时要在hibernate.cfg.xml配置

4

1:读未提交的数据(Read uncommitted isolation) 脏读

2:读已提交的数据(Read committed isolation) 不可重复读

4:可重复读级别(Repeatable read isolation) 幻读

8:可串行化级别(Serializable isolation)

hibernate的锁(悲观锁,乐观锁)

1.悲观锁是由数据库本身所实现的,会对数据库中的数据进行锁定,也就是锁行。(更新期间不许其他人更改)

LockMode.UPGRADE,修改锁,在get()方法中加上这个设置作为第三个参数。

LockMode.NONE 无锁机制

LockMode.READ 读取锁

LockMode.WRITE 写入锁,不能在程序中直接使用

还可以使用Session.lock() Query.setLockMode() Criteria.setLockMode()方法来设置锁,

检测版本号,一旦版本号被改动则报异常。

2.乐观锁,也就是通过对记录加上某些信息来解决并发访问的问题。(认为更新期间

不会有其他更改)

版本检查;要在其表中多加上一列表示版本信息,会在读取时读到这个版本号,并在修改之后更新这个版本号;

更新瞬间加锁,并且只有版本号相同才会予以更新,如果版本号不同,就会抛出例外。

Java工程师面试题(三大框架)

Java工程师(程序员)面试题 Struts,Spring,Hibernate三大框架的面试 1.Hibernate工作原理及为什么要用? 原理:1.读取并解析配置文件2.读取并解析映射信息,创建SessionFactory 3.打开Session 4.创建事务Transation 5.持久化操作6.提交事务7.关闭Session 8.关闭SesstionFactory 为什么要用:1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 2.Hibernate是如何延迟加载? 1. Hibernate2延迟加载实现:a)实体对象b)集合(Collection) 2. Hibernate3 提供了属性的延迟加载功能当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 3.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many 4.Struts1流程: 1、客户端浏览器发出HTTP请求。 2、根据web.xml配置,该请求被ActionServlet接收。 3、根据struts-config.xml配置,ActionServlet先将请求中的参数填充到ActionForm中,然后ActionServlet再将请求发送到Action 进行处理。 4、是否验证,需要验证则调用ActionForm 的validate方法,验证失败则跳转到input,成功则继续。 5、Action从ActionForm获得数据,调用javabean 中的业务方法处理数据。 6、Action返回ActionForward对象,跳转到相应JSP 页面或Action。 7、返回HTTP响应到客户端浏览器。 MVC设计模式:modal:“模型”也称业务逻辑,是正真完成任务的代码,相当与JavaBeanview:视图,其实就是显示界面,相当于JSPcontroller:控制器,他控制模型和视图的交互过程,相当于servletstruts1是基于MVC设计模式hibernate是基于ORM对象关系映射 5.struts是什么? struts1是基于JSP和servlet的一个开源的Web应用框架,使用的是MVC的设计模式struts2是基于webwork技术的框架,是sun和webwork公司联手开发的一个功能非常齐全的框架,struts2和struts1没有任何关系,是一个全新的框架 6.spring是什么? spring是一个集成了许多第三方框架的大杂烩,其核心技术是IOC(控制反转,也称依赖注

Spring+hibernate

课程内容 1.面向接口(抽象)编程的概念与好处 2.IOC/DI的概念与好处 a)inversion of control b)dependency injection 3.AOP的概念与好处 4.Spring简介 5.Spring应用IOC/DI(重要) a)xml b)annotation 6.Spring应用AOP(重要) a)xml b)annotation 7.Struts2.1.6 + Spring2.5.6 + Hibernate3.3.2整合(重要) a)opensessionInviewfilter(记住,解决什么问题,怎么解决) 8.Spring JDBC 面向接口编程(面向抽象编程) 1.场景:用户添加 2.Spring_0100_AbstractOrientedProgramming a)不是AOP:Aspect Oriented Programming 3.好处:灵活 什么是IOC(DI),有什么好处Dependecy Injection (依赖注入)依赖UserDAO a)IOC (inversion of control)控制反转,交给容器来控制 1.把自己new的东西改为由容器提供 a)初始化具体值 b)装配 2.好处:灵活装配 Spring简介 1.项目名称:Spring_0200_IOC_Introduction

2.环境搭建 a)只用IOC i.spring.jar , jarkata-commons/commons-loggin.jar 3.IOC容器 a)实例化具体bean b)动态装配 4.AOP支持 a)安全检查 b)管理transaction Spring IOC配置与应用 1.FAQ:不给提示: a)window – preferences – myeclipse – xml – xml catalog b)User Specified Entries – add i.Location: D:\share\0900_Spring\soft\spring-framework-2.5.6\dist\resources\sprin g-beans-2.5.xsd ii.URI: file:///D:/share/0900_Spring/soft/spring-framework-2.5.6/dist/resource s/spring-beans-2.5.xsd iii.Key Type: Schema Location iv.Key: https://www.360docs.net/doc/5813714642.html,/schema/beans/spring-beans-2.5.xsd 2.注入类型 a)Spring_0300_IOC_Injection_Type b)setter(重要) c)构造方法(可以忘记) d)接口注入(可以忘记) 3.id vs. name a)Spring_0400_IOC_Id_Name b)name可以用特殊字符 4.简单属性的注入 a)Spring_0500_IOC_SimpleProperty b) 5.

hibernate面试题

1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory 为什么要用: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。 2.Hibernate是如何延迟加载? 1. Hibernate2延迟加载实现:a)实体对象b)集合(Collection) 2. Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。 3.Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、 4.说下Hibernate的缓存机制 1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存 2. 二级缓存: a) 应用及缓存 b) 分布式缓存 条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据 c) 第三方缓存的实现

hibernate注解说明文档

* hibernate注释说明: * @Entity——将一个类声明为一个实体bean(即一个持久化POJO 类) * @Id——注解声明了该实体bean的标识属性(对应表中的主 键)。 * @Table——注解声明了该实体bean映射指定的表(table),目录(catalog)和schema的名字 * @Column——注解声明了属性到列的映射。该注解有如下的属 性 * name 可选,列名(默认值是属性名) * unique 可选,是否在该列上设置唯一约束(默认值false) * nullable 可选,是否设置该列的值可以为空(默认值false) * insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true) * updatable 可选,该列是否作为生成的update语句中的一个列(默认值true) * columnDefinition 可选,为这个特定列覆盖sql ddl片段(这可能导致无法在不同数据库间移植) * table 可选,定义对应的表(默认为主表) * length 可选,列长度(默认值255) * precision 可选,列十进制精度(decimal precision)(默认值 0) * scale 可选,如果列十进制数值范围(decimal scale)可用,在此设置(默认值0) * @GeneratedValue——注解声明了主键的生成策略。该注解有如下属性

* strategy 指定生成的策略(JPA定义的),这是一个GenerationType。 默认是GenerationType. AUTO * GenerationType.AUTO 主键由程序控制 * GenerationType.TABLE 使用一个特定的数据库表格来保存主键 * GenerationType.IDENTITY 主键由数据库自动生成(主要是自动增长类型) * GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列。(这个值要与generator一起使用) * generator 指定生成主键使用的生成器(可能是orcale中的序 列)。 * @SequenceGenerator——注解声明了一个数据库序列。该注解有如下属性 * name 表示该表主键生成策略名称,它被引用在@GeneratedValue中设置的“gernerator”值中 * sequenceName 表示生成策略用到的数据库序列名称。 * initialValue 表示主键初始值,默认为0. * allocationSize 每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50. * @GenericGenerator——注解声明了一个hibernate的主键生成策略。 支持十三种策略。该注解有如下属性 * name 指定生成器名称 * strategy 指定具体生成器的类名(指定生成策略)。 * parameters 得到strategy指定的具体生成器所用到的参数。 * 其十三种策略(strategy属性的值)如下: * 1.native 对于orcale采用Sequence方式,对于MySQL和 SQL Server采用identity(处境主键生成机制),

各公司Java面试题汇总

各公司Java面试题汇总 ★ 表 A 字段m ,n ,x ,y ,其中m,n 为number 类型,x 为字符类型,y 为日期类型 1 、创建表A 并且m 不能重复,n 初始值为0 ,m 、n 、y 不能为空 2 、修改表A 把n 的初始化值改为1 3 、查询表A 中m 大于500 并且y 为前一天的当前时间以前的所有数据 4 、查询表A 中x 字段共有多少种情况,并输出条数大于200 的情况的个数 5 、查询表A 中x 为空并且时间介于当前时间与前一天当前时间的所有数据 6 、往表A 中插入一条数据,令n 值为3,x 值为"xyz",y 值为200 7 年1 月1 日12 点12 分12 秒 7 、删除表A 中所有时间为整点的数据 8 、表B 与表A 有相同的数据结构,怎么样把表A 中的数据倒入表B 中 9 、数据库的锁,概念,形成原因,你所见过的所有数据库中的锁,锁的解决方案? -------------------------------------------------------------------------------------------------------------------- 1 、把“ ab ”“ ef ”“ ij ”“ cd ”“ gh ”放到List 里,然后对此List 快速排序,并打印结果 2 、表File 中有2 个字段file,vcFile,file 为1 的所相关的vcFile 的信息,用jdbc 连接数据库,并打印查询结果的第三条 4 、corba 对象里有一个void corbaPing() 怎样通过返回的一个空对象判断其状态? 5 、corb 中的COS 三种实现。 6 、WTS 的几种实现形, 文字描述即可,无需写代码。 7 、纯java 技术能否实现jmcp 协议? ----------------------------精品word文档值得下载值得拥有----------------------------------------------

javaWeb面试题(含答案)讲课讲稿

10、Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得java程序员可以随心所欲的使用对象编程思维来操纵数据库。 工作原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory 优点有: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3、 Hibernate使用Java反射机制而不是字节码增强程序来实现透明性。 4、 Hibernate的性能好,映射的灵活性比较出色。它支持各种关系数据库,从一对一到多 对多的各种复杂关系。 11、hibernate的核心类是什么??重要方法是什么?? Configuration、SessionFactory Session如下方法 Save、 load、 Update、Delete Query q=CreateQuery(“from Customer where customerName=:customerName”) beginTransaction、close、Transaction、Commit() 12、session.load()和session.get()的区别 Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:

马士兵hibernate文档 (个人完善版)

3. hibernate.hbm2ddl.auto : 在SessionFactory 创建时,自动检查数据库结构,或者将数据库schema 的DDL 导出到数据库。使用create-drop 时,在显式关闭SessionFactory 时,将删除掉数据库schema。 例如:validate | update | create | create-drop create :如果没有表就创建 update :如果表结构更新,就更新 validate :每次插入表的时候看看表结构有没有更新。 理论上是先建类后建表:这个时候只要你的类建好了,可以跨数据库。 实际中先建表比先建类多,建好表以后要对数据库进行优化,比如建索引,建试图,各种各样的优化。 project\etc目录下面有很多示例性的文档,log4j的文档就在那个下面。 SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); SessionFactory的建立是很耗费时间的,应该像连接池一样,只建立一次,以后要用就直接从那用。 Hibernate文档建议我们自己写一个辅助类,用单例来做。 JUnit的一个bug: @BeforeClass public static void beforeClass() { sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } 在这句话的时候 配置文件如果有的时候写错了,她悄悄把错误隐藏起来了。 解决的方法:可以对这句话加try catch块 8.表名和类名不一致的时候: @Entity @Table(name="_teacher")

6文思海辉JAVA面试问题

电话面试 1、hibernate怎么配置的,lazy和list怎么设置 2、JDBC怎么用的,有那几部,具体的方式? 3、文件的读写,步骤和具体实现代码? 4、你用的排序方式有哪些,说出你最擅长的一种排序方式? 5、xml解析方式,schema Xml的解析方式有哪几种,怎么实现解析的? 6、private,protect,default,public权限修饰符是怎么设置权限的? 7、平时你关注java的那些技术? 8、Static 9、Throws throw区别 10、Jsp servlet区别 Jsp本质上就是一个severlet jsp可能更注重前台显示而severlet则是控制 Jsp有自己的内置对象severlet没有 Jsp运行速度没有severlet快 Jsp中有htnl的代码,而severlet只是java代码 11、log4j实现 12、Hibernate or配置 13、Class.forName作用,为什么用? 14、SAX与DOM的区别 视频面试整理 1、一种排序,写出来一共排序了多少次 2、说一下Hibernate 3、如果没有Hibernate你怎么实现这样的功能?并封装成实体类 4、SAX和DOM的区别 5、事物 6、是否用过集合类 7、Set和List的区别 8、线程 9、Insert update create表 10、前台滚动条是如何实现的 11、前台滚动条,比如两个客户端,一个收到90条,一个收到91条,怎样保证两个客户下一个取到的值分别是91条和92条。 12、如果没有ssh是否能写功能 13、IO 15、JS怎样实现5秒一刷新功能 16、SWING APPLET

hibernate_annotation

Hibernate Annotation 使用hibernate Annotation来映射实体 准备工作 下载 hibernate-distribution-3.3.2.GA hibernate-annotations-3.4.0.GA slf4j 导入相关依赖包 Hibernate HOME: \hibernate3.jar \lib\bytecode(二进制) \lib\optional(可选的) \lib\required(必须的) 导入required下的所有jar包 antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar hibernate3.jar javassist-3.9.0.GA.jar jta-1.1.jar slf4j-api-1.5.10.jar slf4j-log4j12-1.5.10.jar log4j-1.2.14.jar mysql.jar ---Annotation包 ejb3-persistence.jar hibernate-annotations.jar hibernate-commons-annotations.jar

简单的例子,通过annotation注解来映射实体PO 1、建立(Java Project)项目:hibernate_0100_annotation_HelloWorld_default 2、在项目根下建立lib目录 a)导入相关依赖jar包 antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar ejb3-persistence.jar hibernate-annotations.jar hibernate-commons-annotations.jar hibernate3.jar javassist-3.9.0.GA.jar jta-1.1.jar log4j-1.2.14.jar mysql.jar slf4j-api-1.5.10.jar slf4j-log4j12-1.5.10.jar 3、建立PO持久化类cn.serup.model.Teacher 内容如下 package cn.serup.model; import javax.persistence.Entity; import javax.persistence.Id; //@Entity表示该是实体类 @Entity public class Teacher { private int id ; private String username ; private String password ; //ID为主键,主键手动分配 @Id public int getId() { return id; } public void setId(int id) { this.id = id;

JAVA面试题解惑系列(二)——到底创建了几个String对象-JAVA程序员JAVA工程师面试必看

-JAVA程序员JAVA工程师面试必看 JAVA面试题解惑系列(二)——到底创建了几个String对象? 关键字: java 面试题 string 创建几个对象 作者:臧圩人(zangweiren) 网址:https://www.360docs.net/doc/5813714642.html, >>>转载请注明出处!<<< 我们首先来看一段代码: Java代码 1.String str=new String("abc"); 紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢?相信大家对这道题并不陌生,答案也是众所周知的,2个。接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA知识。 我们可以把上面这行代码分成String str、=、"abc"和new String()四部分来看待。String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给它,显然也没有创建对象;现在只剩下new String("abc")了。那么,new String("abc")为什么又能被看成"abc"和new String()呢?我们来看一下被我们调用了的String的构造器: Java代码 1.public String(String original) { 2. //other code ... 3.} 大家都知道,我们常用的创建一个类的实例(对象)的方法有以下两种: 1.使用new创建对象。 2.调用Class类的newInstance方法,利用反射机制创建对象。 我们正是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了str变量。同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是"abc"。由此我们又要引入另外一种创建String对象的方式的讨论——引号内包含文本。 这种方式是String特有的,并且它与new的方式存在很大区别。 Java代码 1.String str="abc"; 毫无疑问,这行代码创建了一个String对象。 Java代码 1.String a="abc"; 2.String b="abc";

hibernate关联注解

说明: 本文对hibernate的一对多、多对一、多对多的关联 示例代码是Order类和OrderItem类的一对多的关系 1.一对多 1.1注解方式: @OneToMany 代码示例如下: 双向关联,维护端在“多”的一端 Public class Order implements Serializable { Private Set orderItems = new HashSet(); @OneToMany(mappedBy="order"(有了mappedby不能也不该在此再定义@joincolumn),cascade = CascadeType.ALL, fetch = https://www.360docs.net/doc/5813714642.html,ZY) @OrderBy(value= "id ASC") public Set getOrderItems() { return orderItems; } } 单向关联,维护端在此端 Public class Order implements Serializable { private Set orderItems = new HashSet(); @OneToMany(cascade = CascadeType.ALL, fetch = https://www.360docs.net/doc/5813714642.html,ZY) @JoinColumn(name=”order_id”) @OrderBy(value= "id ASC") public Set getOrderItems() { return orderItems; } } 1.2维护端和级联问题 维护端的意思是对外键进行维护,维护端有对外键进行插入和更新的权利。 下面分情况介绍hibernate的级联操作: 1.2.1单向关联 对“一”表进行插入一条记录的操作: 1)级联类型:CascadeType.ALL 执行语句: 1.insert into category (description, name, id) values(?, ?, ?)

java高级工程师面试题及答案完整版

j a v a高级工程师面试题 及答案 集团标准化办公室:[VV986T-J682P28-JP266L8-68PNN]

一:选择题 1. 关于以下程序代码的说明正确的是( D ) 1.class HasStatic{ 2. private static int x=100; 3. public static void main(String args[ ]){ 4. HasStatic hs1=new HasStatic( ); 5. hs1.x++; 6. HasStatic hs2=new HasStatic( ); 7. hs2.x++; 8. hs1=new HasStatic( ); 9. hs1.x++; 10. HasStatic.x- -; 11. (“x=”+x); 12. } 13. } A、 5行不能通过编译,因为引用了私有静态变量 B、 10行不能通过编译,因为x是私有静态变量 C、程序通过编译,输出结果为:x=103 D、程序通过编译,输出结果为:x=102 2. 下列关于for循环和while循环的说法中哪个是正确的( B ) A.while循环能实现的操作,for循环也都能实现 B.while循环判断条件一般是程序结果,for循环判断条件一般是非程序结果C.两种循环任何时候都可替换 D.两种循环结构中都必须有循环体,循环体不能为空 3. 以下选项中循环结构合法的是( C ) A、while (int i<7) { i++; (“i is “+i); } B、 int j=3; while(j) { (“ j is “+j); } C、int j=0; for(int k=0; j + k !=10; j++,k++) { (“ j is “+ j + “k is”+ k); } D、 int j=0; do{ ( “j is “+j++); if (j = = 3) {continue loop;} }while (j<10); 4. 给出下面代码段, 哪行将引起一个编译时错误( D ) 1) public class Test {

Struts2+Spring+Hibernate的工作流程及原理(整理的)

Struts2框架 一、简介 Struts2是一个相当强大的Java Web开源框架,是一个基于POJO的Action 的MVC Web框架。它基于当年的WebWork和XWork框架,继承其优点,同时做了相当的改进。 1、Struts2基于MVC架构,框架结构清晰,开发流程一目了然,开发人员可 以很好的掌控开发的过程。 2、使用OGNL进行参数传递。OGNL提供了在Struts2里访问各种作用域的 数据的简单方式,你可以方便的获取Request、Attribute、Application、 Session、Parameters中的数据。大大简化了开发人员在获取这些数据是的 代码量。 3、强大的拦截器。Struts2的拦截器是一个Action级别的AOP,Struts2中的 许多特性都是通过拦截器来实现的,例如异常处理、文件上传、验证等。 拦截器是可配置与重用的,可以将一些通用的功能如:登录验证、权限 验证等置于拦截器中以完成了系统中的权限验证功能。 4、易于测试。Struts2的Action都是简单的POJO,这样可以方便的对Struts2 的Action编写测试用例,大大方便了Java Web项目的测试。 5、易于扩展的插件机制。在Struts2添加扩展是一件愉快而轻松的事情,只 需要将所需要的Jar包放到WEB-INF/lib文件中,在Struts.xml中做一些 简单的设置就可以实现扩展。 6、模块化管理。Struts2已经把模块化作为了体系架构中的基本思想,可以 通过三种方法来将应用程序模块化:将配置信息拆分成多个文件把自包 含的应用模块创建为插件创建的框架特性,即将于特定应用无关的新功 能组织成插件,以添加到多个应用中去。 7、全局结果与声明式异常。为应用程序添加全局的Result,和在配置文件中 对异常进行处理,这样当处理过程中出现指定异常时,可以跳转到特定 页面。 二、Struts2的工作机制 在Struts2框架中的处理大概分为: 1、客户端初始化一个指向Servlet容器(如Tomcat)的请求; 2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做 ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框 架的集成很有帮组,例如:SiteMeshPlugin); 3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定 这个请求是否需要调用某个Action; 4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的 处理交给ActionProxy; 5、ActionProcy通过Configuration Manager询问框架的配置文件,找到需要 调用的Action类; 6、ActionProxy创建一个ActionInvocation实例。 7、ActionInvocation实例使用命令模式来调用,在调用Action的过程前后,

SSM面试题

Mybatis常见面试题(转) 1、#{}和${}的区别是什么? 注:这道题是面试官面试我同事的。 答:${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc.Driver。#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的?号占位符设置参数值,比如ps.setInt(0, parameterValue),#{https://www.360docs.net/doc/5813714642.html,}的取值方式为使用反射从参数对象中获取item对象的name属性值,相当于 param.getItem().getName()。 2、Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签? 注:这道题是京东面试官面试我时问的。 答:还有很多其他的标签,,加上动态sql的9个标签, trim|where|set|foreach|if|choose|when|otherwise|bind等,其中为sql片段标签,通过标签引入sql片段,为不支持自增的主键生成策略标签。 3、最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗? 注:这道题也是京东面试官面试我时问的。 答:Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement,举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个