今日学习:hibernate是什么
一、hibernate是什么
框架是什么:
1.框架是用来提高开发效率的
2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现.
3.所以框架可以理解成是一个半成品的项目.只要懂得如何驾驭这些功能即可.
hibernate框架是什么:

hibernate的好处:
操作数据库的时候,可以以面向对象的方式来完成.不需要书写SQL语句
hibernate是一款orm框架:
orm:object relationg mapping. 对象关系映射

orm分4级:
hibernate属于4级:完全面向对象操作数据库
mybatis属于2级
dbutils属于1级
二、hibernate框架的搭建
1.导包

驱动包

2.创建数据库,准备表,实体

3.书写orm元数据(对象与表的映射配置文件)
4.书写主配置文件(hibernate.cfg.xml)
com.mysql.jdbc.Driver jdbc:mysql:///hibernate_32 root 1234 org.hibernate.dialect.MySQLDialect true true update
5.书写代码测试
//测试Hibernate框架public class Demo {
@Test//保存客户public void fun1(){
Configuration conf = new Configuration().configure();
SessionFactory sessionFactory = conf.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();//----------------------------------------------Customer c = new Customer();
c.setCust_name("google公司");
session.save(c);//执行保存 //---------------------------------------------- tx.commit();
session.close();
sessionFactory.close();
}
}
三、配置文件详解
orm元数据
hibernate主配置:
必选属性配置(5个)
com.mysql.jdbc.Driver jdbc:mysql:///hibernate_32 root 1234 org.hibernate.dialect.MySQLDialect
可选属性配置(3个)
true true update
元数据引入配置
四、hibernateAPI详解
学习Configuration对象
//学习Configuration对象// Configuration功能: 配置加载类.用于加载主配置,orm元数据加载public class Demo {
@Testpublic void fun1(){//1 创建,调用空参构造Configuration conf = new Configuration();//2 读取指定主配置文件 => 空参加载方法,加载src下的hibernate.cfg.xml文件 conf.configure();//3 读取指定orm元数据(扩展),如果主配置中已经引入映射配置.不需要手动加载//conf.addResource(resourceName);//conf.addClass(persistentClass); //4 根据配置信息,创建 SessionFactory对象SessionFactory sf = conf.buildSessionFactory();
}
}学习SessionFactory对象
//学习SessionFactory对象// SessionFactory功能: 用于创建操作数据库核心对象session对象的工厂.// 简单说功能就一个---创建session对象//注意:1.sessionfactory 负责保存和使用所有配置信息.消耗内存资源非常大.// 2.sessionFactory属于线程安全的对象设计.//结论: 保证在web项目中,只创建一个sessionFactory.public class Demo2 {
@Testpublic void fun1(){//1 创建,调用空参构造Configuration conf = new Configuration();//2 读取指定主配置文件 => 空参加载方法,加载src下的hibernate.cfg.xml文件 conf.configure();//3 读取指定orm元数据(扩展),如果主配置中已经引入映射配置.不需要手动加载//conf.addResource(resourceName);//conf.addClass(persistentClass); //4 根据配置信息,创建 SessionFactory对象SessionFactory sf = conf.buildSessionFactory();//--------------------------------------------------//5 获得session//打开一个新的session对象 sf.openSession();//获得一个与线程绑定的session对象(明天讲解) sf.getCurrentSession();
}
}学习Session对象:增删查改
//学习Session对象//session对象功能: 表达hibernate框架与数据库之间的连接(会话).session类似于// JDBC年代的connection对象. 还可以完成对数据库中数据的增删改查操作.// session是hibernate操作数据库的核心对象public class Demo3 {
@Test//事务操作public void fun1(){//1 创建,调用空参构造Configuration conf = new Configuration().configure();//2 根据配置信息,创建 SessionFactory对象SessionFactory sf = conf.buildSessionFactory();//3 获得sessionSession session = sf.openSession();//4 session获得操作事务的Transaction对象//获得操作事务的tx对象//Transaction tx = session.getTransaction();//开启事务并获得操作事务的tx对象(建议使用)Transaction tx2 = session.beginTransaction();//----------------------------------------------
//----------------------------------------------tx2.commit();//提交事务tx2.rollback();//回滚事务session.close();//释放资源sf.close();//释放资源 }
@Test//session的新增public void fun2(){//1 创建,调用空参构造Configuration conf = new Configuration().configure();//2 根据配置信息,创建 SessionFactory对象SessionFactory sf = conf.buildSessionFactory();//3 获得sessionSession session = sf.openSession();//4 session获得操作事务的Transaction对象//获得操作事务的tx对象//Transaction tx = session.getTransaction();//开启事务并获得操作事务的tx对象(建议使用)Transaction tx2 = session.beginTransaction();//----------------------------------------------Customer c = new Customer();
c.setCust_name("传智播客");
session.save(c);//----------------------------------------------tx2.commit();//提交事务session.close();//释放资源sf.close();//释放资源 }
@Test//session的查询//查询id为1的customer对象public void fun3(){//1 创建,调用空参构造Configuration conf = new Configuration().configure();//2 根据配置信息,创建 SessionFactory对象SessionFactory sf = conf.buildSessionFactory();//3 获得sessionSession session = sf.openSession();//4 session获得操作事务的Transaction对象//获得操作事务的tx对象//Transaction tx = session.getTransaction();//开启事务并获得操作事务的tx对象(建议使用)Transaction tx2 = session.beginTransaction();//----------------------------------------------
Customer customer = session.get(Customer.class, 1l);
System.out.println(customer);//----------------------------------------------tx2.commit();//提交事务session.close();//释放资源sf.close();//释放资源 }
@Test//session的修改//修改id为1的customer对象的name属性为黑马程序员public void fun4(){//1 创建,调用空参构造Configuration conf = new Configuration().configure();//2 根据配置信息,创建 SessionFactory对象SessionFactory sf = conf.buildSessionFactory();//3 获得sessionSession session = sf.openSession();//4 session获得操作事务的Transaction对象//获得操作事务的tx对象//Transaction tx = session.getTransaction();//开启事务并获得操作事务的tx对象(建议使用)Transaction tx2 = session.beginTransaction();//----------------------------------------------//1 获得要修改的对象Customer c = session.get(Customer.class, 1l);//2 修改c.setCust_name("黑马程序员");//3 执行update session.update(c);//----------------------------------------------tx2.commit();//提交事务session.close();//释放资源sf.close();//释放资源 }
@Test//session的删除//删除id为1的customer对象public void fun5(){//1 创建,调用空参构造Configuration conf = new Configuration().configure();//2 根据配置信息,创建 SessionFactory对象SessionFactory sf = conf.buildSessionFactory();//3 获得sessionSession session = sf.openSession();//4 session获得操作事务的Transaction对象//获得操作事务的tx对象Transaction tx = session.getTransaction();
tx.begin();//开启事务并获得操作事务的tx对象(建议使用)Transaction tx2 = session.beginTransaction();//----------------------------------------------//1 获得要修改的对象Customer c = session.get(Customer.class, 1l);//2 调用delete删除对象 session.delete(c);//----------------------------------------------tx2.commit();//提交事务session.close();//释放资源sf.close();//释放资源 }
}
五、CRM练习:保存客户

前面的步骤参考前面的笔记。
5.思路分析

在完成作业之前可以先编写一个方便操作的工具类,免去重复的代码:
public class HibernateUtils {private static SessionFactory sf; static{//1 创建,调用空参构造Configuration conf = new Configuration().configure();//2 根据配置信息,创建 SessionFactory对象 sf = conf.buildSessionFactory();
} //获得session => 获得全新sessionpublic static Session openSession(){//3 获得sessionSession session = sf.openSession(); return session;
}//获得session => 获得与线程绑定的sessionpublic static Session getCurrentSession(){//3 获得sessionSession session = sf.getCurrentSession(); return session;
}public static void main(String[] args) {
System.out.println(HibernateUtils.openSession());
}
}作业核心代码:
web层:
/**
* Servlet implementation class AddCustomerServlet */public class AddCustomerServlet extends HttpServlet {private static final long serialVersionUID = 1L; private CustomerService customerService = new CustomerServiceImpl();protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1 获得参数并封装到Customer对象Customer c = new Customer();try {
BeanUtils.populate(c, request.getParameterMap());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}//2 调用Service保存客户 customerService.save(c);//3 重定向到客户列表response.sendRedirect(request.getContextPath()+"/ListCustomerServlet");
}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}service层:
public class CustomerServiceImpl implements CustomerService {private CustomerDao customerDao = new CustomerDaoImpl();public void save(Customer c) {//调用Dao保存客户 customerDao .save(c);
}
}dao层:
public class CustomerDaoImpl implements CustomerDao {public void save(Customer c) {//1 获得sessionSession session = HibernateUtils.openSession();//2 打开事务Transaction tx = session.beginTransaction();//3 执行保存 session.save(c);//4 提交事务 tx.commit();//5 关闭资源 session.close();
}
}










