今天讲讲hibernate的简单使用

本文适合刚刚接触的hibetnate的小白哦.  

首先我们必须知道hibernate是什么?它能干什么?以及怎么用?

我们学习它之前必须明白一个思想 

下面是使用Hibernate的核心思想哦.
创建实体类对象.
通过配置文件描述对象和数据库表的关系
描述实体类对象的属性和数据库表的字段之间的关系.

首先hibernate是轻量级企业运用级的框架,它的作用是减少了代码量,因为程序员都是很懒的,

下面就简单介绍一下这个咋用的?

1 首先是环境的搭建也就是导入必须使用的jar包.和辅助的jar包.

2 然后创建实体类,

2. 创建实体
3. 描述实体和数据库表的关系映射文件
4. 描述实体和数据库表字段的关系映射文件
5. 创建hibernate的核心配置文件
 
5. 创建hibernate的核心配置文件
<!-- 1.基本四项 -->
<!-- 2. 7个其他配置 -->
<!-- 3.加载映射文件 -->
注意的是上图的第一个位置写的是该约束文件的路径  第二个必须选择URL  第三个参数需要打开该约束文件找到如下的地址填写进去哦
注意的是上图的第一个位置写的是该约束文件的路径 第二个必须选择URL 第三个参数需要打开该约束文件找到如下的地址填写进去哦
6 需要注意的是如果我们再配置xml文件里面配置的时候.如果是导入的是dtd的约束就必须再ecliplse里面添加路径.
下面是具体的配置的.
1.1.1 基本配置文件映射文件(配置的是实体和数据库之间的关系的.)
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入约束 --> 注意的是因为该文件是hebernate进行解析的所以现在最好放在同一个包下面.而且必须引入约束
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 
<!--
 
非记忆性知识
package 指明当前的配置文件 来源包
catalog 数据库(核心配置文件有) dao database access object    catalog access object
length 字段长度
type 属性的类型
1.hibernate写法  string
2.java写法 java.lang.String
3.数据库写法 varchar
一般不写 不写默认使用实体javaBean中的属性类型
<column name="cust_name" sql-type=""></column>
 -->
<hibernate-mapping package="com.itheima.domain" > //注意的是如果这里写这个属性.我们下面的实体就可以不写全限定类名了.不过我们不推荐这样写哦
<class name="Customer" table="cst_customer" lazy="false" > //注意的是因为上面写法这里可以不写实体类的全限定类名了哦
<!--
记忆性的知识
1.描述实体和数据库表的关系
class标签
name="实体类的全限定类名"
table="数据库的表名称"
lazy="true" 重要懒加载 (其实就是load查询的时候是否立即执行查询.如果是false就立即查询)
2.描述实体字段和数据库表字段的关系 
2.1 特殊字段(主键 外键)
2.2 普通字段
<id> 标签
name 实体类中的字段名称
column 数据库列名
<generator class="native"></generator> 主键生成策略  
native 表示使用数据库底层自增策略  (非常重要)
mysql 数据库 使用auto_increment
oracle 数据库没有auto_inrement 使用的序列 sequence
 
普通属性
name 实体类中的字段名称
column 数据库列名
此处实体字段名称应该是驼峰式的 去掉下划线 首字母大写
如果实体类的字段名  数据库的字段名一样  column 可以省略
 -->-->
<id name="cust_id" column="cust_id">
<generator class="native"></generator>
</id>
<!--
<property name="cust_name"   ></property>
<property name="cust_source" column="cust_source"></property>
<property name="cust_industry"></property> 如果实体类的字段名  数据库的字段名一样  column 可以省略
<property name="cust_level"></property>
<property name="cust_phone"></property>
<property name="cust_mobile"></property>
</class>
</hibernate-mapping>
 
=====================================================================================
1.1.1 核心配置文件其他配置
<?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> 以后操作api肯定需要有对象 比如 曾经的connection queryRunner
sessionFactory session的工厂  作用 : 创建session对象 session对象以后就是用来操作api
内部封装了很多访问数据库的api
 -->
<session-factory>
<!-- 1.基本四项 -->加载sql的相关配置.这个不需要记住.只需要再
hibernate-release-5.0.7.Final\hibernate-release-5.0.7.Final\project\etc\hibernate.properties.打开这个文件搜索就可以了.
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///ee288_hibernate_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 2.其他配置 6个 -->
<!--
方言
所有的数据库 有一套统一的语法 但每一个数据库有自己的特色 
比如mysql 有主键自增 分页limit  
 oracle使用序列 行的概念
操作数据库sql hibernate自动生成 所以需要配置方言 hibernate生成语句的时候 根据不同的数据库生成不同语句
 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 显示执行的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql -->
<property name="hibernate.format_sql">true</property>
<!--
ddl: 数据库定义语言 作用 创建表 删除表 创建数据库....
没用:(测试本地自己使用)
create-drop:
每一次操作完数据库先判断表是否存在 如果存在 删除 
再次创建一张新表 操作完以后 删除表 保证数据库没有任何表和数据
测试使用
create
每一次操作完数据库先判断表是否存在 如果存在 删除 
再次创建一张新表 操作完以后 保证数据库中只有一条数据
测试使用
有用:
update   : 以实体映射文件为主 以实体映射文件的配置修改数据库(如果不写默认这个的)
validate : 以数据库的数据表为主  如果和数据库不一致 数据如果有约束 会报错
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--
C3P0连接池
配置以下的代码报错
org.hibernate.service.spi.ServiceException: Unable to create requested service
[org.hibernate.engine.jdbc.connections.spi.ConnectionProvider]
原因没有导入c3p0jar
 -->
<!-- <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> -->
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<!-- 3.加载映射文件 -->
<mapping resource="com/itheima/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
 
============================================================================================================== 
Hibernate的对象详解
/**
 * 对象详解
 */
@Test
public void demo2(){
/**
 * Configuration 目的 加载配置文件
 * new Configuration() 默认加载src hibernate.properties
 * .configure() 加载hibernate.cfg.xml 配置文件
 * .configure("路径") 加载指定路径下的 hibernate.cfg.xml 配置文件
 * //configuration.addResource("com/itheima/domain/Customer.hbm.xml")
 * //configuration.addClass(Customer.class);//要求映射文件名称必须是 实体名.hbm.xml
 *
 */ Configuration 目的 加载配置文件 .configure() 加载 hibernate.cfg.xml 配置文件
Configuration configuration = new Configuration().configure();
/**
 * 通过Configuration 构建session工厂  因为 核心配置文件有 基本四项
 * sessionFactory 目的:用来创建session对象  工厂不需要关闭
 */
SessionFactory sessionFactory = configuration.buildSessionFactory();
/**
 * session 会话 java和数据库产生会话
 * session内部封装了大量的操作数据库的api
 * 查询对象
 * session.createQuery(arg0) HQL hibernate query language
 * session.createSQLQuery(arg0)    SQL语法
 * session.createCriteria(arg0)    QBC  query by Criteria
 */
Session session = sessionFactory.openSession();
/**
 * Transaction 事务 hibernate 要求 所有地方全部加上事务
 */
Transaction transaction = session.beginTransaction();
transaction.commit();//事务的提交
//transaction.rollback();
//释放资源
session.close();
sessionFactory.close();
}
===================================================================================================================
3 Hibernate工具类
package com.itheima.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration 
/**
 * 工具类的作用 对外提供session对象
 */
public class HibernateUtils {
 
private static SessionFactory sessionFactory = null;
static{
try {
//加载配置文件
Configuration configuration = new Configuration().configure();
//构建session工厂
 sessionFactory = configuration.buildSessionFactory();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException();
 * 提供方法
public static Session openSession(){
return sessionFactory.openSession(); //这不是事物级别的session
这是返回的是绑定了当前线程的session对象。但是如果一旦提交了事物就失效了哦
public static Session getSession() {
return factory.getCurrentSession();
};
======================================================================================================举例 
 * 查询 get
 
 * 保存 save
//1 创建customer对象
customer customer =new customer();
//设置cust_name的值.主键自己生成的.因为native
customer .setCust_name("盼盼12");
//通过session对象里面的API执行保存
session.save(customer);
//通过session对象获得事物对象。
Transaction transaction= session.beginTransaction();
//提交事物.需要注意的是如果是通过get方法获取的session对象.事物提交他会自动关闭session对象的不需要我们再去关闭的哦.
transaction .commit();
 * 修改 update
这里也有二种方式.不过我们一般使用的是获得该该对象,然后通过实体的set方法修改之后,再通过session调用update方法修改(以后常用的)
//通過工具類獲取session對象.
//Session session = HibernateUtils.getSession();
Session session = HibernateUtils.optionSession();
//获得需要修改的实体对象.
Customer customer = session.get(Customer.class, 99L);
customer.setCust_name("林了");//修改值
session.update(customer);
Transaction transaction= session.beginTransaction();
//提交事物.需要注意的是如果是通过get方法获取的session对象.事物提交他会自动关闭session对象的不需要我们再去关闭的哦.
transaction .commit();
 * 删除 delete
1 方式1 创建一个实体对象.然后通过set方法,赋值需要删除的数据库的该字段的主键.然后调用delete方法进行删除.不过不适用于多表的情况下.
customer customer =new customer();
//赋值一个oid 这个id就是我们需要删除的该条数据的主键
customer .setCust_id(96L);
//通过session对象里面的API执行保存
session.delete(customer);
//通过session对象获得事物对象
Transaction transaction= session.beginTransaction();
//提交事物.需要注意的是如果是通过get方法获取的session对象.事物提交他会自动关闭session对象的不需要我们再去关闭的哦.
transaction .commit();
方式2 是通过该oid获得这个对象.然后再删除这个实体对象的方式.
//因为hibernate是基于对象的思想操作的的
//通过session对象获得实体对象
Customer customer = session.get(Customer.class, 98L);
//然后调用删除的方法进行删除
session.delete("cust_name",customer); 注意的是这里有二个参数,和一个参数的区别是什么哪?
Transaction transaction= session.beginTransaction();
//提交事物.需要注意的是如果是通过get方法获取的session对象.事物提交他会自动关闭session对象的不需要我们再去关闭的哦.
transaction .commit();

 

posted on 2017-11-14 20:52  傲余  阅读(288)  评论(0)    收藏  举报

导航