【JAVAEE学习笔记】hibernate01:简介、搭建、配置文件详解、API详解和CRM练习:保存客户
今日学习: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)
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <!--
- #hibernate.dialect org.hibernate.dialect.MySQLDialect
- #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
- #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
- #hibernate.connection.driver_class com.mysql.jdbc.Driver
- #hibernate.connection.url jdbc:mysql:///test
- #hibernate.connection.username gavin
- #hibernate.connection.password
- -->
- <!-- 数据库驱动 -->
- <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
- <!-- 数据库url -->
- <property name="hibernate.connection.url">jdbc:mysql:///hibernate_32</property>
- <!-- 数据库连接用户名 -->
- <property name="hibernate.connection.username">root</property>
- <!-- 数据库连接密码 -->
- <property name="hibernate.connection.password">1234</property>
- <!-- 数据库方言
- 不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
- sql99标准: DDL 定义语言 库表的增删改查
- DCL 控制语言 事务 权限
- DML 操纵语言 增删改查
- 注意: MYSQL在选择方言时,请选择最短的方言.
- -->
- <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
- <!-- #hibernate.show_sql true
- #hibernate.format_sql true
- -->
- <!-- 将hibernate生成的sql语句打印到控制台 -->
- <property name="hibernate.show_sql">true</property>
- <!-- 将hibernate生成的sql语句格式化(语法缩进) -->
- <property name="hibernate.format_sql">true</property>
- <!--
- ## auto schema export 自动导出表结构. 自动建表
- #hibernate.hbm2ddl.auto create 自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
- #hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
- #hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
- #hibernate.hbm2ddl.auto validate 校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
- -->
- <property name="hibernate.hbm2ddl.auto">update</property>
- <!-- 引入orm元数据
- 路径书写: 填写src下的路径
- -->
- <mapping resource="cn/xyp/domain/Customer.hbm.xml" />
- </session-factory>
- </hibernate-configuration>
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元数据
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
- <!-- 配置表与实体对象的关系 -->
- <!-- package属性:填写一个包名.在元素内部凡是需要书写完整类名的属性,可以直接写简答类名了. -->
- <hibernate-mapping package="cn.xyp.domain" >
- <!--
- class元素: 配置实体与表的对应关系的
- name: 完整类名
- table:数据库表名
- -->
- <class name="Customer" table="cst_customer" >
- <!-- id元素:配置主键映射的属性
- name: 填写主键对应属性名
- column(可选): 填写表中的主键列名.默认值:列名会默认使用属性名
- type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
- 每个类型有三种填法: java类型|hibernate类型|数据库类型
- not-null(可选):配置该属性(列)是否不能为空. 默认值:false
- length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
- -->
- <id name="cust_id" >
- <!-- generator:主键生成策略(明天讲) -->
- <generator class="native"></generator>
- </id>
- <!-- property元素:除id之外的普通属性映射
- name: 填写属性名
- column(可选): 填写列名
- type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
- 每个类型有三种填法: java类型|hibernate类型|数据库类型
- not-null(可选):配置该属性(列)是否不能为空. 默认值:false
- length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
- -->
- <property name="cust_name" column="cust_name" >
- <!-- <column name="cust_name" sql-type="varchar" ></column> -->
- </property>
- <property name="cust_source" column="cust_source" ></property>
- <property name="cust_industry" column="cust_industry" ></property>
- <property name="cust_level" column="cust_level" ></property>
- <property name="cust_linkman" column="cust_linkman" ></property>
- <property name="cust_phone" column="cust_phone" ></property>
- <property name="cust_mobile" column="cust_mobile" ></property>
- </class>
- </hibernate-mapping>
hibernate主配置:
必选属性配置(5个)
- <!-- 数据库驱动 -->
- <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
- <!-- 数据库url -->
- <property name="hibernate.connection.url">jdbc:mysql:///hibernate_32</property>
- <!-- 数据库连接用户名 -->
- <property name="hibernate.connection.username">root</property>
- <!-- 数据库连接密码 -->
- <property name="hibernate.connection.password">1234</property>
- <!-- 数据库方言
- 不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
- sql99标准: DDL 定义语言 库表的增删改查
- DCL 控制语言 事务 权限
- DML 操纵语言 增删改查
- 注意: MYSQL在选择方言时,请选择最短的方言.
- -->
- <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
可选属性配置(3个)
- <!-- #hibernate.show_sql true
- #hibernate.format_sql true
- -->
- <!-- 将hibernate生成的sql语句打印到控制台 -->
- <property name="hibernate.show_sql">true</property>
- <!-- 将hibernate生成的sql语句格式化(语法缩进) -->
- <property name="hibernate.format_sql">true</property>
- <!--
- ## auto schema export 自动导出表结构. 自动建表
- #hibernate.hbm2ddl.auto create 自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
- #hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
- #hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
- #hibernate.hbm2ddl.auto validate 校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
- -->
- <property name="hibernate.hbm2ddl.auto">update</property>
元数据引入配置
- <!-- 引入orm元数据
- 路径书写: 填写src下的路径
- -->
- <mapping resource="cn/xyp/domain/Customer.hbm.xml" />
四、hibernateAPI详解
学习Configuration对象
- //学习Configuration对象
- // Configuration功能: 配置加载类.用于加载主配置,orm元数据加载
- public class Demo {
- @Test
- public 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 {
- @Test
- public 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 获得session
- Session 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 获得session
- Session 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 获得session
- Session 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 获得session
- Session 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 获得session
- Session 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 => 获得全新session
- public static Session openSession(){
- //3 获得session
- Session session = sf.openSession();
- return session;
- }
- //获得session => 获得与线程绑定的session
- public static Session getCurrentSession(){
- //3 获得session
- Session 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 获得session
- Session session = HibernateUtils.openSession();
- //2 打开事务
- Transaction tx = session.beginTransaction();
- //3 执行保存
- session.save(c);
- //4 提交事务
- tx.commit();
- //5 关闭资源
- session.close();
- }
- }
【JAVAEE学习笔记】hibernate01:简介、搭建、配置文件详解、API详解和CRM练习:保存客户的更多相关文章
- JAVAEE学习——hibernate01:简介、搭建、配置文件详解、API详解和CRM练习:保存客户
今日学习:hibernate是什么 一.hibernate是什么 框架是什么: 1.框架是用来提高开发效率的 2.封装了好了一些功能.我们需要使用这些功能时,调用即可.不需要再手动实现. 3.所以框架 ...
- Docker学习笔记之一,搭建一个JAVA Tomcat运行环境
Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...
- Android Studio 学习笔记(一)环境搭建、文件目录等相关说明
Android Studio 学习笔记(一)环境搭建.文件目录等相关说明 引入 对APP开发而言,Android和iOS是两大主流开发平台,其中区别在于 Android用java语言,用Android ...
- Linux内核学习笔记-1.简介和入门
原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)
原博主博客地址:http://blog.csdn.net/qq21497936本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78516 ...
- Solr 6.7学习笔记(02)-- 配置文件 managed-schema (schema.xml) -- 样例(6)
managed-schema 样例: <?xml version="1.0" encoding="UTF-8" ?> <!-- License ...
- Solr 6.7学习笔记(02)-- 配置文件 managed-schema (schema.xml)(3)
5. <fieldType> fieldType主要定义了一些字段类型,其name属性值用于前面<field>中的type属性的值.e.g. <fieldTyp ...
- Solr 6.7学习笔记(02)-- 配置文件 managed-schema (schema.xml) - filter(5)
自定义fieldType时,通常还会用到filter.filter必须跟在tokenizer或其它filter之后.如: <fieldType> <analyzer> < ...
- hadoop学习笔记壹 --环境搭建及配置文件的修改
Hadoop生态和其他生态最大的不同之一就是“单一平台多种应用”的理念了. hadoop能解决是什么问题: 1.HDFS :海量数据存储 MapReduce: 海量数据分析 YARN :资源管理调 ...
随机推荐
- vue router-link 上添加点击事件
在vue学习中遇到给router-link 标签添加事件@click .@mouseover等无效的情况 我想要做的是鼠标移上去出现删除标签,移除标签消失的效果 原代码: <router-lin ...
- iOS多线程的三种方法
前言 在多线程简介中,我已经说明过了,为了提高界面的流畅度以及用户体验.我们务必要把耗时的操作放到别的线程中去执行,千万不要阻塞主线程.iOS中有以下3种多线程编程方法: NSThread Grand ...
- 【Java 并发】详解 ThreadPoolExecutor
前言 线程池是并发中一项常用的优化方法,通过对线程复用,减少线程的创建,降低资源消耗,提高程序响应速度.在 Java 中我们一般通过 Exectuors 提供的工厂方法来创建线程池,但是线程池的最终实 ...
- Xamarin.Android 绑定友盟社会化分享组件
Xamarin.Android 绑定友盟社会化分享组件 最近在开发博客园Android App的时候需要用到友盟社会化分享组件,在github上搜了一下都没有找到最新版本绑定好的项目,就自己动手来绑定 ...
- Javascript中this关键字
this 是谁调用的时候,指定的是谁,通俗一点讲就是,函数是谁执行是不是由其中一个对象点出来的那就是代表它, 比如执行对象a中b函数a.b();这个b函数中this代表a; 当换成var c=a.b; ...
- JQuery 根据ID在页面中定位
1.锚点跳转简介 锚点其实就是可以让页面定位到某个位置上的点.在高度较高的页面中经常见到.比如百度的百科页面,wiki中的page内容. 我知道实现锚点的跳转有两种形式,一种是a标签+name属性:还 ...
- Python 基础 四 面向对象杂谈
Python 基础 四 面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...
- haproxy安装配置for mysql负载均衡(ubantu)
1.安装pcre apt-get update (apt-get install openssl libssl-dev ==>可能需要安装的依赖包) apt-get install libpc ...
- POJ1006: 中国剩余定理的完美演绎(非原创)
问题描述 人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天.一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好.通常这三个周期的峰值不会是同一天.现在给出 ...
- js获取一组不重复的随机数的方法
一.基本思路: 建立一个数组存放所有可以取到的值,每次从该数组中随机取走一个,放到新的数组中,直到完成. 二.实现方法 1.方法一: (1)创建一个数组arr,数组元素为所有可能出现元素的集合: (2 ...