【idea2020.1.1】
hibernate是应用在DAO层的框架,之前用的DBUtils功能类似
【区分–>JavaEE的三层架构和MVC思想:
JavaEE三层结构:web层、service层、dao层;
MVC思想 m:模型,v:视图,c:控制器】
找到jar包
jar包获取:http://hibernate.org/orm/releases/
我用的是hibernate5.2
【链接:https://pan.baidu.com/s/1-OzVeT-6JDIYMy2ab3alXg
提取码:gsjz】
在网站上获取:以5.5为例
step1:
step2:进入之后往下滑动,选择自己想要的版本download
下载好的是压缩包的形式,解压后打开
required文件夹下是hibernate需要的jar包。
新建JavaWeb项目
其实这一步应该是第一步,不过问题不大
https://blog.youkuaiyun.com/qq_44641943/article/details/118379496
这是我建项目的步骤
往项目中导入jar包
step1
在WEB-INF下新建两个文件夹,classes用来放生成的class文件,lib用来放项目依赖的jar包(严格来说是,这个模块需要用的jar包)
【新建的只是普通文件夹】
step2
把hibernate需要的jar包和数据库连接需要的jar包复制到lib文件夹下之后,
选中lib之后,就会出现这一行,选中–>Apply
就可以看到导入的jar包如下图
关于classes文件夹如下,Apply即可
新建实体类
新建一个JavaBean,不要忘了setter、getter方法
(cid其实对应着主键)
创建实体类和数据库表的映射文件
使用hibernate时候,不需要自己手动创建表,hibernate帮助创建,怎么创建?答:使用配置文件完成配置实体类和数据库表一一对应关系(映射关系)。
配置文件是xml格式的,idea中new里找不到xml格式的文件,需要自己手动创建。
idea2020.1新建xml文件
映射配置文件名称和位置没有固定要求,但常用 “实体类名称.hbm.xml” (hbm : hibernate mapping)格式命名,且在实体类所在包里面创建
因为配置文件是xml格式的,所以在文件中需要引入xml约束,约束有两种,dtd和schema
这里需要引入的是dtd约束,引入的dtd约束在哪里找?【下方已放需引入的dtd约束部分】
第一步下载的压缩包解压之后
E:\hibernate\hibernate-release-5.2.18.Final\hibernate-release-5.2.18.Final\project\hibernate-core\src\main\resources\org\hibernate
把这个文件用写字板打开,建议不用记事本
把红框内的部分复制到自己新建的xml文件中,就是引入了dtd约束
【附红框内的内容】
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
接下来配置映射文件
这是我的整个的映射文件,已附详细注释
<?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>
<!-- 1 配置类和表对应
class标签
name属性:实体类全路径(包名+类名)【为防止写错,选中实体类的类名,
右键,Copy Reference,即已复制该类的全路径】
table属性:数据库表名称,自己起个名字
-->
<class name="com.hiber.bean.Client" table="t_Client">
<!-- 接下来配置类中属性和表中的字段对应-->
<!-- 2 配置实体类id和表id对应
hibernate要求实体类有一个属性唯一值
hibernate要求表有字段作为唯一值
-->
<!-- id标签
name属性:实体类里面id属性名称
column属性:生成的表字段名称
-->
<id name="cid" column="cid">
<!-- 设置数据库表id增长策略
native:生成表id值就是主键自动增长
-->
<generator class="native"></generator>
</id>
<!-- 配置其他属性和表字段对应
name属性:实体类属性名称
column属性:生成表字段名称
-->
<property name="cName" column="cName"></property>
<property name="cTelNum" column="cTelNum"></property>
<property name="cAddress" column="cAddress"></property>
</class>
</hibernate-mapping>
创建hibernate的核心配置文件
核心配置文件格式xml,但是核心配置文件名称和位置固定的
- 位置:必须src下面
- 名称:必须 hibernate.cfg.xml(cfg: configuration配置)
引入dtd约束,与上一步的dtd文件在同一个地方
附内容:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
hibernate操作过程中,只会加载核心配置文件,其他配置文件不会加载,也就是说上一步的映射配置文件不会被加载!所以,需要把映射配置文件引入到核心配置文件中
【需要自己手动创建数据库!】
这是我的 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>
<!-- 配置数据库信息 -->
<!--
下面的数据库信息的配置在哪里找?
E:\hibernate\hibernate-release-5.2.18.Final\hibernate-release-5.2.18.Final
\project\etc
找到hibernate.properties这个文件(文件里是键值对的形式)
下面四个分别是
数据库驱动(务必引入数据库驱动的jar包)
url,下面是个省略的写法,
完整的是jdbc:mysql://localhost:3306/hibernate_test(这是数据库名称)
数据库用户名
数据库密码
-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate_test</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!-- 配置hibernate信息 -->
<!-- 输出底层sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 输出底层sql语句格式 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate帮忙创建表是在配置了下句之后
update: 有表,更新,没表,就创建
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置数据库方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 把映射文件放到核心配置文件中 -->
<mapping resource="com/hiber/bean/client.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
【注:配置数据库方言那里,需要是MySQL5Dialect。自己可以试一下MySQLDialect 和 MySQL5Dialect 的区别,控制台会输出建表的sql语句,可以对比一下这两种有什么区别;结果就是MySQLDialect 无法创建数据表,还是希望大家自己尝试一下】
【关于引入映射配置文件那里,可以按住ctrl,单击,能跳转就是配置对了】
至此,所有的配置结束!
接下来,
测试
写个测试类
package com.hiber.bean;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
public class HibernateTest {
@Test
public void testAdd(){
//第一步 加载hibernate核心配置文件
// 到src下面找到名称是hibernate.cfg.xml
//在hibernate里面封装对象
Configuration cfg = new Configuration();
cfg.configure();
//第二步 创建SessionFactory对象
//读取hibernate核心配置文件内容,创建sessionFactory
//在过程中,根据映射关系,在配置数据库里面把表创建
SessionFactory sessionFactory = cfg.buildSessionFactory();
//第三步 使用SessionFactory创建session对象
// 类似于连接
Session session = sessionFactory.openSession();
//第四步 开启事务
Transaction tx = session.beginTransaction();
//第五步 写具体逻辑 crud操作
//添加功能
Client client = new Client();
client.setcName("小李");
client.setcTelNum("6666666");
client.setcAddress("北京");
//调用session的方法实现添加
session.save(client);
//第六步 提交事务
tx.commit();
//第七步 关闭资源
session.close();
sessionFactory.close();
}
}
最终的结果:
控制台输出创建表和添加数据的sql语句
红框的部分就是上边提到的数据库方言那里两种不同配置产生差异的地方。
同时,数据库里表已经被创建,数据已被添加
【不知道有没有人和我一样遇到添加到数据表里的中文数据是乱码的情况】
我的解决方法:
在hibernate核心配置文件中的url处添加:?characterEncoding=utf8
如果不成功的话,把数据库的属性设置一下,这样应该就没问题了!
【之前做的网站项目中,就经常遇到中文乱码的问题,一般从网页输入到后端代码的中文数据可以写个过滤器,操作数据库的话,最好参照上边写的,只是个人总结的,可能有所偏差】
至此,测试成功结束!(这只是测试,平常写代码的时候不要按照测试的那种方法写,之后更新实用的CRUD写法)