Oracle核心配置详解以及常用API
2018-01-25 15:06
344 查看
1.Hibernate中我们使用时主要有两种配置文件
核心配置文件 Hibernate.cfg.xml
2.Hibernate核心接口和类,常用API
核心配置文件 Hibernate.cfg.xml
对于Hibernate的核心配置文件他有两种配置方式 1.Hibernate.cfg.xml 2.hibernate.properties 使用比较多的方式是:Hibernate.cfg.xml,原因是配置能力强,易于修改。 --主要是Hibernate.cfg.xml 1.可以加在数据库相关信息 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernateTest</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">1234</property> 2.Hibernate相关配置 <!-- 可以将向数据库发送的SQL显示出来 --> <property name="hibernate.show_sql">true</property> <!-- 格式化SQl --> <property name="hibernate.format_sql">true</property> <!--Hibernate 方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 3.加载映射文件 <!-- 配置Hibernate的映射文件所在的位置 --> <mapping resource="Csutomer.hbm.xml"/> 对于Hibernate.cfg.xml配置文件中的内容可以参考hibernate\project\etc\hibernate.properties. 4000 ## auto schema export #hibernate.hbm2ddl.auto create-drop #hibernate.hbm2ddl.auto create #hibernate.hbm2ddl.auto update #hibernate.hbm2ddl.auto validate 配置这个属性后,我们可以进行表的自动创建。 create-drop 每次都会创建一个新的表,执行完成后删除,一般用于测试。 create 每次都会创建一个新的表,一般在测试。 update 如果数据库中有表,不创建,没有表,就创建,如果映射不匹配,会自动更新表结构,注意只能添加。 validdate只会使用存在的表,并且会对映射关系进行校验。 --映射配置文件 xxx.hbm.xml 映射配置文件它的文件名称试试类名.hbm.xml。它一般防止在实体类所在的包下面。这个配置文件的主要作用就是建立表和类的映射关系。 1.同意声明包名,这样在<class>中就不需要写类名。 <hibernate-mapping package="domain"> 2.关于<class>标签配置 Name:属性类的全名 table:类的名称,可以省略,这时表的名称与类名一致。 catalog:属性数据库名称,可以省略,如果省略,参考和芯片日志文件中url路径中的库名称。 3.关于<id>标签 首先它必须存在,<id>适用于建立类中的属性和表中的主键映射。 name类中的属性名称。 column表中的主键名称 column它可以省略,这时列名就与类中属性名称一致。 length 字段长度 type属性,指定类型 <generator>它主要是描述主键生成策略 4.关于<property>标签 主要是描述类中属性和表中非主键的映射关系。 关于Hibernate的映射文件中类型问题 对于type属性它的取值,可以分为三种: -java中的数据类型 -Hibernate中的数据类型 - SQL的数据类型。
2.Hibernate核心接口和类,常用API
Hibernate的核心类和接口以供有6个,分别为:session、sessionfactory、transaction、Query、Criteria和configuration。这6个核心类和接口在任何开发中都会用到。 1. Configuration 主要用于加载Hibernate的配置。 Configuration config = new Configuration().config(); 主要是加载src下:hibernate.cfg.xml Configuration config = new Configuration(); 主要是用于加载hibernate.property; Configuration config = new Configuration().config(核心配置文件名称); 加载指定的名称的配置I文件。 问题:我们是在hibernate.cfg.xml文件中有xxx.hbm.xml文件的位置。如果我们使用的是hibernate.properties这种核心配置,它如何加载映射关系。 config.addResource("domain/Customer.hbm.xml");直接加载映射配置为文件。 Configuration config = new Configuration().config(); config.addClass(Customer.class);//这种方式会直接找实体类所在包下查找规范映射配置文件。 2. SessionFactory 首先,sessionfactory通过configuration获得。 //2.1创建Configuration来加载到配置文件 Configuration config = new Configuration().configure(); //2.2得到sesssionfactory Sessionfactory sessionfactory = config。buildsessionfactory(); sessionFactory接口负责初始化Hibernate,它充当数据存储源的代理,并负责创建session对象。这里用到了工厂模式。需要注意的是sessionfactory并不是轻量级的,因为一般情况下,一个项目通常需要一个sessionfactory就够了,当需要操作多个数据库时,可以为每一个数据库制定一个sessionfactory。 通过sessionfactory可以得到session。 Session : openSession() Session : getCurrentSession() 获取一个与线程绑定的session sessionfactory它不是轻量级的,不要频繁创建和关闭它。在一个项目中有一个sessionfactory就可以,通过sessionfactory来获取session操作。 问题:怎样保证在一个项目中所使用的sessionfactory是同一个? public class HibernateUtils{ private static Configuration config; private static Sessionfactory sessionfactory; static{ config = new Configuration().configure(); sessionFactory = config.buildSessionFactory(); } public static Session openSession(){ return sessionfactory.openSession(); } } 问题:Sessionfactory内部还维护一个连接池,如果我们想要使用C3P0连接池,应该怎么处理? 1.我们要导入C3P0的jar包,在hibernate\lib\options下有关于C3P0连接池的Jar包。 2.在Hibernate.cfg.xml文件中配置C3P0连接 可以查看etc/hibernate.properties中关于C3P0的配置。 <设置连接提供者> <property name="hibernate.connnection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <C3P0连接池的设置> <property name="hibernate.c3p0.max_size">20</property> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.timeout">120</property> <property name="hibernate.c3p0.idle_test_period">3000</property> Session session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但是需要注意的是session对象是非线程安全的。 我们只需要在方法内部来使用session就可以。 问题:session如何获取到? sessionfactory.opensession();//相当于直接通过SessionFactory创建一个新的Session,使用后完成要手动调用close()来关闭。 SessionFactoryCurrentSession();获取一个与线程绑定的session当我们提交或事务回滚后自动关闭。 Session常用方法: save:保存对象 Update 修改操作 delete 删除 get/load 根据id进行查询。 saveOrUpdate 执行save或者update createQuery() 获取一个Query对象 CreateSQLQuery()获取一个可以操作SQL的SQLQuery对象。 CreateCriterial()获取一个criteria它可以获取条件查询。 - Transaction Transaction接口主要用于管理事务,他是Hibernate的事务接口,对底层的事务进行了封装。使用它可以用于进行事务操作。 commit : 事务提交 rollback : 事务回滚 问题:如果回去一个Transaction对象 Session.beginTransaction(); 问题:如果在程序中没有开启事务,是否存在事务? 有失误,session的每一个操作都会开启一个事务。 默认情况下事务是不会自动提交的。 默认不启动 <property name="hibernate.connection.autocommit">false</property> 事务自动提交 <property name="hibernate.connection.autocommit">true</property> - Query Query接口让你方便地对数据库及持久对象进行查询,他可以有两种表达方式:HQL语言或者本地数据库的SQL语句。Query经常被用来绑定查询参数,限制查询记录数量。并最终执行查询操作。 通过Query主要完成查询操作。 我们通过Query可以执行hql语句 Query query = Session.createQuery(hql); 下面这个可以执行SQl语句 SQLQuery sqlQuery = Session.createSQLQuery(sql); SQLQuery是Query的子命令 --查询所有操作使用HQL @Test public void test01(){ Session session = hibernateUtils.openSession(); Query query = session.createQuery("from Csutomer");//from后面加的是类名 List<Csutomer> list = query.list(); System.out.println(list); session.close(); } --使用HQL向表中插入100条记录 @Test public void test02(){ Session session = hibernateUtils.openSession(); for (int i = 0; i < 100; i++) { Csutomer csutomer = new Csutomer(); csutomer.setName("Wilson"+i); csutomer.setAddress("china"+i); session.save(csutomer); } session.getTransaction().commit(); session.close(); } --分页查询 -- 一页显示10条,要得到第二页数据 @Test public void test03(){ Session session = hibernateUtils.openSession(); session.beginTransaction(); //一页显示10条,要得到第二页的数据 Query query = session.createQuery("from Csutomer"); query.setFirstResult(11); query.setMaxResults(10); List<Csutomer> list = query.list(); System.out.println(list); session.getTransaction().commit(); session.close(); } --查询指定列信息 // 查询制定列的信息 @Test public void test04(){ Session session = hibernateUtils.openSession(); session.beginTransaction(); Query query = session.createQuery("select name from Csutomer");//这是我们得到的不再是Csutomer对象,而是Object[] List<Object[]> list = query.list(); System.out.println(list); session.getTransaction().commit(); session.close(); } //问题:我们可以不可以得到List<Customer>,我们要想得到这个结果,可以使用Hibernate中投影查询。我们只需要在Csutomer类中提供的name与address作为参数的构造方法。 //List<Csutomer> list = query.list(); select name,address from Csutomer;得到的是List<Object[]>结果 要想得到List<Csutomer>结果 1.在Csutomer类中生成以name,address为参数的构造,注意,无参数构造也要有。 2.Select new Csutomer(name,address) from Csutomer; --条件查询 可以使用where关键字 // 查询制定列的信息 @Test public void test05(){ Session session = hibernateUtils.openSession(); session.beginTransaction(); // Query query = session.createQuery("from Csutomer where name=?");//这是我们得到的不再是Csutomer对象,而是Object[],无名参数查询。 Query query = session.createQuery("from Csutomer where name=:myname");//有名参数查询。 // 对参数进行赋值 query.setParameter("myname", "Wilson19"); // List<Csutomer> list = query.list(); // 如果能保证结果就是唯一的,那么可以使用 Csutomer csutomer = (Csu d4e3 tomer) query.uniqueResult(); System.out.println(csutomer); session.getTransaction().commit(); session.close(); } 无名称参数 from Csutomer where name=? 对其进行赋值 query.setParameter(0,"Wilson19"); 有名参数 from Csutomer where name=:myname 对其进行赋值 query.setParameter("myname","wilson19"); 如果查询结果可以保证唯一的,我们可以使用query.uniqueResult()来得到一个单独的对象。 --执行本地SQl // 执行本地SQL @Test public void test06(){ Session session = hibernateUtils.openSession(); session.beginTransaction(); SQLQuery sqlQuery = session.createSQLQuery("select * from t_csutomer"); // List<Object[]> list = sqlQuery.list(); // System.out.println(list); // 想要将结果封装到Csutomer对象中 sqlQuery.addEntity(Csutomer.class); List<Csutomer> list = sqlQuery.list(); System.out.println(list); session.getTransaction().commit(); session.close(); } // 执行本地SQL --条件查询 @Test public void test07(){ Session session = hibernateUtils.openSession(); session.beginTransaction(); SQLQuery sqlQuery = session.createSQLQuery("select * from t_csutomer where name=?"); // 对参数进行赋值 sqlQuery.setParameter(0, "Wilson19"); sqlQuery.addEntity(Csutomer.class); // List<Csutomer> list = sqlQuery.list(); // System.out.println(list); Csutomer csutomer = (Csutomer) sqlQuery.uniqueResult(); System.out.println(csutomer); session.getTransaction().commit(); session.close(); } 要想执行本地SQL SQLQuery sqlQuery = session.createSqlQuery(String sql); 使用addEntity方法来将结果封装到指定对象中,如果不封装,得到的是List<Object> 如果sql中有参数,我们使用setparameter方法完成参数传递。 如果结果就是一个可以使用uniqueResult()来得到一个单独对象。 --Criteria Criteria与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能再session之外执行。 // 测试Criteria @Test public void test08(){ Session session = hibernateUtils.openSession(); session.beginTransaction(); // 得到Criteria Criteria criteria = session.createCriteria(Csutomer.class); List<Object[]> list = criteria.list(); System.out.println(list); session.getTransaction().commit(); session.close(); } // 测试Criteria @Test public void test08(){ Session session = hibernateUtils.openSession(); session.beginTransaction(); // 得到Criteria Criteria criteria = session.createCriteria(Csutomer.class); List<Object[]> list = criteria.list(); System.out.println(list); // 分页查询 // criteria.setFirstResult(); // criteria.setMaxResults(arg0); // 多条件查询 criteria.add(Restrictions.eq("name", "Wislon19"));//where name = "Wilson19"; Csutomer csutomer = (Csutomer) criteria.uniqueResult(); System.out.println(csutomer); criteria.add(Restrictions.or(Restrictions.eq("name", "Wilson19"),Restrictions.eq("address", "china19"))); List<Csutomer> list2 = criteria.list(); System.out.println(list2); session.getTransaction().commit(); session.close(); } 查询所有操作: Session.createCriteria(实体类。class)得到一个Criteria对象,调用list查询所有 分页操作与Query的方法一样 setFirstResult() setMaxResult() 条件查询 criteria.add(Restrictions.eq("name","xxxx")); criteria.add(Restrictions.or(Restrictions.eq("name", "Wilson19"),Restrictions.eq("address", "china19")));
相关文章推荐
- hibernate教程--常用配置和核心API详解
- JAVAWEB开发之Hibernate详解(一)——Hibernate的框架概述、开发流程、CURD操作和核心配置与API以及Hibernate日志的使用
- JAVAWEB开发之Hibernate详解(一)——Hibernate的框架概述、开发流程、CURD操作和核心配置与API以及Hibernate日志的使用
- SwaggerAPI注解详解,以及注解常用参数配置
- oracle init.ora常用配置详解
- Struts2框架(一)架构、文件配置、核心API详解
- Oracle与Sql Serer的链接桥梁之透明网关的部署与配置详解(四)透明网关核心配置
- [js高手之路] es6系列教程 - Map详解以及常用api
- SQL Server 常用日期函数DateDiff()、GetDate() 以及oracle 日期常用函數 (SYSDATE、日期格式)等详解
- Oracle ASM 概念、配置及常用管理命令详解
- oracle init.ora常用配置详解
- es6系列教程_ Map详解以及常用api介绍
- Oracle ASM 概念、配置及常用管理命令详解
- JAVAWEB开发之工作流详解(二)——Activiti核心API的使用(流程定义和流程实例的管理、流程变量、监听器...)以及与Spring的集成
- Oracle 10G中关于表操作常用语句详解以及一点随想
- Nginx核心配置文件常用参数详解
- gVim安装以及核心配置文件详解
- oracle init.ora常用配置详解
- OpenGL之画三角形以及常用API详解。
- Hibernate核心配置文件常用配置详解