今天讲讲hibernate的简单使用
本文适合刚刚接触的hibetnate的小白哦.
首先我们必须知道hibernate是什么?它能干什么?以及怎么用?
我们学习它之前必须明白一个思想
下面是使用Hibernate的核心思想哦.
创建实体类对象.
通过配置文件描述对象和数据库表的关系
描述实体类对象的属性和数据库表的字段之间的关系.
首先hibernate是轻量级企业运用级的框架,它的作用是减少了代码量,因为程序员都是很懒的,
下面就简单介绍一下这个咋用的?
1 首先是环境的搭建也就是导入必须使用的jar包.和辅助的jar包.
2 然后创建实体类,
2. 创建实体
3. 描述实体和数据库表的关系—映射文件
4. 描述实体和数据库表字段的关系—映射文件
5. 创建hibernate的核心配置文件
5. 创建hibernate的核心配置文件
<!-- 1.基本四项 -->
<!-- 2. 7个其他配置 -->
<!-- 3.加载映射文件 -->
注意的是上图的第一个位置写的是该约束文件的路径 第二个必须选择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]
原因没有导入c3p0的jar包
-->
<!-- <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>
==============================================================================================================
2 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();
浙公网安备 33010602011771号