天天看点

Hibernate4 (面向对象的数据库操作)

jpa,java persistance api,java持久层接口,即与数据库打交道的一些接口。实现交给各个厂商去实现。

orm,object/relation mapping,对象/关系数据库映射。面向对象的数据库操作,底层仍是sql语句。

hibernate的maven依赖。

hibernate是一个优秀的orm实现。使用方法见下。

名为hibernate.cfg.xml,一般放在src目录下。它使用c3p0作为数据库连接池。

指定配置文件位置

放在src/下面会打包进jar里面,不便修改,因此可放在jar外面,我们指定配置文件的位置。两个常用函数为:

configuration org.hibernate.cfg.configuration.configure(file

configfile)

以文件方式打开配置,默认当前路径为所执行jar的目录。当发布web应用时,可以将hibernate.cfg.xml放到web-inf/目录下,但在eclipse中调试时就不方便了。不过我们可以这么写:

configuration org.hibernate.cfg.configuration.configure(string

resource)

打进jar里面时,被当做资源看待。

@ javax.persistence.entity

表明这个类对应着数据库中某张表中的实体。

@javax.persistence.table

该注解的name属性标明java类与哪张表相对应。

@javax.persistence.id

标明这个字段是数据库表中的主键。

@ javax.persistence.generatedvalue

标明主键生成策略,与@id搭配使用。自增的话就是 @generatedvalue(strategy=generationtype.identity)。

@javax.persistence.column

该注解的name属性指定该字段与表中的哪一列相对应。默认是同名的相互匹配。若表中的列被不小心设成关键字,可以通过加双引号解决,hibernate帮你最后转换成 `desc`,见下:

@javax.persistence.temporal

数据库中时间类型比较多,赋值为temporaltype.timestamp表示时间戳。

@javax.persistence.transient

当某个pojo的字段不在表中的时候,可以加上这个注释,避免错误。若表中有的字段不在pojo中,似乎会有警告,但是不会抛异常。

@elementcollection(targetclass=string.class)

list<string> list=new arraylist<>();

//同样适用于map与数组。

@elementcollection(targetclass=float.class)

@mapkeycolumn(name="subject")

@mapkeyclass(string.class)

@column(name="grade")

map<string,float> scores=new hashmap<>();

@org.hibernate.annotations.generated

表明该字段是由数据库生成的。一个使用场景见下:

@javax.persistence.mappedsuperclass

这是一个很实用的注解。让子类继承父类的字段与注解。

org.hibernate.sessionfactory

通过此类获得session。一般地,一个程序只有一个sessionfactory的实例,可以从它获取多个session。session用过可关闭,sessionfactory不关闭,它的打开周期为整个程序生命周期。

void org.hibernate.sessionfactory.close() throws hibernateexception

销毁这个sessionfactory,释放一切连接池中的资源。

session org.hibernate.sessionfactory.opensession() 

打开一个org.hibernate.session,底层是jdbc connection。

connection org.hibernate.session.close()

用过后可以关闭session。

query  org.hibernate.sharedsessioncontract.createquery(string querystring)

用给定的hql语句创建一个query。

list org.hibernate.query.list()

将查询结果以list的形式返回。

int javax.persistence.query.executeupdate()

执行更新或删除操作,返回受影响的行数。

query org.hibernate.query.setparameter(int position, object val)

查询参数绑定,jdbc风格。

指pojo与表中的列的对应关系。

pojo字段不能多,若程序中实在要用就用@javax.persistence.temporal注解解决。

pojo字段少的话是不会报错的。

sqlquery org.hibernate.sharedsessioncontract.createsqlquery(string querystring)

执行原生sql语句。

object org.hibernate.query.uniqueresult()

返回执行结果的单一实例。当执行"select count(*) from table"时,就可以把此函数返回的object转换为int。

sqlquery org.hibernate.sqlquery.addscalar(string columnalias, type type)

指明所查的字段与类型。

org.hibernate.type.type

它是接口,实现类一般有org.hibernate.type.stringtype 等。由于传的是一个对象,所以一般用 org.hibernate.type.standardbasictypes.string这些常量。

当应用增加、修改持久化实体时,session并不会立即把这种变化同步到数据库,而是缓存到当前session的一级缓存中,除非显式调用session.flush()方法。否则等到session.close()时才会把这些改变一次性地同步到数据库中。这样做通过减少交互提高性能。

当批量添加实体时,可是多次flush(),避免一级缓存溢出。(hibernate难道就不会在快溢出时自己flush()么?)