hibernate学习(3)——api详解对象(2)

1、   Transaction 事务

事务的操作:

开启事务 beginTransaction()

获得事务 getTransaction()

提交事务:commit()

回滚事务:rollback()

package com.alice.hibernate01.api;

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

public class TracnsactionTest {
	@Test
	//Transaction 封装了事务的操作
		//开启事务
		//提交事务
		//回滚事务
     public void openTest(){
		//1加载配置
				Configuration  conf = new Configuration().configure();
				//2 根据Configuration 配置信息创建 SessionFactory
				SessionFactory sf = conf.buildSessionFactory();
				//3 获得session
				Session session = sf.openSession();
				//-------------------------------
				//打开事务
				Transaction ts = session.beginTransaction();
				//获得已经打开的事务对象(很少用)
				session.getTransaction();
				
				
				//Transaction 控制如何关闭事务
				//提交
				ts.commit();
				//回滚
				ts.rollback();
				
				
				//-------------------------------
				session.close();
				sf.close();
     }
     
	
	@Test
	public void transactionTest2(){
		//1加载配置
		Configuration  conf = new Configuration().configure();
		//2 根据Configuration 配置信息创建 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 获得session,获得与当前线程绑定的session
		Session session = sf.getCurrentSession();
		//事务关闭时,会自动把与当前线程关联的session关闭,并删除
		 session.beginTransaction().commit();
		 
		//在获得当前线程绑定的session时. 获得的是新的session
		Session session1 = sf.getCurrentSession();
		
		System.out.println(session != session1);
		//-------------------------------
				session.close();
				sf.close();
	}
}

2、   Query对象

1  hibernate执行hql语句

2  hql语句:hibernate提供面向对象查询语句,使用对象(类)和属性进行查询。区分大小写。

3 获得 session.createQuery("hql")

4 方法:

       list()  查询所有

       uniqueResult() 获得一个结果。如果没有查询到返回null,如果查询多条抛异常。

       setFirstResult(int) 分页,开始索引数startIndex

       setMaxResults(int) 分页,每页显示个数 pageSize

package com.alice.hibernate01.api;

import java.util.List;

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

import com.alice.hibernate01.hello.User;

public class QueryTest {
    @Test
    public void sqlQueryTest(){
        //1加载配置
        Configuration conf = new Configuration().configure();
        //2 根据Configuration 配置信息创建 SessionFactory
        SessionFactory sf = conf.buildSessionFactory();
        //3 获得session
        Session session = sf.openSession();
        //打开事务
        Transaction trac = session.beginTransaction();
        
        Query query = session.createQuery("from User");
        
        //分页 limit index,count;
        //指定结果从第几个开始拿
        query.setFirstResult(0);
        //指定拿几个结果
        query.setMaxResults(2);
        
        //query.list() 将hql语句执行,并返回结果(多行)
//        List<User> list = query.list();
//        System.out.println(list);
        
        //uniqueResult 将hql语句执行,并返回结果(一行)
        User user = (User) query.uniqueResult();
        System.out.println(user);
        
         trac.commit();
         //关闭资源
         session.close();
         sf.close();
    }
}

3、  Criteria对象(了解)

1、QBC(query by criteria),hibernate提供纯面向对象查询语言,提供直接使用PO对象进行操作

2、 获得方式:Criteria criteria = session.createCriteria(User.class);

3、  条件

      criteria.add(Restrictions.eq("username", "tom"));

//    Restrictions.gt(propertyName, value)    大于

//    Restrictions.ge(propertyName, value) 大于等于

//    Restrictions.lt(propertyName, value) 小于

//    Restrictions.le(propertyName, value) 小于等于

// Restrictions.like(propertyName, value)  模糊查询,注意:模糊查询值需要使用 % _

package com.alice.hibernate01.api;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

import com.alice.hibernate01.hello.User;

public class CretiariaTest {
    @Test
    public void queryTest() {
        // 1加载配置
        Configuration conf = new Configuration().configure();
        // 2 根据Configuration 配置信息创建 SessionFactory
        SessionFactory sf = conf.buildSessionFactory();
        // 3 获得session
        Session session = sf.openSession();
        // 打开事务
        Transaction ts = session.beginTransaction();

        // --------------------------------------------------------
        // Criteria 查询 => Hibernate独创的面向对象的查询=> 无语句
        Criteria criteria = session.createCriteria(User.class);

        // select * from t_user;
        // list() 将查询执行,并返回结果(多行)
        // List<String> list = criteria.list();
        // System.out.println(list);

        // 查找name属性值为tom的 记录
        criteria.add(Restrictions.eq("name", "aaaa"));
        // 返回一个查询结果
        User user = (User) criteria.uniqueResult();
        System.out.println(user);

        // 提交事务
        ts.commit();

        // 关闭资源
        session.close();
        sf.close();

    }

    @Test
    public void criteriaTest2() {
        // Cretiaria对象 与 Query对象功能很像
        // 控制查询
        // 1加载配置
        Configuration conf = new Configuration().configure();
        // 2 根据Configuration 配置信息创建 SessionFactory
        SessionFactory sf = conf.buildSessionFactory();
        // 3 获得session
        Session session = sf.openSession();
        // 打开事务
        Transaction ts = session.beginTransaction();

        // --------------------------------------------------------
        // Criteria 查询 => Hibernate独创的面向对象的查询=> 无语句
        Criteria criteria = session.createCriteria(User.class);
        // 查找名字中包含字母l的用户
        criteria.add(Restrictions.like("name", "%l%"));

        List<User> list = criteria.list();
        System.out.println(list);

        // ---------------------------------------------------------
        // 提交事务
        ts.commit();

        // 关闭资源
        session.close();
        sf.close();
    }
    
    @Test
    //Cretiaria对象 与 Query对象功能很像
        //>  gt
        //< lt
        //= eq
        //>= ge
        //<= le
        //like 
    public void criteriaTest3() {
        // Cretiaria对象 与 Query对象功能很像
        // 控制查询
        // 1加载配置
        Configuration conf = new Configuration().configure();
        // 2 根据Configuration 配置信息创建 SessionFactory
        SessionFactory sf = conf.buildSessionFactory();
        // 3 获得session
        Session session = sf.openSession();
        // 打开事务
        Transaction ts = session.beginTransaction();

        // --------------------------------------------------------
        // Criteria 查询 => Hibernate独创的面向对象的查询=> 无语句
        Criteria criteria = session.createCriteria(User.class);

        criteria.add(Restrictions.gt("id", 2));

        List<User> list = criteria.list();

        System.out.println(list);
        // ---------------------------------------------------------
        // 提交事务
        ts.commit();

        // 关闭资源
        session.close();
        sf.close();
    }
}

4、封装工具类

package com.alice.hibernate01.hibernateutil;

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

//完成Hibernate工具类
//封装配置文件读取操作
//封装Sessionfactroy创建操作
//封装session获得操作
public class HibernateUtil {
	// 会话工厂,整个程序只有一份
	private static SessionFactory sf;
	static {
		// 1加载配置
		Configuration conf = new Configuration().configure();
		// 2 根据Configuration 配置信息创建 SessionFactory
		sf = conf.buildSessionFactory();
		//3 关闭虚拟机时,释放SessionFactory
		Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {

			@Override
			public void run() {
				System.out.println("虚拟机关闭!释放资源");
				sf.close();

			}
		}));
	}
	/*
	 * 获得一个新的session
	 * @return
	 */
     public static Session openSession() { 
    	 // 3 获得session
		Session session = sf.openSession();
		return session;
	}
     /**
 	 * 获得当前线程中绑定session
 	 * * 注意:必须配置
 	 * @return
     */
	public static Session getCurrentSession() {
		Session session = sf.getCurrentSession();
		return session;
	}

	// 测试
	public static void main(String args[]) {
		Session session = openSession();
		System.out.println(session);
	}
}

5、 核心配置文件详解

<!-- SessionFactory,相当于之前学习连接池配置 -->
	<session-factory>
		<!-- 1 基本4项 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql:///h_day01_db</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">1234</property>
	
		<!-- 2 与本地线程绑定 -->
		<property name="hibernate.current_session_context_class">thread</property>
 
 		<!-- 3 方言:为不同的数据库,不同的版本,生成sql语句(DQL查询语句)提供依据 
 			* mysql 字符串 varchar
 			* orcale 字符串 varchar2
 		-->
 		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
		
		<!-- 4 sql语句 -->
		<!-- 显示sql语句 -->
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
	
		<!-- 5 自动创建表(了解) ,学习中使用,开发不使用的。
			* 开发中DBA 先创建表,之后根据表生产 PO类
* 取值:
			update:【】
				如果表不存在,将创建表。
				如果表已经存在,通过hbm映射文件更新表(添加)。(映射文件必须是数据库对应)
					表中的列可以多,不负责删除。
			create :如果表存在,先删除,再创建。程序结束时,之前创建的表不删除。【】
			create-drop:与create几乎一样。如果factory.close()执行,将在JVM关闭同时,将创建的表删除了。(测试)
			validate:校验 hbm映射文件 和 表的列是否对应,如果对应正常执行,如果不对应抛出异常。(测试)
		-->
		<property name="hibernate.hbm2ddl.auto">create</property>
		
		<!-- 6 java web 6.0 存放一个问题
			* BeanFactory 空指针异常
				异常提示:org.hibernate.HibernateException: Unable to get the default Bean Validation factory
			* 解决方案:取消bean校验
		-->
		<property name="javax.persistence.validation.mode">none</property>
	
		<!-- 添加映射文件 
			<mapping >添加映射文件
				resource 设置 xml配置文件 (addResource(xml))
				class 配置类 (addClass(User.class)) 配置的是全限定类名
		-->
		<mapping  resource="com/itheima/a_hello/User.hbm.xml"/>
	</session-factory>

  

posted on 2016-11-30 16:48  小企鹅ITgo  阅读(225)  评论(0编辑  收藏  举报