Hibernate5入门

  • 2019-05-10
  • 236
  • 0

什么是hibernate

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用.简单说就是一个持久层的ORM的框架。对JDBC做了封装,将对象与数据库中表建立映射关系,操作对象就可以操作数据库中表。

如何使用hibernate

下载https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/,解压

  • documentation:Hibernate的开发规范和文档
  • lib :Hibernate的开发使用的jar包
  • project :Hibernate的提供测试的工程。

我这里还用到了c3p0连接池:所以导入c3p0-0.9.2.1.jar   hibernate-c3p0-5.0.7.Final.jar  mchange-commons-java-0.2.3.4.jar

创建项目导入Jar包

  1. 引入lib/required/*.jar
  2. 数据库驱动包 : mysql-connector-java-5.1.39-bin.jar
  3. 日志包 : slf4j-log4j12-1.7.2.jar  slf4j-api-1.6.1.jar  log4j-1.2.16.jar
如果要用c3p0连接池还需要导入相关包

创建数据库和表

CREATE TABLE `cst_customer` (
`cust_id` int AUTO_INCREMENT COMMENT ‘客户编号(主键)’,
`cust_name` varchar(32) NOT NULL COMMENT ‘客户名称(公司名称)’,
`cust_source` varchar(32) DEFAULT NULL COMMENT ‘客户信息来源’,
`cust_industry` varchar(32) DEFAULT NULL COMMENT ‘客户所属行业’,
`cust_level` varchar(32) DEFAULT NULL COMMENT ‘客户级别’,
`cust_phone` varchar(64) DEFAULT NULL COMMENT ‘固定电话’,
`cust_mobile` varchar(16) DEFAULT NULL COMMENT ‘移动电话’,
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

创建实体类

package com.husaky.domain;
public class Customer
{
private Long cust_id;// ‘客户编号(主键)’,
private String cust_name;// ‘客户名称(公司名称)’,
private String cust_source;// ‘客户信息来源’,
private String cust_industry;//’客户所属行业’,
private String cust_level;// ‘客户级别’,
private String cust_address;// ‘客户联系地址’,
private String cust_phone;// ‘客户联系电话’,
public Long getCust_id() {
return cust_id;
}
public void setCust_id(Long cust_id) {
this.cust_id = cust_id;
}
// 后面省略…
}

创建Hibernate的映射文件

在上面实体类同级目录下也就是com/husaky/domain/下面创建映射文件只要是一个XML文件就可以了。一般映射命名:类名.hbm.xml

<?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”>
<!– 做类(Customer)和表(cst_customer)的映射关系 –>
<hibernate-mapping>
<!–
class标签: 作用类和表的映射的
name:类的全限定名(cn.itcast.domain.Customer)
table:表的全名(cst_customer)
–>
<class name=”com.husaky.domain.Customer” table=”cst_customer”>
<!–
id标签:做类中的某个属性 和 表的主键映射关系
name:类的某个属性名
column:表的主键字段名
–>
<id name=”cust_id” column=”cust_id”>
<!– 做主键的增长方式的
native: AUTO_INCREMENT 让主键自动增长 –>
<generator class=”native”></generator>
</id>
<!–
property标签:做其它属性和其它字段的映射关系
name属性:类的其它属性名
column属性:表的其它字段名
ps:如果属性名和字段名一致 column可以省略不写
–>
<property name=”cust_name” column=”cust_name” length=”20″ not-null=”true” unique=”true”></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>

映射文件就是将类与表建立映射关系文件,这个文件只要是XML即可。通常名称:类名.hbm.xml
l class标签:建立类和表的映射
n name :类的全路径
n table :数据库中表的名称。
n catalog :数据库名称(可以省略)
l id标签:建立主键和类中属性映射
n name :类中的属性的名称
n column :表中的字段名称。(如果类中的属性名和表中的字段名一致,column可以省略)
l property标签:建立普通字段与类中属性映射
n name :类中的属性的名称
n column :表中的字段名称。(如果类中的属性名和表中的字段名一致,column可以省略)
n length :字段的长度(自动创建表)
n not-null :非空(自动创建表)
unique :唯一(自动创建表)

创建Hibernate核心配置文件

src/hibernate.cfg.xml文件,这个名字固定不可以改

<?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-factory> <!– 生产session的工厂 session是connection –>
<!– 数据的驱动 –>
<property name=”hibernate.connection.driver_class”>com.mysql.jdbc.Driver</property>
<!– 数据库的地址
jdbc:mysql:///test ==jdbc:mysql://localhost:3306/test
–>
<property name=”hibernate.connection.url”>jdbc:mysql://localhost:3306/hibernate</property>
<!– 数据库的用户名 –>
<property name=”hibernate.connection.username”>root</property>
<!– 数据库的密码 –>
<property name=”hibernate.connection.password”></property>
<!– 数据库的方言
分页:
mysql: select * from 表 limit ?,?
sqlserver: select * from 表 top ?,?
让hibernate生成符合我mysql数据库的sql语句
–>
<property name=”hibernate.dialect”>org.hibernate.dialect.MySQLDialect</property>
<!– 告诉hibernate要用c3p0 –>
<property name=”hibernate.connection.provider_class”>org.hibernate.connection.C3P0ConnectionProvider</property>
<!– hibernate自动生成的sql语句在控制台显示出来 –>
<property name=”hibernate.show_sql”>true</property>
<!– 显示的sql语句更加的格式化 –>
<property name=”hibernate.format_sql”>true</property>
<!– 让hibernate根据映射关系自动生成数据库的表 默认hibernate不会主动创建表
create:没有表创建表 有表删除掉创建表
create-drop:没有表创建表 有表删除掉创建表 用完就全删
做测试
update: 企业开发使用 没有表 创建表 有表 使用表
validate:默认 不创建
–>
<property name=”hibernate.hbm2ddl.auto”>update</property>
<!– 加载映射文件(Customer.hbm.xml)的地址 –>
<mapping resource=”com/husaky/domain/Customer.hbm.xml”/>
</session-factory>
</hibernate-configuration>

具体选项去它里面hibernate-release-5.0.7.Final\project\etc\hibernate.properties复制粘贴

Hibernate的常用API

Configuration配置对象:

用来加载核心配置文件hibernate.cfg.xml

Configuration cfg = new Configuration().configure();

用来加载映射文件

SessionFactory:session工厂对象

内部维护Hibernate的连接池。一般一个应用只需要创建一次的对象,抽取工具类

package com.husaky.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils 
{
		static Configuration configuration =null;
		static SessionFactory sessionFactory = null;
		static
		{
			// 加载一次配置文件
			configuration = new Configuration();
			configuration.configure();
			
			// 获取一个sessionFactory
			sessionFactory=configuration.buildSessionFactory();
			
		}
		
		public static Session openSession()
		{
			return sessionFactory.openSession();
		}
}

测试

package com.husaky.demo;

import com.husaky.domain.Customer;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.husaky.domain.Customer;
import com.husaky.utils.HibernateUtils;

public class CustomerDemo
{
	@Test // 使用hibernate提供的api来操作
	public void test1()
	{
		// 加载数据库的核心配置文件 (引入映射文件)
		Configuration configuration = new Configuration();
		configuration.configure();
		// 手动加载映射文件
		//configuration.addResource("com/husaky/domain/Customer.hbm.xml");
		// 获取sessionFactory  session工厂
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		// 获取session  相当于connection
		Session session = sessionFactory.openSession();
		// 开启事务 (小细节:hibernate对增删改一条sql语句 都得开事务手动提交一次)
		Transaction tx = session.beginTransaction();
		// 操作 (存一条数据到cst_customer)
		Customer customer = new Customer();
		customer.setCust_name("rose");
		session.save(customer);
		// 提交
		tx.commit();
		// 关闭连接
		session.close();
		// 关闭连接池
		sessionFactory.close();

	}


	@Test
	public void test2()
	{
		// 加载数据库的核心配置文件
		Configuration configuration = new Configuration();
		configuration.configure();
		// 获取sessionFactory
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		// 获取连接
		Session session = sessionFactory.openSession();
		// 开启事务
		Transaction tx = session.beginTransaction();

		// 操作  查询  主键查询  hibernate会自动生成sql语句
		Customer customer = session.get(Customer.class, 2L);
		System.out.println(customer);

		/*Customer customer = session.load(Customer.class, 2L);
		System.out.println(customer);*/

		/*get查询和load查询的区别: 都是根据id主键查询  面试题
		 * 	     核心点:
		 * 	      get查询是立即查询   只要查询就立马发送sql语句获取所有数据
		 * 	      load是延迟查询       查询时候不会立马发送sql语句去查  当使用到这些数据的时候才会去查
		 *
		 *
		 * 		  get查询返回的是Customer类型
		 * 		  load查询返回的是Custoemr代理类型
		 *
		 * 		  get查询找不到返回null
		 * 		  load查询找不到返回的报错信息
		 *
		 * */


		// 提交事务
		tx.commit();
		// 关闭连接
		session.close();
	}



	@Test
	public void test3()
	{
		// 加载核心数据库配置文件
		Configuration configuration = new Configuration();
		configuration.configure();
		// 获取sessionFactory 连接池
		SessionFactory sessionFatory = configuration.buildSessionFactory();
		// 获取连接
		Session session = sessionFatory.openSession();
		// 开启事务
		Transaction tx = session.beginTransaction();

		// 修改  (面相对象思想   操作对象就像相当于操作数据库)
		/*Customer customer = new Customer();
		customer.setCust_id(1L);
		customer.setCust_name("jacka");
		session.update(customer);
		*/

		// 修改就要先查后修改
		Customer customer = session.get(Customer.class, 1L);
		customer.setCust_name("rosessssss");

		session.update(customer);

		// 提交事务
		tx.commit();
		// 关闭连接
		session.close();
	}

	@Test
	public void test4()
	{
		// 获取连接
		Session session = HibernateUtils.openSession();
		// 开启事务
		Transaction tx = session.beginTransaction();
		// 操作 (删除--先查后删)
		Customer customer = session.get(Customer.class, 1L);
		session.delete(customer);
		// 提交
		tx.commit();
		// 关闭
		session.close();

	}

}

评论

还没有任何评论,你来说两句吧

粤ICP备17155863号

- 友情链接 - Theme by Qzhai