1. 创建项目,导入jar包,创建Java项目即可。
(1)在hibernate-release-5.2.12.Final\lib\required中的所有jar包,和lib\jpa-metamodel-generator在的jar包
(2)mysql的驱动包:mysql-connector-java-5.1.38-bin.jar
(3)日志包:log4j-1.2.17.jar,slf4j-api-1.7.5.jar,slf4j-log4j12-1.7.5.jar
(4)在项目下面新建lib包(Folder),将上面的jar复制进去,然后选中jar包,右键选择Bulid path->Add to bulid path
2. 创建实体类
public class User {
//hibernate要求实体类有一个属性是唯一的
private int uId;
private String uName;
private String uPassword;
private String uAddress;
public int getuId() {
return uId;
}
public void setuId(int uId) {
this.uId = uId;
}
public String getuName() {
return uName;
}
public void setuName(String uName) {
this.uName = uName;
}
public String getuPassword() {
return uPassword;
}
public void setuPassword(String uPassword) {
this.uPassword = uPassword;
}
public String getuAddress() {
return uAddress;
}
public void setuAddress(String uAddress) {
this.uAddress = uAddress;
}
}
注:使用hibernate时,不需要手动创建表,hibernate可以帮我们创建表
3. 配置实体类和数据库表一一对应关系(映射关系,使用配置文件实现映射关系)
(1)创建xml格式的配置文件,文件的名称和位置没有固定的要求(一般建议在实体类所在的包里面创建,实体类名称.hbm.xml)。如在这个项目中要建立User.hbm.xml。
(2)在xml文件(User.hbm.xml)中引入xml约束(如dtd、schema),在hibernate里面需要引进dtd约束。
寻找方法:在hibernate-release-5.2.12.Final中搜索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">
(3)配置映射关系
<hibernate-mapping>
<!-- 1. 配置类和表 -->
<class name="com.zzc.entity.User" table="user">
<!-- 2.配置实体类id和表id对应 -->
<id name="uId" column="uId">
<!-- 3. 设置数据库表id增长策略(自动增长:native)-->
<generator class="native"></generator>
</id>
<!-- 设置其他属性和表字段类型 -->
<property name="userName" column="userName"></property>
<property name="password" column="password"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>
4. 创建hibernate核心配置文件
(1)hibernate核心配置文件为xml格式,但它的名称和位置是固定的。
- 名称:必须为hibernate.cfg.xml
- 位置:必须在src下面
(2)引入dtd约束
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
(3)hibernate操作过程中,只会加载核心配置文件,其他配置文件不会加载,所以要在核心配置文件中配置。
第一部分:配置数据库信息(必须的)
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:jdbc:mysql://localhost:3306/数据库名?characterEncoding=utf-8</property>
<property name="hibernate.connection.username">数据库的用户名</property>
<property name="hibernate.connection.password">数据库的密码</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>
<!-- 配置数据库方言:让hibernate框架识别不同数据库特有的语句
在MySQL中实现分页:使用limit关键字(只能在mysql中使用),
在oracle中实现分页:使用rownum
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
第三部分:把映射文件放到核心配置文件中(必须的)
<mapping resource="com/***/***/entity/User.hbm.xml"/>
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=utf-8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123</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>
<!-- 配置数据库方言:让hibernate框架识别不同数据库特有的语句
在MySQL中实现分页:使用limit关键字(只能在mysql中使用),
在oracle中实现分页:使用rownum
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 第三部分:把映射文件放到核心配置文件中 必须的 -->
<mapping resource="com/zzc/hibernate/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5. 实现增删查改功能
第一步:加载hibernate的核心配置文件
Configuration cfg = new Configuration();
cfg.configure();
第二步:创建SessionFactory对象
SessionFactory sessionFactory = cfg.buildSessionFactory();
第三步:使用SessionFactory创建session对象
Session session = sessionFactory.openSession();
第四步:开启事务
Transaction ts = session.beginTransaction();
第五步:写具体逻辑crud操作(添加功能)
User user = new User();
user.setUserName("王小明");
user.setPassword("1234");
user.setAddress("北京市");
//调用session方法实现添加功能
session.save(user);
第六步:提交事务
ts.commit();
第七步:关闭资源
session.close();
sessionFactory.close();
完整的代码:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.zzc.hibernate.entity.User;
public class HibernateTestDemo {
public static void testAdd() {
Configuration cfg = new Configuration();
cfg.configure();
SessionFactory sessionFactory = cfg.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction ts = session.beginTransaction();
User user = new User();
user.setUserName("王小明");
user.setPassword("1234");
user.setAddress("北京市");
session.save(user);
ts.commit();
session.close();
sessionFactory.close();
}
public static void main(String[] args) {
testAdd();
}
}
6. 测试结果
(1)起初出现了问题,报错:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hibernate.user’...
解决办法:将hibernate.cfg.xml中配置方言的部分代码改为:
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
(2)之后报错Incorrect string value: '\xE7\x8E\x8B\xE5\xB0\x8F...' for column 'userName' at row 1。产生
这个错误的原因是,在创建
数据库
的的时候编码格式为latin1,只要将编码改为UTF-8即可。
改完数据库后,在进行测试,成功创建user表,并将数据导入。
console输出:
Hibernate:
create table user (
uId integer not null auto_increment,
userName varchar(255),
password varchar(255),
address varchar(255),
primary key (uId)
) engine=InnoDB
Hibernate:
insert
into
user
(userName, password, address)
values
(?, ?, ?)
注:如果数据库方言配置为:
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
也可正常执行,console输出为:
Hibernate:
create table user (
uId integer not null auto_increment,
userName varchar(255),
password varchar(255),
address varchar(255),
primary key (uId)
) engine=MyISAM
Hibernate:
insert
into
user
(userName, password, address)
values
(?, ?, ?)
由此可见:
MySQL5Dialect效果和MySQLMyISAMDialect效果是一致的,如果想要使用InnoDB,请一定配置org.hibernate.dialect.MySQL5InnoDBDialect。
各数据库对应的方言(Dialect):
数据库 | 方言(Dialect) |
DB2 | org.hibernate.dialect.DB2Dialect |
DB2 AS/400 | org.hibernate.dialect.DB2400Dialect |
DB2 OS390 | org.hibernate.dialect.DB2390Dialect |
PostgreSQL | org.hibernate.dialect.PostgreSQLDialect |
MySQL5 | org.hibernate.dialect.MySQL5Dialect |
MySQL5 with InnoDB | org.hibernate.dialect.MySQL5InnoDBDialect |
MySQL with MyISAM | org.hibernate.dialect.MySQLMyISAMDialect |
Oracle(any version) | org.hibernate.dialect.OracleDialect |
Oracle 9i | org.hibernate.dialect.Oracle9iDialect |
Oracle 10g | org.hibernate.dialect.Oracle10gDialect |
Oracle 11g | org.hibernate.dialect.Oracle10gDialect |
Sybase | org.hibernate.dialect.SybaseASE15Dialect |
Sybase Anywhere | org.hibernate.dialect.SybaseAnywhereDialect |
Microsoft SQL Server 2000 | org.hibernate.dialect.SQLServerDialect |
Microsoft SQL Server 2005 | org.hibernate.dialect.SQLServer2005Dialect |
Microsoft SQL Server 2008 | org.hibernate.dialect.SQLServer2008Dialect |
SAP DB | org.hibernate.dialect.SAPDBDialect |
Informix | org.hibernate.dialect.InformixDialect |
HypersonicSQL | org.hibernate.dialect.HSQLDialect |
H2 Database | org.hibernate.dialect.H2Dialect |
Ingres | org.hibernate.dialect.IngresDialect |
Progress | org.hibernate.dialect.ProgressDialect |
Mckoi SQL | org.hibernate.dialect.MckoiDialect |
Interbase | org.hibernate.dialect.InterbaseDialect |
Pointbase | org.hibernate.dialect.PointbaseDialect |
FrontBase | org.hibernate.dialect.FrontbaseDialect |
Firebird | org.hibernate.dialect.FirebirdDialect |