hibernate基本使用

本文介绍了一个使用Hibernate框架连接Oracle数据库的具体案例,包括实体类定义、映射文件编写、基本CRUD操作等核心步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.数据表oracle-scott-emp表

创建java project-hibernate001

2.导入jar包,hibernate,oracle驱动,eclipse自带junit

整个工程结构:

 

src下建包com.hibernate.entity,创建实体类Emp及映射关系文件Emp.hbm.xml

package com.hibernate.entity;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

public class Emp implements Serializable {
	public Integer empno;
	public String ename;
	public String job;
	public Integer mgr;
	public Date hiredate;
	public Double sal;
	public Double comm;
	public Integer deptno;
	public Integer getEmpno() {
		return empno;
	}
	public void setEmpno(Integer empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}
	public Integer getMgr() {
		return mgr;
	}
	public void setMgr(Integer mgr) {
		this.mgr = mgr;
	}
	public Date getHiredate() {
		return hiredate;
	}
	public void setHiredate(Date hiredate) {
		this.hiredate = hiredate;
	}
	public Double getSal() {
		return sal;
	}
	public void setSal(Double sal) {
		this.sal = sal;
	}
	public Double getComm() {
		return comm;
	}
	public void setComm(Double comm) {
		this.comm = comm;
	}
	public Integer getDeptno() {
		return deptno;
	}
	public void setDeptno(Integer deptno) {
		this.deptno = deptno;
	}
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2019-4-1 9:29:18 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.hibernate.entity.Emp" table="EMP">
        <id name="empno" type="java.lang.Integer">
            <column name="EMPNO" />
            <generator class="assigned" />
        </id>
        <property name="ename" type="java.lang.String">
            <column name="ENAME" />
        </property>
        <property name="job" type="java.lang.String">
            <column name="JOB" />
        </property>
        <property name="mgr" type="java.lang.Integer">
            <column name="MGR" />
        </property>
        <property name="hiredate" type="java.util.Date">
            <column name="HIREDATE" />
        </property>
        <property name="sal" type="java.lang.Double">
            <column name="SAL" />
        </property>
        <property name="comm" type="java.lang.Double">
            <column name="COMM" />
        </property>
        <property name="deptno" type="java.lang.Integer">
            <column name="DEPTNO" />
        </property>
    </class>
</hibernate-mapping>

src目录下创建hibernate主配置文件

在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-configuration>
 <session-factory >
  <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
  <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
  <property name="hibernate.connection.username">scott</property>
  <property name="hibernate.connection.password">tiger</property>
  <!--dialect方言,根据数据库选择-->
  <property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property>
  <!--控制台输出SQL语句-->
  <property name="hibernate.show_sql">true</property>
  <!--输出SQL语句时是否格式化-->
  <property name="hibernate.format_sql">true</property>
  <!-- 声明映射关系文件 -->
  <mapping resource="com/hibernate/entity/Emp.hbm.xml" />
 </session-factory>
</hibernate-configuration>

创建测试类进行测试

package com.hibernate.entity;

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

public class HibernateUtil {
	private static SessionFactory sessionFactory;
	static {
		//加载配置文件
		Configuration conf=new Configuration();
		conf.configure("/hibernate.cfg.xml");
		sessionFactory=conf.buildSessionFactory();
	}
	public static Session getSession() {
		return sessionFactory.openSession();
	}
}
package com.hibernate.entity;


import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.hibernate.entity.Emp;

public class EmpTest {
	//增加员工
	@Test
	public void addEmp() {
		Emp emp=new Emp();
		emp.setEmpno(6666);
		emp.setEname("小明");
		emp.setJob("厨师");
		emp.setMgr(7777);
		emp.setHiredate(java.sql.Date.valueOf("2018-10-10"));
		emp.setSal((double) 8765);
		emp.setComm((double) 100);
		emp.setDeptno(10);
		//获取会话
		Session session=HibernateUtil.getSession();
		//开启事务
		Transaction ts=session.beginTransaction();
		session.save(emp);
		ts.commit();
		session.close();
	}
	//根据id查询员工
	@Test
	public void selectEmp() {
		Session session=HibernateUtil.getSession();
		//根据员工编号查询员工信息
		Emp emp=(Emp)session.get(Emp.class, 6666);
		System.out.println("员工信息:\n"+emp.getEmpno()+" "+emp.getEname()+" "+emp.getJob()+" "
		  +emp.getMgr()+" "+emp.getHiredate()+" "+emp.getSal()+" "+emp.getComm()+" "
		  +emp.getDeptno());
		session.close();
	}
	//查询全部员工
	@Test
	public void selectAllEmp() {
		String hql="from Emp";//可加where指定查询条件
		Session session=HibernateUtil.getSession();
		Query query=session.createQuery(hql);
		List<Emp> allemp=query.list();
		for(Emp emp : allemp) {
			System.out.println("员工信息:\n"+emp.getEmpno()+" "+emp.getEname()+" "+emp.getJob()+" "
					  +emp.getMgr()+" "+emp.getHiredate()+" "+emp.getSal()+" "+emp.getComm()+" "
					  +emp.getDeptno());
		}
		session.close();
	}
	//修改员工信息
	@Test
	public void updateEmp() {
		Session session=HibernateUtil.getSession();
		//获得要修改员工对象
		Emp emp=session.get(Emp.class, 6666);
		//开启事务
		Transaction ts=session.beginTransaction();
		emp.setJob("总经理");
		//执行更改
		session.update(emp);
		ts.commit();
        session.close();
	}
	//删除员工
	@Test
	public void deleteEmp() {
		Session session=HibernateUtil.getSession();
		Emp emp=session.get(Emp.class, 6666);
		Transaction ts=session.beginTransaction();
		session.delete(emp);
		ts.commit();
		session.close();
	}
}

输出结果:

运行addEmp后查询(运行selectEmp):

四月 02, 2019 10:33:49 上午 org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.0.12.Final}
四月 02, 2019 10:33:49 上午 org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
四月 02, 2019 10:33:49 上午 org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
四月 02, 2019 10:33:49 上午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
四月 02, 2019 10:33:49 上午 org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
WARN: HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-mapping. Use namespace http://www.hibernate.org/dtd/hibernate-mapping instead.  Support for obsolete DTD/XSD namespaces may be removed at any time.
四月 02, 2019 10:33:51 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
四月 02, 2019 10:33:51 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [oracle.jdbc.driver.OracleDriver] at URL [jdbc:oracle:thin:@localhost:1521:orcl]
四月 02, 2019 10:33:51 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: {user=scott, password=****}
四月 02, 2019 10:33:51 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
四月 02, 2019 10:33:51 上午 org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
四月 02, 2019 10:33:51 上午 org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.Oracle10gDialect
Hibernate: 
    select
        emp0_.EMPNO as EMPNO1_0_0_,
        emp0_.ENAME as ENAME2_0_0_,
        emp0_.JOB as JOB3_0_0_,
        emp0_.MGR as MGR4_0_0_,
        emp0_.HIREDATE as HIREDATE5_0_0_,
        emp0_.SAL as SAL6_0_0_,
        emp0_.COMM as COMM7_0_0_,
        emp0_.DEPTNO as DEPTNO8_0_0_ 
    from
        EMP emp0_ 
    where
        emp0_.EMPNO=?
员工信息:
6666 小明 厨师 7777 2018-10-10 00:00:00.0 8765.0 100.0 10

运行updateEmp后查询(运行selectEmp):
员工信息:
6666 小明 总经理 7777 2018-10-10 00:00:00.0 8765.0 100.0 10

运行deleteEmp后查询(运行selectAllEmp):编号6666的小明已被删除
员工信息:
7369 SMITH CLERK 7902 1980-12-17 00:00:00.0 800.0 null 20
员工信息:
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00.0 1600.0 300.0 30
员工信息:
7521 WARD SALESMAN 7698 1981-02-22 00:00:00.0 1250.0 500.0 30
员工信息:
7566 JONES MANAGER 7839 1981-04-02 00:00:00.0 2975.0 null 20
员工信息:
7654 MARTIN SALESMAN 7698 1981-09-28 00:00:00.0 1250.0 1400.0 30
员工信息:
7698 BLAKE MANAGER 7839 1981-05-01 00:00:00.0 2850.0 null 30
员工信息:
7782 CLARK MANAGER 7839 1981-06-09 00:00:00.0 2450.0 null 10
员工信息:
7788 SCOTT ANALYST 7566 1987-04-19 00:00:00.0 3000.0 null 20
员工信息:
7839 KING PRESIDENT null 1981-11-17 00:00:00.0 5000.0 null 10
员工信息:
7844 TURNER SALESMAN 7698 1981-09-08 00:00:00.0 1500.0 0.0 30
员工信息:
7876 ADAMS CLERK 7788 1987-05-23 00:00:00.0 1100.0 null 20
员工信息:
7900 JAMES CLERK 7698 1981-12-03 00:00:00.0 950.0 null 30
员工信息:
7902 FORD ANALYST 7566 1981-12-03 00:00:00.0 3000.0 null 20
员工信息:
7934 MILLER CLERK 7782 1982-01-23 00:00:00.0 1300.0 null 10

 

过程中出现的错误:

org.hibernate.engine.jndi.JndiException: Error parsing JNDI name []
at....
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property

解决办法:hibernate.cfg.xml文件中:session-factory name="" 中的name属性删除
ERROR: ORA-00904: "EMP0_"."": 标识符无效
解决方法:查看实体类中字段和数据库中字段是否匹配

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值