Hibernate的hibernate.cfg.xml和标识符相关配置和增删改查的总结

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();
	}

}





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值