Hibernate4 (面向对象的数据库操作)
2015-06-22 15:51
351 查看
JPA,java persistance api,java持久层接口,即与数据库打交道的一些接口。实现交给各个厂商去实现。
ORM,Object/Relation Mapping,对象/关系数据库映射。面向对象的数据库操作,底层仍是sql语句。
Hibernate是一个优秀的ORM实现。使用方法见下。
表明这个类对应着数据库中某张表中的实体。
@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的字段不在表中的时候,可以加上这个注释,避免错误。
@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<>();
@javax.persistence.MappedSuperclass
这是一个很实用的注解。让子类继承父类的字段与注解。
通过此类获得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字段不能多,若程序中实在要用就用@javax.persistence.Temporal注解解决。
pojo字段少的话是不会报错的。
执行原生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这些常量。
当批量添加实体时,可是多次flush(),避免一级缓存溢出。(hibernate难道就不会在快溢出时自己flush()么?)
ORM,Object/Relation Mapping,对象/关系数据库映射。面向对象的数据库操作,底层仍是sql语句。
获得
hibernate的maven依赖。<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.31</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.10.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version>4.3.10.Final</version> </dependency> </dependencies>
Hibernate是一个优秀的ORM实现。使用方法见下。
配置文件
名为hibernate.cfg.xml,一般放在src目录下。它使用c3p0作为数据库连接池。<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <!--表明以下的配置是针对session-factory配置的,SessionFactory是Hibernate中的一个类,这个类主要负责保存HIbernate的配置信息,以及对Session的操作 --> <session-factory> <property name="connection.driver_class">com.mysql.jdbc.Driver </property> <property name="connection.url">jdbc:mysql://me.likeyichu.com:3306/AliyunDB</property> <property name="Connection.useUnicode">true </property> <property name="connection.characterEncoding">utf-8</property> <property name="connection.username">root</property> <property name="connection.password">abcdefg</property> <!-- c3p0 --> <!-- 必填,不然有关c3p0的配置都不嫩生效 --> <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <property name="hibernate.c3p0.max_size">20</property> <property name="hibernate.c3p0.min_size">10</property> <!-- 对应DBServer端的wait_timeout,即一个connection连续n小时不活动就收回,mysql默认是8小时。此处的值小于服务端的值即可 --> <property name="hibernate.c3p0.timeout">1000</property> <property name="hibernate.c3p0.max_statements">100</property> <property name="hibernate.c3p0.idle_test_period">50</property> <property name="hibernate.c3p0.validate">true</property> <property name="hibernate.c3p0.acquire_increment">2</property> <!-- 每次从连接池中拿connection时,是否验证 --> <property name="hibernate.c3p0.testConnectionOnCheckout">true</property> <!--是否在后台显示Hibernate用到的SQL语句,开发时设置为true,便于查错,程序运行时可以在Eclipse的控制台显示Hibernate的执行Sql语句。项目部署后可以设置为false,提高运行效率 --> <property name="hibernate.show_sql">true </property> <!--hibernate.dialect 只是Hibernate使用的数据库方言,就是要用Hibernate连接那种类型的数据库服务器。 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect </property> <!--指定映射的类 --> <mapping class="com.likeyichu.webservice.resource.me.Student" /> <mapping class="com.likeyichu.webservice.me.bean.GaoKaoScoreBean" /> <mapping class="com.likeyichu.webservice.me.bean.IPBean" /> </session-factory> </hibernate-configuration>
常用注解
@ 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`,见下:
@Column(name = "\"desc\"") public String desc ;
@javax.persistence.Temporal
数据库中时间类型比较多,赋值为TemporalType.TIMESTAMP表示时间戳。
@javax.persistence.Transient
当某个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<>();
@javax.persistence.MappedSuperclass
这是一个很实用的注解。让子类继承父类的字段与注解。
//使用情景:两个pojo,都有自增主键id,都有是否删除的标志位isDeleted。 //那么就可以定义父类 import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.MappedSuperclass; @MappedSuperclass public abstract class AbstractPojo { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) public int id; public boolean del; } //然后定义子类 import javax.persistence.Entity; import javax.persistence.Table; @Entity @Table(name="cep_channel") public class ChannelPojo extends AbstractPojo{ public String name; public String displayName; public String description; public String where_clause; }
常用方法
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字段少的话是不会报错的。
原生sql
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的一级缓存中,除非显式调用session.flush()方法。否则等到session.close()时才会把这些改变一次性地同步到数据库中。这样做通过减少交互提高性能。当批量添加实体时,可是多次flush(),避免一级缓存溢出。(hibernate难道就不会在快溢出时自己flush()么?)
代码示例
原生查询示例
相关文章推荐
- 安装、设置与启动MySql绿色版的方法
- sql学习笔记(22)-----------mysql存储过程详解
- pl/sql编程基础
- 探索MySQL高可用架构之MHA(1)
- hostname 的更改 Oracle Linux 6.5 && RHEL 7.0
- mongodb 学习笔记 03 -- 查询表达式
- Redis同步机制
- sql学习笔记(21)-----------触发器
- redis调整内核参数
- pl/sql自学总结
- Redis的配置参数
- mysql计算两个日期相差的天数
- ORACLE触发特定的解释
- mysql 一次死锁的处理
- mysql格式化时间戳为日期
- 强制修改mysql 中root的密码
- mysql更新表中日期字段时间
- oracle性能优化学习062201
- mysql查找一个字段属于哪个表
- SqlBulkCopy的使用