Hibernate的相关配置
刚刚学了hibernate的相关知识,就想花时间,把知识总结一下,屁话不多说,直接来代码。
第一步建实体类
这里简单的说一下,其实我们的hibernate可以自动的在数据库里面生成表格具体就是在hibernate.cfg.xml中所增加的这句代码,
<!-- 自动生成对应对象模型对应关系表 -->
<property name="hibernate.hbm2ddl.auto">update</property> //这里我写的是update,可以写成create就是生成,而update就是如果没有该表就生成,没有的话就不执行该代码
第二步将实体类映射成的关系模型对象
将实体类通过映射(映射文件:hibernate.cfg.xml)生成模型的实体类的具体操作有二种
第一种配置Emp.hbm.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="org.berg.hibernate.entity">
<class name="Emp" table="t_emp">
<!-- name表示 实体类的类名称 table表示 自动生成数据库名的名称 -->
<id name="empno" column="empno">
<!-- name表示主键的名称 name表示数据库生成列的列名 -->
<generator class="identity"></generator>
<!--主键生成策略 identity是表示自动生成 -->
</id>
<!--以下是其他的属性 -->
<property name="ename" column="ename" length="50" type="string" not-null="true"></property>
<!-- length表示类型的长度 type表示字段类型 bot—null表示是否为空 -->
<!--其实不写column也是可以的,自动数据库列名与实体类的名称相同 -->
<property name="job" ></property>
<property name="sal" ></property>
<property name="hiredate" type="date"></property>
</class>
</hibernate-mapping>
第二种通过标识符直接在实体类里面配置相关的标识符(个人推荐用第二种,因为在实际开发中,都是用的标识符,基于API的规范),而且代码特别少。
package org.berg.hibernate.entity;
import java.util.Date;
/**
* Emp
* @author berg
*
*/
@Entity //将实体类映射成关系模型的实体类
@Table(name="T_Emp") //name表示生成数据中的名字,如果默认不写,数据库的名字默认为该实体类的名字
public class Emp {
// 编号
@Id //设置主键
@GeneratedValue(strategy=GenerationType.IDENTITY) //主键生成策略(基于API标准的设置)
//第二种就是基于ApI规范的延伸
@GeneratedValue(generator = "paymentableGenerator")
@GenericGenerator(name = "paymentableGenerator", strategy = "identity")
private Integer empno;
// 姓名
private String ename;
// 工作
private String job;
// 工资
private Float sal;
// 入职日期
private Date hiredate;
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 Float getSal() {
return sal;
}
public void setSal(Float sal) {
this.sal = sal;
}
public Date getHiredate() {
return hiredate;
}
public void setHiredate(Date hiredate) {
this.hiredate = hiredate;
}
@Override
public String toString() {
return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job + ", sal=" + sal + ", hiredate="
+ hiredate + "]";
}
}
这里对于@GeneratorValue与@GenericGenerator注解使用区别
其他我就先不一一补充了,下面推荐一片文章,里面说的很详细,很多迷惑的点我也参考了它们才解答出来,附上博文链接:
http://blog.csdn.net/tianxiezuomaikong/article/details/64930151
第三步映射文件的相关配置及其注解
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库连接配置 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<!-- 数据库连接池的大小 -->
<property name="connection.pool_size">5</property>
<!-- SQL 方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 格式化sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 自动生成对应对象模型对应关系表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 在控制台输出sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 注册我们的实体映射类 -->
<mapping resource="org/berg/hibernate/entity/Emp.hbm.xml" /> //如果用的是Emp.hbm.xml来映射的话,就写Emp.hbm.xml 的全限定路径名,如果用的是标识符,就是实体类的全限定路径名
</session-factory>
</hibernate-configuration>
第四部进行相关的增删该查的操作
因为hibernate和jdbc不同,hibernate进行的是对象关系模型,所谓每一次的操作都要对应的传入一个对象来执行操作。
package org.berg.hibernate.test;
import java.io.Serializable;
import java.util.Date;
import org.berg.hibernate.entity.Emp;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.xiaoyi.hibernate.util.HibernateUtil;
/**
* 关于hibernate增删改查的相关操作
*
* @author Administrator
*
*/
public class Test {
private static SessionFactory sessionFactory = null;
private static Session openSession = null;
private static Transaction beginTransaction = null;
public static void main(String[] args) {
/* addData(); */
/* select(); */
/* update(); */
delete();
}
// 使用数据库的基本操作
public void process() {
// 使用Hibernate的API操作数据库的步骤:
// 1.创建SessionFactory
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
// 2.通过SessionFactory获得Session对象(理解 JDBC 连接Connectiion)
Session session = sessionFactory.openSession();
// 3开始一个事务(在Hibernete团队 推荐显示声明事务)
Transaction tx = session.beginTransaction();
// 4.使用session的API操作具体持久化操作
Emp emp = new Emp();
session.save(emp);
// 5.提交事务
tx.commit();
// 6.关闭session
session.close();
}
增加操作
public static void addData() {
// 必须的操作
// add sessionFactory
sessionFactory = HibernateUtil.getSessionFactory();
// create session
openSession = sessionFactory.openSession();
// create transaction
beginTransaction = openSession.beginTransaction();
// 第一种方法
// 具体的代码实现
/*
* Emp emp=new Emp(); emp.setEname("张三"); emp.setHiredate(new Date());
* emp.setJob("程序员"); emp.setSal(10000F); openSession.save(emp);
*/
// 第二种方法
Emp emp = new Emp();
emp.setEname("李四");
emp.setHiredate(new Date());
emp.setJob("前端");
emp.setSal(10000F);
openSession.saveOrUpdate(emp);
/*
* save()方法很显然是执行保存操作的,如果是对一个新的刚new出来的对象进行保存,自然要使用这个方法了,数据库中没有这个对象。
* saveOrUpdate()这个方法是更新或者插入,有主键就执行更新,如果没有主键就执行插入
*/
// Submission of transactions
beginTransaction.commit();
// close resource
sessionFactory.close();
}
查询操作
// select data
public static void select() {
// add sessionFactory
sessionFactory = HibernateUtil.getSessionFactory();
// create session
openSession = sessionFactory.openSession();
// create transaction
beginTransaction = openSession.beginTransaction();
// 第一种方法
/*
* Emp emp = openSession.get(Emp.class, 2);
* System.out.println(emp.toString());
*/
// 第二种方法
Emp load = openSession.load(Emp.class, 1);
System.out.println(load.toString());
/*
* 1.get()采用立即加载方式,而load()采用延迟加载; get()方法执行的时候,会立即向数据库发出查询语句,
* 而load()方法返回的是一个代理(此代理中只有一个id属性),只有等真正使用该对象属性的时候,才会发出sql语句
* 2.如果数据库中没有对应的记录,get()方法返回的是null.而load()方法出现异常ObjectNotFoundException
*/
// Submission of transactions
beginTransaction.commit();
// close resource
sessionFactory.close();
}
更新操作
public static void update() {
// add sessionFactory
sessionFactory = HibernateUtil.getSessionFactory();
// create session
openSession = sessionFactory.openSession();
// create transaction
beginTransaction = openSession.beginTransaction();
Emp emp = new Emp();
emp.setEmpno(1);
emp.setEname("王五");
emp.setHiredate(new Date());
emp.setJob("茶水员");
emp.setSal(5000F);
openSession.update(emp);
// Submission of transactions
beginTransaction.commit();
// close resource
sessionFactory.close();
}
删除操作
// delete
public static void delete() {
// add sessionFactory
sessionFactory = HibernateUtil.getSessionFactory();
// create session
openSession = sessionFactory.openSession();
// create transaction
beginTransaction = openSession.beginTransaction();
Emp load = openSession.get(Emp.class, 1);
openSession.delete(load);
// Submission of transactions
beginTransaction.commit();
// close resource
sessionFactory.close();
}
}