先去Hibernate官网下载 http://hibernate.org/orm/ 初学推荐下载稳定版 已踩坑 用的是 hibernate-release-5.4.0
目录:
documentation 相关文档
lib 相关jar包其中
project 一些提供的项目
第一步
创建一个Java项目 导入 lib\required 中的包到项目中
第二步
配置hibernate.cfg.xml文件
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
上面这块内容我们可以在刚刚导入的lib里面的jar包中的 hibernate-core-5.4.0.Final.jar(每一个版本可能名字可能有点不一样)中org.hibernate下面 hibernate-configuration-3.0.dtd 中找到 加了这个约束后下面就可以联想了
<hibernate-configuration>
<session-factory>
<!--数据库方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!--数据库连接地址我用的是mysql 8.0.13的jar包所以用的这个如果您用的是更老版本网上都有自行百度-->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/ssh?serverTimezone=GMT%2B8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</property>
<!--是否打印sql-->
<property name="hibernate.show_sql">true</property>
<!--打印sql是否格式化-->
<property name="hibernate.format_sql">true</property>
<!--自动创建表-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--设置事务的隔离级别-->
<property name="hibernate.connection.isolation">4</property>
<!--创建session绑定当前线程-->
<property name="current_session_context_class">thread</property>
<!--映射对应的类-->
<mapping resource="com/xiaonuo/domain/Customer.hbm.xml" />
</session-factory>
</hibernate-configuration>
上面这块内容 可以在\project\etc\hibernate.properties找到对应的不同数据库的 也可以直接复制我的 但最好自己找一下
<session-factory>是和数据库的一个连接
etc 里的hibernate.properties 有很多数据库相关的配置
第三步
配置映射对应的类的Customer.hbm.xml文件
同样在上面这块内容我们可以在刚刚导入的lib里面的jar包中的 hibernate-core-5.4.0.Final.jar(每一个版本可能名字可能有点不一样)中org.hibernate下面 hibernate-mapping-3.0.dtd 中找到 加了这个约束后下面就可以联想了
在mapping中cust_id是主键 class name是对应的类 table是对应的数据库表名 其中generator 的class属性很重要 这边我放个大佬链接自行去看相关的参数所带来的作用 https://www.cnblogs.com/xlwmin/articles/2189427.html
在使用native 或者 identity 首先保证是不是数据库的字段支持自动递增
我开始用的框架版本是最新6.0.0的版本 结果导致在使用native 一直告诉我类型无法转换(数据库和Java中的类型当然都已经改成了int了)查了2个多小时还没有找到解决方法 最终换回了 5.4.0 解决了以后如果有解决方法我再贴出来暂时学习的时候还是用这个稳定版本。我试过不自动增长设置自己插入主键是可以实现的,就是自动增长会报错 native他应该自动给我匹配到了identity所以应该是identity这个的问题
<?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">
<hibernate-mapping>
<class name="com.xiaonuo.domain.Customer" table="customer">
<!--建立类属性哪一个是主键-->
<id name="cust_id" column="cust_id" type="long">
<generator class="native" />
</id>
<!--普通属性和数据库进行关联-->
<property name="cust_industry" column="cust_industry"/>
<property name="cust_level" column="cust_level"/>
<property name="cust_name" column="cust_name"/>
<property name="cust_source" column="cust_source"/>
<property name="cust_phone" column="cust_phone"/>
<property name="cust_mobile" column="cust_mobile"/>
</class>
</hibernate-mapping>
第四步 创建了实体类(用了lombok实现了get、set减少了代码冗余)
import lombok.Getter;
import lombok.Setter;
//setting->Build,Execution,Deployment->Compiler->Annotation Processors
//找到上面的路径右边Enable annotation processing 打上勾支持注解
@Setter@Getter
public class Customer {
private Long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_phone;
private String cust_mobile;
}
第五步 测试(这边有个单元测试用了org.junit.Test)
package com.xiaonuolen.test;
import com.xiaonuo.domain.Customer;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
public class HibernateTest {
@Test
public void test1(){
//1.加载核心配置文件
Configuration configure = new Configuration().configure();
//2.创建sessionFactory --工厂类
SessionFactory sessionFactory = configure.buildSessionFactory();
//3.获取session对象 --连接对象
Session session = sessionFactory.openSession();
//4.创建一个对象相当于插入一个记录
Customer customer = new Customer();
customer.setCust_name("sgw");
customer.setCust_level("2");
//5.保存
session.beginTransaction();//开始一个事务 这句代码我用6.0时候测试是需要的 而换了老版本发现不用也能实现效果
session.save(customer);//保存
session.getTransaction().commit();//只是根据session获得一个Transaction实例,然后通过commit提交
//6.释放资源
session.close();
sessionFactory.close();
}
}
总结:初识了Hibernate框架的确比之前写方便了很多,感觉自己还是太弱了一个下午才弄完了遇见错误如果没有百度自己找很难找的到,能够定位哪里错了却没有办法在不改变版本的情况下解决。
2019.1.13更新
第六步 配置本地dtd
用的IDEA 首先先复制出来hibernate-core-5.4.0.Final.jar 中的hibernate-configuration-3.0.dtd 和 hibernate-mapping-3.0.dtd文件 我放在了工程的目录下面 然后先复制 xml文件中的对应的dtd的网址
接着 file->settings-Languages & Frameworks->Schemas and DTDs 点击右边的加号选择对应的文件 url放刚刚复制的地址 别对应错了 作用是在不联网的情况下也可以用依赖 mapping和configuration都需要
第七步 配置log的文件
作用就是能更能看清楚打印出来的信息 主要的文件是log4j.properties 和 log4j-1.2.16.jar包 两个 直接导入即可
其中的log4j.rootLogger 中的属性
第八步 配置C3P0连接池
1.框架下->lib->optional->c3p0 复制jar包到工程里面
2.添加配置 同样是在hibernate.cfg.xml中 这边提一下一个遇见的一个 可能是版本不同 c3p0和教学视频的位置是不一样
他的是org.hibernate.connection.C3P0ConnectionProvider 这边我是找不到这个 然后找到了下面的 测试了发现也是可以用
<!--配置c3p0-->
<property name="connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<!--在连接池中可用的数据库连接的最少数目 -->
<property name="c3p0.min_size">5</property>
<!--在连接池中所有数据库连接的最大数目 -->
<property name="c3p0.max_size">20</property>
<!--设定数据库连接的过期时间,以秒为单位,
如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
<property name="c3p0.idle_test_period">3000</property>