Hibernate的应用步骤:
1、导入.jar包
2、创建 entryBean <===bean.hbm.xml===>bean表 + hibernate.cfg.xml配置文件
3、写DAO数据操作类(类似下面的)
Hibernate框架实例化方法:
通过写实例化代码(非通过web.xml配置,通过web容器实例化)
public class HibernateUtils {
private static Configuration conf;
private static SessionFactory factory;
// conf 对象只要加载一次就可以了,如果放入 openSession 方法中效率会降低
static {
conf = new Configuration();//调用 Hibernate 的 API,用于装载 Hibernate 配置文件
conf.configure();//在类路径中装载默认的配置文件 hibernate.cfg.xml,如果配置文件关联了映射文件,同时也装载了映射信息
// conf.configure(new File("hibernate.cfg.xml"));//如果装载指定的配置文件
factory = conf.buildSessionFactory();//创建 SessionFactory
}
public static Session openSession() {
return factory.openSession();//创建 Session(Hibernate 提供的访问接口)
}
}
1:Hibernate的insert操作
Session session = HibernateSessionFactory.getSession();
News news = new News();
news.setContent("my content");
news.setTitle("my title");
news.setDate("my date"); //news是VO
Transaction trans = session.beginTransaction();
session.save(news); //news是PO
trans.commit(); //任何有关数据库更新的操作都是commit后进数据库的
HibernateSessionFactory.closeSession();
2:Hibernate的update操作
Session session = HibernateSessionFactory.getSession();
News news = new News();
news.setId(103); //id不可少,Hibernate只通过id来查找数据库
news.setContent("update content");
news.setTitle("update title");
Transaction trans = session.beginTransaction();
session.update(news);
trans.commit();
HibernateSessionFactory.closeSession();
注意这里我们更新数据不想对date进行更新,所以没写 setDate ,但Hibernate会认为我们是想把date设置为null,
所以如果要更新表中一些字段,最好用下面的方法。
Session session = HibernateSessionFactory.getSession();
Transaction trans = session.beginTransaction();
News news = (News)session.get(News.class, 103); //*****(1)
news.setDate("update date"); //*****(2)
session.save(news); //*****(3)
trans.commit();
HibernateSessionFactory.closeSession();
这里其实对数据库进行了两次操作,(1)时从数据库中把相应纪录查找出来,这里news是一个PO,
(2)对PO进行date的更新,其他数据没变,然后(3)保存,由于(1)查出的数据就有title,content,所以保存时候title和content都不会是null。
3:Hibernate的delete操作
void delete( int id) {
Session session = HibernateSessionFactory.getSession();
Transaction trans = session.beginTransaction();
// News news = new News();
// news.setId(8); //用下面那句效果一样,只是多了句select
News news = (News)session.get(News.class, id);
session.delete(news);
trans.commit();
HibernateSessionFactory.closeSession();
}
注意,只能通过id来删除数据,不能通过title或content来删除,会报缺少标示符错误。
使用hql来删除(可作批量删除)
Session session = HibernateSessionFactory.getSession();
String hql = "delete Billdetail where name>'detailName1'";
Query query = session.createQuery(hql);
int ref = query.executeUpdate();
session.beginTransaction().commit();
System.out.println("delete dates=>"+ref); //操作条数
session.close();
4:Hibernate的select操作 (查询返回的都是一个List集合),如:findById()
Hibernate的select操作非常丰富,这里写常用的:
1.criteria对象化查询 (适用情况:面向对象操作,革新了数据库操作方式,易读。缺点:适用面较HQL有限)
try{
Session session = HibernateSessionFactory.getSession();
Criteria c = session.createCriteria(News.class);//News是类,所以N大写
c.add(Expression.lt("date", "date5"));
c.add(Expression.between("date", "date1", "date8"));
c.addOrder(Order.desc("date"));
c.add(Restrictions.eq("aname",name));//eq是等于,gt是大于,lt是小于,or是或
c.add(Restrictions.eq("apassword", password));
List<News> list = c.list();
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i).getId()+":"+list.get(i).getDate());
}
}finally{
if(session !=null) session .close();
}
HibernateSessionFactory.closeSession();
比较符合面向对象的概念,因为库表和JAVA类已经作了映射关系,注意Hibernate的所有操作都是针对JAVA类的,而不是库表,所以要区分大小写。上面的查询相当于sql是:
select * from news where date < 'date5' and date BETWEEN 'date1' and 'date8' ORDER by date desc;
2.HQL查询 (hibernate自己的查询语言,和SQL语法接近,具有跨数据库的优点,仅适用于Hibernate框架)
try{
Session s=HibernateUtil.getSession();
//from后面是对象,不是表名
String hql="from Admin as admin where admin.aname=:name";//使用命名参数,推荐使用,易读。
Query query=s.createQuery(hql);
query.setString("name", name);
List<Admin> list=query.list();
/*
String hql = "from Test where id = "+id; String hql = "select user from Test as user where user.name like:name";
session = sessionFactory.openSession();
Query query = session.createQuery(hql);
//query.setInteger("id",id.intValue()); query.setString("name","%"+name+"%");
list = query.list();
*/
for(Admin admin:list){
System.out.println(admin.getAname());
}
}finally{
if(s!=null)
s.close();
}
HQL是Hibernate主推的查询方式,HQL中from后面的是JAVA类名,不是库表名,如果查询全字段 "select *" 可以省略不写。
当不是查询全字段,或者是从两张表中联合查询数据时,返回的是一个数组:
Session session = HibernateSessionFactory.getSession();
Query query = session.createQuery("select n.id,n.title,u.username from News as n,User u");
List list = query.list();//这里每一行都是一个1维数组
for(int i=0;i<list.size();i++)
{
Object []o = (Object[])list.get(i); //转型为数组
int id = (Integer)o[0]; //和select中顺序的类型相对应,可以是类
String title = (String)o[1];
String username = (String)o[2];
System.out.println("id:"+id+" , "+"title"+title+" , "+username);
}
HibernateSessionFactory.closeSession();
查询结果集的大小(和Hibernate2中稍微有点不同)
(Integer)session.createQuery("select count(*) from User").iterate().next();
3.SqlQuery查询 (适用:不熟悉HQL,不打算转数据库平台的朋友,万能方法 缺点:破坏跨平台不易维护不面向对象)
List sql() {
Session s = HibernateUtil.getSession();
Query q = s.createSQLQuery("select * from News").addEntity(User.News);
List<News> list = q.list();
s.close();
return list;
}
addEntity 不能忘记,这种查询方式是把查询好的结果放到一个实体中,再遍历操作,不推荐使用。
SqlQuery查询一些字段时候用addScalar:
SQLQuery query = session.createSQLQuery("select id,title from News");
query.addScalar("id", Hibernate.INTEGER); //注册字段类型,同下
query.addScalar("title",new org.hibernate.type.StringType());
List list = query.list();
for(int i=0;i<list.size();i++)
{
Object[] o = (Object[])list.get(i);
int id = (Integer)o[0];
String title = (String)o[1];
System.out.println("id:"+id+" , title:"+title);
}
javabean的属性可以作为命名的查询参数(HQL)
Session session = HibernateSessionFactory.getSession();
Transaction trans = session.beginTransaction()
Query query = session.createQuery("from room in class Room where room.name=:a")
query.setParameter("a", "room1"); //和prepareStatement相似
// Room room1 = new Room();
// room1.setName("room1");
// Query query = session.createQuery("from room in class Room where room.name=:name");
//如果用javabean设置参数来查询,=:name的name一定和Room中对应
// query.setProperties(room1);
List<Room> list = query.list();
for(int i=0;i<list.size();i++)
{
System.out.println(list.get(i).getName()+":"+list.get(i).getDescription());
}
trans.commit();
HibernateSessionFactory.closeSession()
4.动态分离查询DetachedCriteria (适用:面向对象操作,分离业务与底层不需要字段属性摄入到Dao实现层。 缺点:适用面较HQL有限)
static List dc(DetachedCriteria dc) {
Session s = HibernateUtil.getSession();
Criteria c = dc.getExecutableCriteria(s);
List rs = c.list();
s.close();
return rs;
}
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
int id = 1;
if (id != 0)
dc.add(Restrictions.eq("id", id));
Date age = new Date();
if (age != null)
dc.add(Restrictions.le("birthday", age));
List users = dc(dc);
System.out.println("离线查询返回结果:" + users);
5.例子查询
static List example(User user) {
Session s = HibernateUtil.getSession();
List<User> users = s.createCriteria(User.class).add(
Example.create(user)).list();
// List<User>
// users2=s.createCriteria(User.class).add((Example.create(user)).ignoreCase())
// .createCriteria("child").add((Example.create(user))).list();
return users;
}
6.命名查询 (适用:万能方法,有点像ibatis轻量级框架的操作,方便维护。 缺点:不面向对象,基于hql和sql有一定缺陷)
List namedQuery(int id) {
Session s = HibernateUtil.getSession();
Query q = s.getNamedQuery("getUserById");
q.setInteger("id", id);
return q.list();
}
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.sy.vo.User" table="user" catalog="news">
</class>
<!-- 命名查询:定义查询条件 -->
<query name="getUserById">
<![CDATA[from User where id=:id]]>
</query>
<!-- 命名查询中使用sql,不推荐使用,影响跨数据库
<sql-query name="getUserById2">
<![CDATA[select * from User where ]]>
</sql-query> -->
</hibernate-mapping>
相关推荐
2. **操作Session**:在Session中执行增删改查操作,注意使用try-with-resources语句确保资源关闭。 3. **事务管理**:使用Session的`beginTransaction()`、`commit()`和`rollback()`方法进行事务控制。 4. **查询...
1. **对象关系映射**:Hibernate通过XML配置文件或注解将Java类与数据库表进行映射,使得数据库操作可以通过对象的增删改查方法实现,无需编写SQL语句。 2. **Session接口**:作为主要的持久化层接口,Session提供...
3. CRUD操作:掌握如何通过Hibernate进行增删改查的基本操作。 4. 查询语言:理解HQL(Hibernate Query Language)和Criteria API,以及它们与SQL的关系和优势。 三、参考文档 文档是学习任何技术的重要资源。...
在实际开发中,这些组件共同协作,使得开发者可以通过简单的Java代码完成复杂的数据库操作,如增删改查、事务处理、查询优化等。例如,通过@Entity注解定义实体类,@Table指定对应的数据库表,@Id标识主键,然后使用...
它定义了Session接口,是应用程序与Hibernate交互的主要入口,提供了对持久化对象的增删改查操作。 2. **hibernate-entitymanager.jar**:提供了JPA(Java Persistence API)的实现,使得符合JPA规范的应用程序可以...
在"Struts2+Hibernate的增删改查"项目中,我们主要关注以下几个关键知识点: 1. **Struts2框架**:Struts2是一个基于MVC设计模式的Action驱动的Web应用框架,它提供了请求分发、拦截器链、结果视图管理等功能。在这...
4. 执行CRUD操作:利用Session接口进行增删改查操作,SessionFactory创建Session实例,Session与数据库交互。 5. 使用Transaction管理事务:在多条操作之间使用Transaction确保数据一致性。 三、JAR包详解 在...
在Java开发中,Hibernate 提供了一种便捷的方式来执行数据库的增删改查(CRUD)操作,使得程序员无需编写大量的JDBC代码,而是通过对象的方式进行数据库交互。 在“hibernate的增删改查代码”中,我们通常会涉及...
总结起来,"Hibernate+Struts 增删改查"涉及的主要知识点包括Hibernate的对象关系映射、持久化、会话管理、查询API以及Struts的MVC架构、Action、ActionForm、配置文件、拦截器和结果映射。这两个框架的结合,使得在...
`Session`对象是与数据库进行交互的接口,它提供了增删改查(CRUD)操作。 在`helloworld-annotation`目录下,可能会包含以下关键文件: - `pom.xml`或`build.gradle`:构建文件,包含了项目的依赖管理。 - `...
5. **操作数据**:通过Session实例进行数据的增删改查,使用Transaction管理事务。 总的来说,**hibernate-distribution-3.6.0.Final-dist**为Java开发者提供了一个强大的工具,使他们能够更加高效地处理数据库操作...
- **使用Session操作数据**:通过SessionFactory获取Session,执行增删改查操作,同时管理事务。 - **查询优化**:合理使用HQL和Criteria避免N+1查询问题,利用缓存提高查询效率。 - **异常处理**:处理Hibernate...
通过以上步骤,我们就可以实现一个基本的基于Struts2和Hibernate的增删改查应用。这种整合使得开发者可以专注于业务逻辑,而无需过多关注底层的数据库操作,提高了开发效率和代码的可维护性。然而,实际项目中可能还...
例如,使用Hibernate进行增删改查操作,只需简单调用实体对象的方法,大大提高了开发效率。 总结,Hibernate 4.3.0.Beta2版本以其强大的ORM功能和优化的性能,成为Java开发者的得力工具。通过深入理解并熟练运用其...
在这个"struts+hibernate+mysql做的增删改查小例子"中,我们将深入探讨这三个技术如何协同工作来实现数据的CRUD(Create、Read、Update、Delete)操作。 首先,Struts是一个基于MVC设计模式的Java框架,它主要用于...
【hibernate增删改查小例子】是一个基础的教程,旨在帮助初学者理解如何使用Hibernate框架进行数据库操作。Hibernate是Java开发中的一个强大的对象关系映射(ORM)框架,它简化了数据库交互,使开发者可以更专注于...
- **增删改查**:通过 Session 对象执行 CRUD 操作。 ```java Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tx = null; try { tx = session.beginTransaction(); User ...
在这个“struts+Hibernate+MySQL简单的增删改查例子”中,我们将探讨如何利用这些技术来实现一个基本的数据管理应用。 首先,Struts是一个基于MVC(Model-View-Controller)设计模式的Java Web框架。它负责处理HTTP...
在IT行业中,构建一个完整的Web应用常常涉及到多个技术的整合,本项目就是一个很好的例子,它采用了"Myeclipse+MySQL+Hibernate+Struts2"的技术栈来实现数据的增删改查功能。这是一个典型的企业级应用架构,适用于...