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()么?)