API
百度百科上是这样定义API的:
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
那么API究竟是什么呢?
从本质上来说,任何能从自身环境中分离出来的软件都可以成为API中的“A”,且很可能它本身也是某种API。就这么说吧,你在代码中使用的是第三方库。一旦该库与你的代码整合在了一起,那么这个库也就成为了整体应用的一部分。作为软件中特殊的一部分,库很有可能也拥有一个API,使其与剩余代码进行交互。
在Object Oriented Design(面向对象编程)中,代码被编成了对象。你的应用程序也许拥有数百个能够实现交互的对象。
每一个对象都有一个API——这是一组公共方法和属性,对象可以用它来与应用中的其他对象进行交互。
从上述讨论的内容来看,我希望你能掌握API的广义.
Hibernate的核心API
Configuration:Hibernate配置对象
Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。
作用:
- 加载核心配置文件
Configuration cf = new Configuration().configure("hibernate.cfg.xml");
SessionFactory:Hibernate配置对象
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理(连接池),并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
SessionFactory内部维护了Hibernate的连接池的相关的配置(简单的理解)和二级缓存,是一个线程安全的对象.一个项目只需要一个SessionFactory就可以.所以我们需要抽取工具类,使用时候调用即可.
package cn.icnfox.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
public static final Configuration cfg;
public static final SessionFactory sf;
static {
cfg=new Configuration().configure("hibernate.cfg.xml");
sf=cfg.buildSessionFactory();
}
public static Session openSession() {
return sf.openSession();
}
}
工具类的测试
public void demo () {
Session session = HibernateUtils.openSession();//获取session对象
Transaction transaction = session.beginTransaction();//开启事务
/*
* 测试区域
* */
transaction.commit();//关闭事务
session.close();//关流
}
Session:Hibernate数据可连接对象
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
Session是Hibernate与数据库连接的对象,不是线程安全,所以不可以封装工具类,要定义到方法内部的变量,否则就会有线程安全问题.我们有必要单独说一下Session的API.
Transaction:Hibernate事务对象
Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。
Session 核心API
保存方法 save
Serializable save(Object obj) 返回一个Serializable(可序列化的ID):实际上是返回保存的数据的id(可以这么理解)
执行代码:
@Test
public void save() {
News news = new News();
news.setTitle("qqq");
news.setContent("123");
news.setPhoto("pic");
Serializable newsid = session.save(news);//返回值是最新插入的主键
System.out.println(newsid);
session.beginTransaction().commit();//提交
session.close();
}
执行结果:
Hibernate:
insert
into
news
(title, content, photo)
values
(?, ?, ?)
14
OID 查询方法 get load两种是有区别的
T get(class ,Serializable id) 传入一个类对象,Serializable id 返回一个泛型
传入一个不存在的id 会返回一个nill
采用的是立即加载,执行到这行代码,就立即发送SQL语句
返回的是真是对象本身
T load(class ,Serializable id) 传入一个类对象,Serializable id 返回一个泛型
传入一个不存在的id 会报错
具有延迟加载(懒加载)功能 即执行到这行代码,不会发送SQL语句 等到真正使用到这个对象的时候才会发送SQL语句.查询id 的时候也不会发送SQL语句,因为我们传入的就是主键id
返回的是代理对象
修改方法 update
void update(Object obj) 传入一个类对象,没有返回值
删除方法 delete
void delete(Object obj) 传入一个类对象,没有返回值
查询所有方法 createQuery(HQL)
HQL :Hibernate Query Language
//查询所有列的所有信息
String hql=" from News";//定义hql语句
Query q = session.createQuery(hql);//获得Query
List<News> newlist = q.list();//从query获得news集合
System.out.println(newlist);//打印
//查询某些列的所有信息
String hql=" select new News (nid,title) from News where nid=?";//定义sql语句 可以使用占位符的方法
Query q = session.createQuery(hql);//执行sql语句
q.setParameter(0, 10);//
News news = (News)q.uniqueResult();
System.out.println(news);
查询所有方法 Criteria
//Criteria查询
@Test
public void Crigetdemo1() {
Criteria cc = session.createCriteria(News.class);
List<News>nList=cc.list();
System.out.println(nList);
}
//Criteria查询 限定条件 模糊查询
@Test
public void Crigetdemo2() {
Criteria cc = session.createCriteria(News.class);
cc.add(Restrictions.like("title", "%w%"));
List<News>nList=cc.list();
System.out.println(nList);
}
//Criteria查询 限定条件 指定查询
@Test
public void Crigetdemo3() {
Criteria cc = session.createCriteria(News.class);
cc.add(Restrictions.eq("title", "今天是周五啦,高兴不?"));
List<News>nList=cc.list();
//News nList = (News)cc.uniqueResult();
System.out.println(nList);
}
//Criteria查询 限定条件 两个限定条件的第二种写法 第一种写法
@Test
public void Crigetdemo4() {
Criteria cc = session.createCriteria(News.class);
cc.add(Restrictions.eq("nid", 10));
cc.add(Restrictions.like("title", "%w%"));
List<News>nList=cc.list();
//News nList = (News)cc.uniqueResult();
System.out.println(nList);
}
//Criteria查询 限定条件 两个限定条件的第二种写法
@Test
public void Crigetdemo5() {
Criteria cc = session.createCriteria(News.class);
cc.add(Restrictions.and(Restrictions.eq("nid", 10),Restrictions.like("title", "%w%")));
//cc.add(Restrictions.eq("nid", 10));
//cc.add(Restrictions.like("title", "%w%"));
List<News>nList=cc.list();
//News nList = (News)cc.uniqueResult();
System.out.println(nList);
}
//Criteria查询 限定条件 在一个范围
@Test
public void Crigetdemo6() {
Criteria cc = session.createCriteria(News.class);
cc.add(Restrictions.in("id", 1,3,5));
List<News>nList=cc.list();
System.out.println(nList);
}