Hibernate自学心得

快大四了,根据自学所学的框架(Sping、Mybatis、Struts2),想出去找找实习工作,所以去看看招聘信息,发现许多的招聘信息里边要求的框架大多都是Hibernate,所以我索性也学学Hibernate这一个框架,以下为个人心得:

查了些资料,发现,Hibernate在数据量上比不上Mybatis好,数据量在很大的情况下,Hibernate可能出现奔溃、不过在许多方面Hibernate还是很好用的,可以减少了写sql语句的麻烦,复杂的sql语句只需要简简单单的几行代码就可以搞定了。当然Hibernate还还是用了Hql语言,也挺好用的:eg:from 实体类名称 [条件...];

首先,Hibernate大多使用的是ORM模式(Object  Relation Mapping || 对象关系映射)。

不多说,开始编写:

使用Hibernate需要到官网去下载包(当然我的代码里边也有):http://hibernate.org/orm/

下载好了之后就可以安安心心的编写了:

第一步:新建Hibernate的配置文件,有两种形式

第一种是properties文件的配置


配置好了就要实现:

/**
	 * 使用了properties配置文件和映射类
	 */
	@Test
	public void test(){
		//通过对象插值
		Student student = new Student();
		student.setId(5);
		student.setName("myks");
		student.setAge(23);
		
		Configuration cfg = new Configuration();
		cfg.addClass(com.myk.hibernate.Student.class);
		SessionFactory sf = cfg.buildSessionFactory();
		Session session = sf.openSession();
		Transaction t = session.beginTransaction();		
		try {
			//添加
			session.save(student);
			t.commit();//事务提交
		} catch (HibernateException e) {
			t.rollback();//事务回滚
			e.printStackTrace();
		}finally{
			if(session!=null){
				session.close();
			}
		}
	}

这个地方只是简单的实现,如果还想要配置一些别的功能或者资源文件,需要使用自动动手使用java去编写,添加的方法很简单的,可以自己百度查,不过因为这样做很麻烦,且不方便,所以一帮使用xml文件的配置。

第二种是xml文件的配置

xml文件配置也有两种情况:

第一种情况是使用文件名hibernate.cfg.xml

另外一种是使用别的名字

--看配置(只是部分配置):

<?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/hibernate</property>
    <property name="connection.username">root</property>
    <property name="connection.password">maiyikai</property>
	<!-- 数据库方言 -->         
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
     <!-- 是否后台显示sql语句 -->   
    <property name="show_sql">true</property>
	<!-- 导入映射资源文件 -->    
    <mapping resource="com/myk/hibernate/Student.hbm.xml"/>
         
    </session-factory>
</hibernate-configuration>
再看看映射文件(映射文件的文件名一般是以*.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="com.myk.hibernate">
<!-- class设置关系映射表   name:映射路径   table="表名" -->
    <class name="Student" table="student">
    <!-- id定义的是主键列 name:表中的字段 -->
        <id name="id" column="id">
        	<!-- generator设置主键模式   class="主键的模式" -->
        	<generator class="assigned"></generator>
        </id>
        <!-- 定义其他字段 -->
        <property name="name"></property>
        <property name="age"></property>
    </class>
</hibernate-mapping>

在这里涉及到了主键的一种映射关系(来自: http://lqzit.iteye.com/blog/845163):

1:assigned:表示在新增数据时由应用程序指定主键的值。主要针对主键是采用自然主键的形式。这种方式,适用于主键列不是自动增长列。其缺点为在执行新增操作时,需查询数据库判断生成的主键是否已经存在。
2:increment:表示新增数据操作时由hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加上1.适用于采用代理主键形式的主键列。同样不能用于主键列是自动增长的表。但是,该主键生成策略也有些缺点。
(1)新增数据前先查询一遍,影响了性能。
(2)主键的类型只能为数值型的int或者long
(3)并发操作时的冲突问题。
3:identity:不如说是为sqlerver数据库量身定做的。主要适用于sqlserver数据库的自动增长列的表。
4:native:表示根据不同的数据库采用不同的主键生成策略。比如,当前数据库为sqlserver,则会采用identity,如为oracle,则采用oracle中的sequence等。区分数据库的不同是以hibernate主配置文件中sessionFactory中配置的数据库方言。
5.uuid: 唯一主键生成办法。从Hibernate中提取出来。
优点:避免了生成ID 时,与数据库的再次交道,性能上较高。但对于有的开发人员不太习惯这种id生成方式,UUID生成的32为的字符串,不同于identity 从1开始的整数。
 

Xml代码
1.<id name="实体类属性名" type="java.lang.Integer">  
2.      <column name="对应表中主键字段名" />  
3.      <generator class="assiged|increment|identity|native|........" />  
4.</id>  
<id name="实体类属性名" type="java.lang.Integer">
      <column name="对应表中主键字段名" />
      <generator class="assiged|increment|identity|native|........" />
</id>

采用hibernate的主键生成策略,就可以比较灵活和方便的对表中的主键字段进行操作了。而且,不同的数据库,不同的主键形式,也只需要修改下映射文件就可以了

配置文件和映射文件都写好了之后(部分实现代码):

/**
	 * 使用*.cfg.xml配置文件和映射文件
	 */
	@Test
	public void delete(){
		Configuration configuration = new Configuration().configure();//加载配置文件
		SessionFactory sessionFactory = configuration.buildSessionFactory();//建立sessionFactor
		Session session = sessionFactory.openSession();//打开session
		Transaction transaction = session.beginTransaction();//打开事务管理
		Student student = (Student) session.load(Student.class, 3);//加载类,按照id查找之后加载
		try {
			session.delete(student);
			transaction.commit();//事务提交
		} catch (HibernateException e) {
			transaction.rollback();//事务回滚
			e.printStackTrace();
		}finally{
			if(session!=null){
				session.close();
			}
		}
		
	}

/**
	 * 分页查询
	 */
	@Test
	public void pageSelect(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		int pageNo = 2;
		int pageNum = 2;
		try {
			//查询全部数据
			Criteria criteria = session.createCriteria(Student.class);
			criteria.setFirstResult((pageNo-1)*pageNum);//设置起始地记录位置
			criteria.setMaxResults(pageNo*pageNum);//设置终止的记录位置
			List<Student> list = criteria.list();
			System.out.println(list);
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}

/**
	 * 删除
	 * 使用*.cfg.xml配置文件和映射文件
	 */
	@Test
	public void delete(){
		Configuration configuration = new Configuration().configure();//加载配置文件
		SessionFactory sessionFactory = configuration.buildSessionFactory();//建立sessionFactor
		Session session = sessionFactory.openSession();//打开session
		Transaction transaction = session.beginTransaction();//打开事务管理
		Student student = (Student) session.load(Student.class, 3);//加载类,按照id查找之后加载
		try {
			session.delete(student);
			transaction.commit();//事务提交
		} catch (HibernateException e) {
			transaction.rollback();//事务回滚
			e.printStackTrace();
		}finally{
			if(session!=null){
				session.close();
			}
		}
		
	}
/**
	 * 条件查询
	 */
	@Test
	public void select(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		Student student = (Student) session.load(Student.class, 1);
		try {
			transaction.commit();
		} catch (HibernateException e) {
			transaction.rollback();
			e.printStackTrace();
		}finally{
			if(session!=null){
				session.close();
			}
		}
		
	}
	/**
	 * 查找
	 */
	@Test
	public void selectAll(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		try {
			//查询全部数据
			Criteria criteria = session.createCriteria(Student.class);
			criteria.addOrder(Order.asc("age"));//结果集排序
			List<Student> list = criteria.list();
			System.out.println(list);
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}
/**
	 * 条件查找
	 */
	@Test
	public void selectWhere(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		try {
			//查询全部数据
			Criteria criteria = session.createCriteria(Student.class);
//			criteria.add(Restrictions.eq("age", 22));//条件查询
//			criteria.add(Restrictions.eq("name", "qw"));//条件查询
			//多条件查询
			criteria.add(Restrictions.and(Restrictions.eq("name", "myk"), Restrictions.ge("age", 21)));
			List<Student> list = criteria.list();
			System.out.println(list);
		
		} catch (HibernateException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 列查询
	 */
	@Test
	public void selectCol(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		Criteria criteria = session.createCriteria(Student.class);
//		criteria.setProjection(Projections.property("age"));//设置查询列
		criteria.setProjection(Projections.projectionList().add(Projections.property("id")).add(Projections.property("name")));//设置多个查询了列
		List<Student> list = criteria.list();
		Iterator it = list.iterator();//迭代
		while(it.hasNext()){
			Object[] obj = (Object[]) it.next();
			System.out.println("id: "+obj[0]+" name: "+obj[1]);
		}
	}

@Test
	public void colSelect(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction transaction = session.beginTransaction();
		Criteria criteria = session.createCriteria(Student.class);
//		criteria.setProjection(Projections.sum("age"));//计算总和
//		int ages = (int) criteria.uniqueResult();//取值
//		System.out.println(ages);
//		criteria.setProjection(Projections.distinct(Projections.property("age")));//去重
//		Iterator it = criteria.list().iterator();
//		while(it.hasNext()){
//			System.out.println(it.next());
//		}
		//分组
//		criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("age")).add(Projections.rowCount(),"age"));
//		Iterator it = criteria.list().iterator();
//		while(it.hasNext()){
//			Object[] obj = (Object[]) it.next();
//			System.out.println("age: "+obj[0]+" count: "+obj[1]);
//		}
	}
@Test
	public void sessionSelect(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction teTransaction = session.beginTransaction();
		
		String sql = "select * from student";
		List<Student> list = new ArrayList<Student>();
		
		try {
			Query query = session.createSQLQuery(sql);
			Iterator iterator = query.list().iterator();
			while(iterator.hasNext()){
				Student student = new Student();
				Object[] object = (Object[]) iterator.next();
				student.setId(Integer.parseInt(object[0].toString()));
				student.setName(object[1].toString());
				student.setAge(Integer.parseInt(object[2].toString()));
				list.add(student);
			}
			
			System.out.println(list);
		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

@Test
	public void sessionQuery(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction teTransaction = session.beginTransaction();
		
		String hql = "from Student";
		List list = new ArrayList();
		
		Query query = session.createQuery(hql);
		list = query.list();
		System.out.println(list);
		
		Student s = new Student();
		
		if(session.contains(s)){
			System.out.println("s在缓存中");
		}else{
			System.out.println("s不再缓存中");
		}
	}
	/**
	 * 缓存机制
	 */
	@Test
	public void sessionContains(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		
		Student s = new Student();//建立持久化对象
		s = (Student) session.get("com.myk.hibernate.Student", 1);//条件获取
		System.out.println("缓存"+session.contains(s));
		session.clear();//清空缓存
		System.out.println("缓存"+session.contains(s));
	}
	
	/**
	 * 删除
	 */
	@Test
	public void sessiondelete(){
		Configuration configuration = new Configuration().configure();
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		Session session = sessionFactory.openSession();
		Transaction tx = session.beginTransaction();
		//创建一个持久化对象
//		Student s = (Student) session.createQuery("from Student where age = '22'").setMaxResults(1).uniqueResult();
//		session.delete(s);//单一删除
//		tx.commit();
		//批量删除
		List list = session.createQuery("from Student where name = 'myk'").list();
		Iterator iterator = list.iterator();
		while(iterator.hasNext()){
			Student s = (Student) iterator.next();
			session.delete(s);
		}
		tx.commit();
	}









等等等等都在文件里。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值