Hibernate学习笔记一(hibernate入门)

  • 注:这是笔者在学习时的小小记录,只是为了对自己的知识查缺补漏,有可能有些地方写错,仅供参考

Hibernate的简介

Hibernate是一个开源的对象关系映射框架,底层对JDBC进行了封装,在hibernate出现之前,当我们要对数据库进行访问时,比如插入一条数据,如果插入字段多的话会比较繁琐,Hibernate通过编写配置文件将javabean与数据库的表相互映射,这样我们就可以通过操作对象来实现对数据库的访问。

使用Hibernate所需要的基本包

首先需要hibernate解压缩包下的lib/required目录里的所有jar包
hibernate必要jar包

因为Hibernate也能够使用数据库连接池来提高效率,因此这里还可以选择加入c3p0的jar包
c3p0连接池jar包

因为hibernate是与数据库进行打交道的,此时还需要所使用数据库的连接驱动包(以MySQL为例)
mysql连接驱动包

如果需要hibernate记录下相关的日志文件,这里可以使用log4j的相关jar包
log4j的jar包

hibernate的配置文件

一般需要配置的文件有两个,一个是核心配置文件,一个是对象映射文件,这两个文件都需要手动创建。

对象映射文件

该文件名可以随意起,但是一般定为类名.hbm.xml(如Customer.hbm.xml),一般放在和javabean同包,对象映射文件是配置javabean和数据库的表之间的映射关系,即配置类成员属性与表字段之间的映射关系,hibernate通过这映射文件就可以自动帮我们生成SQL语句和一些其他操作。

  • 基本配置

在映射文件中需要配置的有类成员属性与表的主键之间的映射关系,这需要使用到id标签,而其他表字段与成员属性之间的映射使用property标签。

  • 配置案例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 
 
<!-- 配置javabean与数据库表的映射文件 -->
<hibernate-mapping>
	<!-- class-java类与表名的映射 
			name:全类名
			table:表名
	-->
	<class name="com.wzm.entity.Customer" table="cst_customer">
		<!-- id-java类中属性与表主键的映射
				name:类中的成员属性名
				column:表的字段名
		 -->
		<id name="cust_id" column="cust_id">
			<!-- generator-定义主键的增长方式
					native-相当于AUTO_INCREMENT
			 -->
			<generator class="native"></generator>
		</id>
		
		<!-- property-Java类中的属性与表中除主键外的字段映射
				name:类属性名
				column:表字段名
				(必要属性,当name与column的名相同时,column可以省略)
				
				length:定义表字段的长度
				non-null:定义表字段为非空
				unique:定义表字段唯一
				(可选属性,只有在自动创建表时起作用)
		 -->
		<property name="cust_name" column="cust_name"></property>
		<property name="cust_source" column="cust_source"></property>
		<property name="cust_industry" column="cust_industry"></property>
		<property name="cust_level" column="cust_level"></property>
		<property name="cust_address" column="cust_address"></property>
		<property name="cust_phone" column="cust_phone"></property>
		
	</class>
</hibernate-mapping>

核心配置文件

该文件固定名称为hibernate.cfg.xml,需要将其放在工程的src目录下,在hibernate解压缩包中的project/etc目录下有个hibernate.properties文件,里边放的是核心配置文件所能使用大部分基本配置参数,一般我们可以在其中找到需要的基本配置参数。

  • 基本配置

核心配置文件最基本的配置是配置数据库连接的参数,如果使用连接池,也需要配置相应的参数。其他的配置参数可以根据需求进行配置。在核心配置文件中一般会直接加载对象映射文件。

  • 配置案例(数据库以MySQL为例)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<!-- 配置hibernate的核心配置 -->
<hibernate-configuration>
	<!-- 配置session工厂,用于生产session
			session类似于数据库的connection
			此处以MySQL为例
			配置参数可在配置文件hibernate-release-5.0.7.Final\project\etc\hibernate.properties中查找
	 -->
	<session-factory>
		<!-- 配置MySQL的连接驱动 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- 配置MySQL数据库的连接地址 -->
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property>
		<!-- 配置连接数据库的用户名 -->
		<property name="hibernate.connection.username">root</property>
		<!-- 配置连接数据库的密码 -->
		<property name="hibernate.connection.password">123456</property>
		<!-- 配置连接数据库的方言
			相当于告诉hibernate生产的SQL语句要符合MySQL的编写规范
		 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 配置让hiebernate使用哪种数据库连接池
				此处使用c3p0
		 -->
		<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
		<!-- 配置控制台显示生成的SQL语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 配置显示的SQL语句是否格式化
				作用:打印好看
		 -->
		<property name="hibernate.format_sql">true</property>
		<!-- 配置是否自动创建表
				create-drop:没表自动创建,有表删除后创建,最后全删除
				create:没表自动创建,有表删除后创建
				update:没表自动创建,有表直接使用
				validate:默认值,不会自动创建表
		 -->
		<property name="hibernate.hbm2ddl.auto">update</property>
		<!-- 加载java类与表字段的映射文件
				resource:映射文件的位置,使用src下全路径
		 -->
		<mapping resource="com/wzm/entity/Customer.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

hibernate的API使用

在jar包和配置文件处理好的前提下,使用hibernate提供的API实现对数据库的表进行CRUD操作。

基本使用

  • CRUD的API

增加使用save(Object object),删除使用delete(Object object),修改使用update(Object object),以上的Object是要操作的对象,获取可以用get(Class class,Object object)和load(Class class,Object object),这两个API中的object是所要操作对象的主键。

  • 编写步骤

1.创建一个Configuration对象,加载核心配置文件
2.使用Configuration获得SessionFactory对象
3.通过session工厂获得session
4.使用session对象开启事务(如果是查询操作不需要)
5.使用session进行CRUD操作
6.提交事务
7.关闭session资源

  • 编写案例
/**
 * 	向表中插入一条数据
 */
@Test
public void test1() {
	//加载hibernate的核心配置文件hibernate.cfg.xml,一般只需要创建一次
	Configuration configuration = new Configuration();
	configuration.configure();
	//获取session工厂,管理连接池,一般一个程序也只需要创建一次
	SessionFactory sessionFactory = configuration.buildSessionFactory();
	//从工厂获得session
	Session session = sessionFactory.openSession();
	//hibernate在写SQL语句时,不管是多少条SQL语句都需要开启事务(查询SQL语句除外)
	Transaction transaction = session.beginTransaction();
	//实例化一个对象,使用面向对象来操作
	Customer customer = new Customer();
	customer.setCust_name("tom");
	//保存一个对象到数据库中
	session.save(customer);
	//提交事务
	transaction.commit();
	//关闭资源
	session.close();
	sessionFactory.close();
}

API使用注意点

  • 注意点一

在hibernate中,除了查询的SQL语句,其他的增删改的SQL都需要开启事务,无论是执行一条还是多条SQL语句。这在开发中不是很规范,因为hibernate属于Dao层,而事务应该属于service层,因此之后有可能会解决这个问题。

  • 注意点二

在进行删除和修改的操作时,要先通过查询获取要操作的对象,避免因为数据覆盖造成数据丢失。

  • 注意点三

hibernate的API只能够进行主键做条件的查询,而其他的查询如多表查询等都需要自己手写SQL语句。

  • 注意点四

hibernate有两种查询API,分别是get和load,都只能用于主键做条件的查询
两者的区别
get:
1.立即向数据库查询数据
2.get返回的类型是要操作的对象本身
3.当查询不到数据时会返回null
load:
1.延迟查询,只有当使用对象(除操作对象相映射的主键外)时才去查询
2.load返回的类型是代理对象,该代理对象存储着主键映射的属性值
3.当查询不到数据时会抛出ObjectNotFoundException异常

总结

使用hibernate框架可以帮助我们减少SQL语句的编写量,使我们在开发程序时更加高效,在使用API时,发现有一部分代码是固定的,因此可以将其抽取出来,单独做成一个工具类,以后就不需要重复写这些代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值