您的位置:首页 > 数据库 > Oracle

Oracle核心配置详解以及常用API

2018-01-25 15:06 344 查看
1.Hibernate中我们使用时主要有两种配置文件

核心配置文件 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")));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: