实验环境:IntelliJ IDEA 2019.3.1 x64、Mysql5.7.29
其他工具:Navicat Premium 15、mysql-connector-java:5.0.5、Maven
首先,创建一个名为hibernateTest的数据库和一个名为user的表,参数如下,创建方法就不演示了
user表创建成功后进入IDEA,新建一个Hibernate项目,Create default hibernate configuration and main clas默认为未勾选,我们需要将其勾选,以便它能自动创建hibernate配置文件及程序主类。
刚刚点击Hibernate时,下方的Libraries显示为Loading versions,稍等一会,就会显示如下选项,如果是第一次使用Hibernate,则选择Download选项,然后点击Next按钮,将会自动下载Hibernate包。等熟练之后可以点击Configure…进行相应配置,以后可通过User library直接使用Hibernate包,无需再下载。
输入项目名称,此次我们项目名称输入HibernateTest,然后点击Finish,开始创建项目
项目创建完成的界面
我们需要先添加Maven依赖,方便后续使用。右键项目名,点击Add Framework Support
勾选Maven,点击OK
添加完之后的界面,左侧会出现一些新的包,主类Main和hibernate配置文件会自动放入java包下,右下角再询问是否需要导入maven依赖,我们点击Enable Auto-Import让它自动导入即可。
修改pom.xml文件(后面有pom.xml代码可直接复制),dependency内的mysql-connector-java为链接Mysql所需的jar包,我用的是5.0.5版本,也可以选用其他版本,但要注意如果Mysql为8.0版本,则mysql-connector-java须为8.0版本以上;Mysql为8.0版本以下,一般情况mysql-connector-java用5.0版本即可。
build内设置的为默认源代码和资源文件目录配置,设置后可以看到java和resources两个包发生了变化
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>groupId</groupId>
<artifactId>hibernateTest4</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.5</version>
</dependency>
</dependencies>
<!-- 默认源代码和资源文件目录配置 -->
<build>
<finalName>hibernateTest</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
</build>
</project>
进入hibernate.cfg.xml文件,自动创建为如下模样
添加数据库的账号密码
hibernate.cfg.xml:(直接复制的话,要注意数据库地址、账号、密码修改为你的数据库的)
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://121.40.189.213:3306/hibernateTest</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<mapping resource="UserEntity.hbm.xml"/>
<mapping class="Entity.UserEntity"/>
<mapping resource="WordEntity.hbm.xml"/>
<mapping class="Entity.WordEntity"/>
<!-- DB schema will be updated if needed -->
<!-- <property name="hibernate.hbm2ddl.auto">update</property> -->
</session-factory>
</hibernate-configuration>
使用IDEA连接数据库。点击View下的Tool Windows 里的Database,在右边会弹出Database
点击Database下的数据库管理图标
弹出许多数据库可以配置选择,我的因为之前的配置过MySQL for 5.0.5了,所以会看到MySQL 和MySQL for 5.0.5两个
IDEA默认给的MySQL是8.0的版本而且还未下载。
为了便于以后的使用,我们创建一个MySQL for 5.0.5的配置。
点击MySQL,然后点击上方的复制图标
此时会出现一个新的配置
先将Name修改为MySQL for 5.0.5,然后选中默认的Driver files,点击减号进行删除
再点击加号,添加新的驱动包
驱动包在maven的依赖库里,我的maven依赖库在默认位置上:
C:\Users\Administrator.m2\repository\mysql\mysql-connector-java\5.0.5\mysql-connector-java-5.0.5.jar,注意Administrator为我的电脑的用户名,不同电脑名称可能不一样
点击OK添加成功后,Driver files里显示刚添加的驱动包,然后点击Class的下拉框
选择com.mysql.jdbc.Driver
点击OK,该数据库首选项配置完成。(因为我的同样名称的已经存在,所以下方一直提示Name is Not Unique)
点击加号,有时并没有及时出现我们创建的MySQL for 5.0.5,可能是系统没及时加载
回到刚才的界面,在MySQL和MySQL for 5.0.5两个选项各点击一下。
再点击加号,通常会出现新创建的MySQL for 5.0.5
点击MySQL for 5.0.5,出现选项框
输入数据库选项,点击Test Connection
如果链接成功,下方会出现对号提示,如果链接失败,则检查输入选项是否正确
点击OK后出现如下界面
之后,开始使用IDEA自动配置Hibernate的功能,点击View下的Tool Windows 里的Persistence
在左下角会弹出Persistence
右键HbiernateTest,选择Generate Persistence Mapping里的By Database Schema
弹出Import Database Schema选项框
选择数据库
创建存储实体类的包
继续配置选项,勾选user,点击OK
这是自动创建的配置文件和实体类
创建Util包,在Util包下创建HibernateUtil类,类里面写入
package Util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sessionFactory;
static{
try {
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable e) {
throw new ExceptionInInitializerError(e);
}
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
public static void shutdown(){
getSessionFactory().close();
}
}
进入主函数,修改为以下代码
import Entity.UserEntity;
import Util.HibernateUtil;
import org.hibernate.*;
import org.hibernate.query.Query;
import org.hibernate.cfg.Configuration;
import javax.persistence.metamodel.EntityType;
import java.sql.Timestamp;
import java.util.Date;
import java.util.Map;
public class Main {
public static void main(final String[] args) throws Exception {
insert();
selectByID();
}
private static void insert(){
UserEntity userEntity = new UserEntity();
userEntity.setId(1);
userEntity.setName("10");
userEntity.setAge(10);
Timestamp timestamp = new Timestamp(new Date().getTime());
userEntity.setCreateTime(timestamp);
//打开一个普通的session
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
session.save(userEntity);
userEntity.setAge(20);
transaction.commit();
session.close();
}
private static void selectByID(){
//获取SessionFactory
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
//通过SessionFactory 获取 Session
Session session = sessionFactory.openSession();
//在Session基础上开启一个事务
session.beginTransaction();
UserEntity usersEntity = (UserEntity) session.get(UserEntity.class, 1);
System.out.println(usersEntity.getCreateTime());
session.close();
}
}
右键main,点击Run ‘Main.main()’,向user表内插入一条消息,并读取该消息的CreateTime属性
运行结果如下,输出数据插入时间,表示运行成功
数据库内查看插入的消息
还可以通过其他方式进行查询
private static void selectByKey(){
UserEntity user=new UserEntity();
//获取SessionFactory
SessionFactory sf = new Configuration().configure().buildSessionFactory();
//通过SessionFactory 获取 Session
Session session = sf.openSession();
//在Session基础上开启一个事务
Transaction transaction = session.beginTransaction();
Criteria criteria = session.createCriteria(UserEntity.class);
criteria.add(Restrictions.eq("age", 20));
List<UserEntity> list = criteria.list();
System.out.println(list.get(0).getCreateTime());
transaction.commit();
session.close();
}
private static void selectByQuery(){
UserEntity user=new UserEntity();
//获取SessionFactory
SessionFactory sf = new Configuration().configure().buildSessionFactory();
//通过SessionFactory 获取 Session
Session session = sf.openSession();
//在Session基础上开启一个事务
Transaction transaction = session.beginTransaction();
SQLQuery sql=session.createSQLQuery("select * from user where age=20 ").addEntity(UserEntity.class);
List<UserEntity> list=sql.list();
System.out.println(list.get(0).getCreateTime());
transaction.commit();
session.close();
}