hibernate复习(一)

公司一个项目用到了hibernate框架,赶紧复习一下,虽然现在都是用Mybatis。

hibernate,Mybatis都是ORM概念的一种具体实现。

ORM概念:Object Realtion Mapping (对象关系映射), 用于解决对象和数据库表之间的映射关系。

简单的说,就是考虑    如何将对象直接保存到表中,以及从表中直接获取到对象。

这里要考虑三个因素:

1) 对象 和 表 要对应

2)对象的属性 和 表的字段 要对应

3)对象属性的类型 和 表字段的类型 要对应

解决这三个问题就可以直接拿对象或者存对象了。

一、先来一个HelloWord

 

1)导入jar包

       https://download.csdn.net/download/quge_name_harder/10892966

 2)写实体类   Employee.java

import java.util.Date;

//一、 对象
public class Employee {

	private int empId;
	private String empName;
	private Date workDate;
	
	public int getEmpId() {
		return empId;
	}
	public void setEmpId(int empId) {
		this.empId = empId;
	}
	public String getEmpName() {
		return empName;
	}
	public void setEmpName(String empName) {
		this.empName = empName;
	}
	public Date getWorkDate() {
		return workDate;
	}
	public void setWorkDate(Date workDate) {
		this.workDate = workDate;
	}
	@Override
	public String toString() {
		return "Employee [empId=" + empId + ", empName=" + empName
				+ ", workDate=" + workDate + "]";
	}
	
}

3)写实体类与表的映射文件   Employee.hbm.xml

      映射文件作用: 

         解决这三个问题          

         1. 对象 和 表 要对应

         2. 对象的属性 和 表的字段 要对应

        3.  对象属性的类型 和 表字段的类型 要对应

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.zc.a">
	
    <!--name="Employee"  为实体类    table="employee"  为表名 -->
	<class name="Employee" table="employee">
		
		<!-- 
            主键映射 ,name="empId"  为实体类的属性,column="id"   为表的字段
        -->
		<id name="empId" column="id">

            <!-- class="native" 为主键自增长的方式-->
			<generator class="native"/>
		</id>
		
		<!-- 
             非主键映射
             我们可以用type指定表字段类型   type="string"
             如果不写,则默认和对象属性的类型一致
        -->
		<property name="empName" column="empName" type="string"></property>
		<property name="workDate" column="workDate"></property>
		
	</class>

</hibernate-mapping>

4)在 src/hibernate.cfg.xml  写主配置文件。

   主配置文件作用:

       1.数据库连接配置

       2.加载所用的映射(*.hbm.xml)

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<!-- 通常,一个session-factory节点代表一个数据库 -->
	<session-factory>
	
		<!-- 1. 数据库连接配置 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///hib_demo</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		<!-- 
			数据库方法配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql
		 -->
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
		
		
		<!-- 2. 其他相关配置 -->
		<!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 2.2 格式化sql -->
		<property name="hibernate.format_sql">true</property>
		<!-- 2.3 自动建表  -->
		<property name="hibernate.hbm2ddl.auto">update</property>
		
		
		<!-- 3. 加载所有映射 -->
		<mapping resource="com/zc/Employee.hbm.xml"/>
		
	</session-factory>
</hibernate-configuration>

5)测试

public class test {

	@Test
	public void testHello() throws Exception {
		// 对象
		Employee emp = new Employee();
		emp.setEmpName("小明");
		emp.setWorkDate(new Date());
		
		// 获取加载配置文件的管理类对象
		Configuration config = new Configuration();

		config.configure();  // 默认加载src/hibenrate.cfg.xml文件

		// 创建session的工厂对象
		SessionFactory sf = config.buildSessionFactory();

		// 创建session (代表一个会话,与数据库连接的会话)
		Session session = sf.openSession();

		// 开启事务
		Transaction tx = session.beginTransaction();

		//保存-数据库
		session.save(emp);

		// 提交事务
		tx.commit();

		// 关闭
		session.close();
		sf.close();
	}
}

二、Hibernate相关API

在上面测试的时候,我们用到了一些相关的API,下面分别介绍

1)

// 获取加载配置文件的管理类对象
Configuration config = new Configuration();

config.configure();  // 默认加载src/hibenrate.cfg.xml文件

  Configuration       配置管理类对象,通过它的configure()方法加载主配置文件(默认加载src/hibenrate.cfg.xml文件)。

                    当然也可以写上路径,加载指定路径下指定名称的主配置文件

                    config.configure(“com/config/hibernate.cfg.xml”);   

2)

// 创建session的工厂对象
SessionFactory sf = config.buildSessionFactory();

// 创建session (代表一个会话,与数据库连接的会话)
Session session = sf.openSession();

加载完主配置文件后,创建session的工厂对象,并创建一个session。

3)

// 开启事务
Transaction tx = session.beginTransaction();

//保存-数据库
session.save(emp);

// 提交事务
tx.commit();

  通过session开启事务,执行具体操作,并提交

4)

// 关闭
session.close();
sf.close();

关闭连接

三、执行具体操作

上节中我们在开启事务后,执行具体操作,也就是我们常说的增删改查。本节介绍一下

常用的有

// 增     
// 保存一个对象
session.save(emp); 

// 删
// 先根据id查询对象,再判断删除
// 如果直接删除空对象,会报错
Object obj = session.get(Employee.class, id);
if (obj != null) {
	session.delete(obj);
}

// 改     
// 先根据id查询对象,再判断更新
Employee emp = (Employee)session.get(Employee.class, id);
if (emp != null) { 
   session.update(emp);  
}

//保存或者更新的方法: 没有设置主键,执行保存;有设置主键,执行更新操作; 如果设置主键不存在报错!  
session.saveOrUpdate(emp);      
// 查     
// 主键查询
session.get(Employee.class, id); 
session.load(Employee.class, id);   // 懒加载


// 此外hibernate提供了面向对象的查询语言,HQL  (hibernate  query  language)
// 它查询的是对象以及对象的属性。区分大小写。
// 而SQL查询的是表以及字段;不区分大小写。
 

// HQL查询
Query q = session.createQuery("from Employee");
List<Employee> list = q.list();

// 带参数的HQL查询
Query q =session.createQuery("from Employee where empName=?");
// 注意:参数索引从0开始
q.setParameter(0, employeeName);
// 执行查询
List<Employee> list = q.list();

// 设置分页的HQL查询
Query q = session.createQuery("from Employee");
// 设置分页参数
q.setFirstResult(index);  // 查询的其实行 
q.setMaxResults(count);	  // 查询返回的行数
List<Employee> list = q.list();

猜你喜欢

转载自blog.csdn.net/quge_name_harder/article/details/85676463