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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: JPA,java persistance api,java持久层接口,即与数据库打交道的一些接口。实现交给各个厂商去实现。ORM,Object/Relation Mapping,对象/关系数据库映射。面向对象的数据库操作,底层仍是sql语句。 获得 hibernate的maven依赖。 <dependencies> <dependency> &l
JPA,java persistance api,java持久层接口,即与数据库打交道的一些接口。实现交给各个厂商去实现。

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>    

指定配置文件位置

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

Configuration org.hibernate.cfg.Configuration.configure(File configFile)

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

String path="WEB-INF/hibernate.cfg.xml";
if(System.getProperty("os.name").contains("Windows"))
	path=System.getProperty("wtp.deploy")+"/Search.Antibot.CepWebservice/"+path;//tomcat的启动脚本会放入变量“-Dwtp.deploy=D:\codes\cepWebservice\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps”

// 加载hibernate.cfg.xml作为配置
Configuration conf = new Configuration().configure(new File(path));

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`,见下:

    @Column(name = "\"desc\"")
    public String 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

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

@Temporal(TemporalType.TIMESTAMP)
@Generated(GenerationTime.INSERT)     
//数据更改的时间戳,插入与更新时都设为CURRENT_TIMESTAMP
//有了@Generated(GenerationTime.INSERT) 注解,使用hibernate添加数据时符合预期。
public Date DataChange_LastTime;

@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数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
Java 数据库连接 数据库
hibernate正向生成数据库表以及配置——TestStu.java
hibernate正向生成数据库表以及配置——TestStu.java
|
6月前
|
Java 数据库连接 数据库
hibernate正向生成数据库表以及配置——Teacher.hbm.xml
hibernate正向生成数据库表以及配置——Teacher.hbm.xml
|
6月前
|
Java 数据库连接 数据库
hibernate正向生成数据库表以及配置——Teacher.java
hibernate正向生成数据库表以及配置——Teacher.java
|
6月前
|
Java 数据库连接 数据库
hibernate正向生成数据库表以及配置——Student.java
hibernate正向生成数据库表以及配置——Student.java
|
29天前
|
SQL Java 数据库连接
springBoot+Jpa(hibernate)数据库基本操作
springBoot+Jpa(hibernate)数据库基本操作
30 0
|
3月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
45 1
|
3月前
|
Java 数据库连接 数据库
告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
143 0
|
3月前
|
Java 数据库连接 数据库
AI 时代风起云涌,Hibernate 实体映射引领数据库高效之路,最佳实践与陷阱全解析!
【8月更文挑战第31天】Hibernate 是一款强大的 Java 持久化框架,可将 Java 对象映射到关系数据库表中。本文通过代码示例详细介绍了 Hibernate 实体映射的最佳实践,包括合理使用关联映射(如 `@OneToMany` 和 `@ManyToOne`)以及正确处理继承关系(如单表继承)。此外,还探讨了常见陷阱,例如循环依赖可能导致的无限递归问题,并提供了使用 `@JsonIgnore` 等注解来避免此类问题的方法。通过遵循这些最佳实践,可以显著提升开发效率和数据库操作性能。
82 0
|
3月前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
95 0
|
3月前
|
数据库 关系型数据库 MySQL
惊!Hibernate与MySQL的绝密优化技巧大揭秘,让你的数据库飞起来!
【8月更文挑战第31天】在企业应用开发中,结合使用持久层框架Hibernate与数据库管理系统MySQL可显著提升数据库交互效率。本文探讨了多项优化策略,包括配置二级缓存、采用单向关联减少JOIN操作、优化HQL查询语句以及合理使用MySQL索引。通过具体示例,文章详细讲解了如何实施这些优化措施,以期为企业应用提供更高效稳定的数据支持。
53 0