“两个蝴蝶飞”特别喜欢"java1234知识分享网"小峰的实用主义,所以本文及其系列文章均是采用实用主义,从项目和代码的角度去分析。由于本人经验有限,嘴皮子不溜,所以学术性,概念性,底层性的知识点暂时不做介绍。文章中有错误之处,欢迎拍砖和指点。特别感谢"java1234知识分享网 "和"黑马程序员官网",所有的资料大部分是两者提供,为了方便书写,故不一一指名出处,请谅解,非常抱歉。
上一章简单介绍了FastJson在Java后端方面解析使用(二),如果没有看过,请观看上一章
一 Hibernate简单介绍
Hibernate是数据库层框架,做持久化操作。 以前所讲的Struts2是Web层框架。 是全自动的ORM框架,可以自动生成SQL语句,完成CRUD操作。
二 Hibernate的下载地址
官方下载地址是: http://hibernate.org/orm/releases/5.2/
下载完成后的目录结构是:
其中documentataion表示的是开发文档,在里面有一个javadocs/index.html 文件,这是首页。
点击进去之后,可以方便的查看Hibernate官方给出的API.
lib文件夹,存储的是关于Hibernate开发中,经常用到的Jar包。 有一个required文件夹,表示必须的。开发中,将required文件夹下的所有Jar包全部复制到项目工程中去。 一共是10个。
与C3P0整合的Jar包在\lib\optional\c3p0文件夹下。(C3P0连接池)
与EhCache整合的Jar包在\lib\optional\ehcache文件夹下。(Cache缓存)
Project文件夹为Hibernate所给的一些事例,具体为相关Jar包的源代码。(开源啊,开源啊。赞赞赞)
里面有一个etc文件夹,下面为一些常用的配置文件
三 ORM对象关系映射
ORM,指得是Object Relation Mapping 对象关系映射。 简单的来说,就是将以前对具体数据表的操作转换成对相应的实体的操作。 如对数据表User进行相应的CRUD操作,转换成对User类JavaBean的相应的操作。 会进行相应的映射。
将表------>映射成实体 将视图------->映射成实体。 将表中字段------->映射成实体的属性
将表与表之间的外键,一对多,多对多,一对一关系映射成实体类之间的一对多,多对多,一对一关系。
四 开发环境的具体搭建
四.一 创建项目所对应的数据库
Hibernate只会自动创建表,不能创建数据库。所以数据库必须要自己手动创建。 利用Navicat For MySQL工具创建一个数据库,取名称为hibernate。 采用utf-8编码方式。
四.二 导入相应的Jar包(新建普通的Java项目即可)
四.三 创建相应的实体类 如User类
在pojo包下,创建User.java
package com.yjl.pojo;
import java.io.Serializable;
/**
@author: 两个蝴蝶飞
@date: 2018年9月29日 下午7:53:39
@Description Hibernate操作时相应的实体类,实现序列化
*/
public class User implements Serializable{
private static final long serialVersionUID = 1L;
/**
* @param 主键id 用Integer包装类
* @param userName 用户名
* @param password 密码
* @param sex 性别
* @param age 年龄
* @param description 相关描述
*/
private Integer id;
private String userName;
private String password;
private String sex;
private Integer age;
private String description;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
四.四 创建User.hbm.xml文件
在与实体类User同级的目录下,即也在pojo包下,创建一个配置文件.xml, 取名称为实体类.hbm.xml。
创建User.hbm.xml文件:
<?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 package="com.yjl.pojo">
<!-- 具体的实体类 -->
<class name="User" table="user">
<!-- 主键 -->
<id name="id" column="id">
<generator class="native"></generator>
</id>
<!-- 其余属性 -->
<property name="userName"></property>
<property name="password"></property>
<property name="sex" ></property>
<property name="age"></property>
<property name="description"></property>
</class>
</hibernate-mapping>
四.五 创建Hibernate配置文件 hibernate.cfg.xml
这个文件是Hibernate官方定义的文件,不能改名称.(与Spring整合后可以改,但也不建议改),且必须要放在src目录下,即源文件目录下。 其中cfg指的是 config的缩写。
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>
<!-- 关于数据库的相应配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?characterEncoding=utf8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">abc123</property>
<!-- 关于Hibernate的相应配置 -->
<!-- 引入方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.format_sql">true</property>
<!-- 引入相应的约束文件 ctrl点击时可以正确进入-->
<mapping resource="com/yjl/pojo/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
四.六 创建SessionFactory对象
在service包下,创建一个基本的CreateTest类进行测试。 用Junit4进行测试。
一定要创建到SessionFactory对象。 当出现这个对象时,才会执行自动创建表。
package com.yjl.service;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
/**
@author: 两个蝴蝶飞
@date: 2018年9月29日 下午8:30:59
@Description 测试创建User表是否成功
*/
public class CreateTest {
@Test
public void createTest(){
//获取配置
Configuration config=new Configuration();
config.configure();
//创建sessionFactory对象,要到session这一步。
SessionFactory sessionFactory=config.buildSessionFactory();
}
}
四.七 Junit启动createTest方法,进行测试
在进行测试时,出现了两个相当大的问题。
一 添加Log4j2.xml文件
报的错误是:
ERROR StatusLogger No log4j2 configuration file found.
Using default configuration: logging only errors to the console.
搜索网上的答案,需要创建一个log4j2.xml文件。 log4j.properties文件不好使。 将log4j.properties文件改成log4j2.properties文件也不好使。只有创建log4j2.xml文件。
在src下,必须是src下创建一个log4j2.xml文件。内容是:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%m%n" />
</Console>
</Appenders>
<Loggers>
<!-- 修改级别为DEBUG -->
<Root level="DEBUG">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
二 报创建表时搜索引擎的问题 (楼主MySQL版本为5.5 5.1也会报这个错误。其余版本请忽略)
将log4j2.xml文件添加成功之后,运行时,出现:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server
version for the right syntax to use near 'type=MyISAM' at line 9
查看了一下MySQL中my.ini中文件的引擎值,为
其实,这是与MySQL无关的。 是Hibernate自己的问题。
在5.5和5.1版本时,MySQL创建的引擎是MyISAM。 其余版本是INNODB。 故其余版本请忽略这个问题。
问题答案出处(感谢!!!): http://jasonhan-sh-hotmail-com.iteye.com/blog/1473955
将hibernate.cfg.xml中的
<!--5.1和5.5版本会出现,其余版本会正常运行.而且平常也会用这一个-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
改成:
<!--5.1和5.5版本请改成这一个。 最好用它的父类MySQL5Dialect 下面有讲-->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
重新测试: 引擎变成了InnoDB。
表也创建成功了。
五 Hibernate对MySQL方言的支持
对:
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
进行ctrl+鼠标点击,进行查看:
@Deprecated
/* */ public class MySQL5InnoDBDialect
/* */ extends MySQL5Dialect
/* */ {
/* */ protected MySQLStorageEngine getDefaultMySQLStorageEngine()
/* */ {
/* 20 */ return InnoDBStorageEngine.INSTANCE;
/* */ }
// }
但是这个类MySQL5InnoDBDialect 已经过时了。
它的那个返回值是:
public static final MySQLStorageEngine INSTANCE = new InnoDBStorageEngine();
表示创建的是InnoDB引擎。
它继承了MySQL5Dialect。 查看MySQL5Dialect
public class MySQL5Dialect
extends MySQLDialect{}
它继承了MySQLDialect 类。这个MySQLDialect表示是关于MySQL的方言。
而MySQLDialect类继承了Dialect类
public class MySQLDialect extends Dialect{}
这个类Dialect自然就是所有数据库类的父类。
ctrl+T, 查看Dialect类的继承结构:
里面有MySQL,有DB2,有Oracle等各个方言。
ctrl+T, 查看MySQL5Dialect
既然MySQL5InnoDBDialect已经过时了,那么Hibernate官方肯定要给一个更好的。此时用MySQL5Dialect试试。
<!--可以运行。以后都改写成MySQL5Dialect-->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
可以运行。 以后都改成MySQL5Dialect了。 刚开始的MySQLDialect太父类了,基本没有什么功能了。
六 其他常见错误的演示
六.一 没有引入mysql驱动jar包
六.二 User.hibernate.xml中的属性property没有与User类相对应
<!-- 正确的是:<property name="userName"></property>
现在改成写:username-->
<property name="username"></property>
六.三 没有引入User.hibernate.xml文件
<!--没有写,忘记引入了: <mapping resource="com/yjl/pojo/User.hbm.xml"/>-->
这个时候,不会报错。 但不会创建user表。 因为hibernate.cfg.xml与User.hibernate.xml没有任何关系。这个问题最难发现,要多注意。
六.四 引入了错误的User.hibernate.xml文件
<!-- 正确的应该是pojo包下,而不是po包下 -->
<mapping resource="com/yjl/po/User.hibernate.xml"/>
可以通过ctrl+鼠标进行点击,如何路径正确,会跳转到相应的xml文件。如果不正确,不会进行跳转。
注意此时写的是 ///(斜杠) 文件夹的形式,并不是...(点) 包的形式。(这一点不像MyBatis) 也会报这一个not found的错误。
Hibernate是一个非常牛的框架。建议多学习。
谢谢!!!