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_"."": 标识符无效
解决方法:查看实体类中字段和数据库中字段是否匹配