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>