zoukankan      html  css  js  c++  java
  • 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>
    

      

  • 相关阅读:
    57. 插入区间
    1117. H2O 生成
    1114. 按序打印
    185. 部门工资前三高的所有员工
    453. 最小移动次数使数组元素相等
    简单中缀算数表达式求值
    悬停显示title-获取日期时间
    v-pre&v-cloak&v-once添加属性-禁止值改变 v-once
    v-html & v-text普通命令
    过滤器串联执行-加参数
  • 原文地址:https://www.cnblogs.com/snowwang/p/6115830.html
Copyright © 2011-2022 走看看