Java框架 Hibernate入门笔记一 简单CRUD

首先大概感受一下什么是Hibernate, 这是一个操作数据库的ORM(Object-Relational Mapping)框架,实现了对JDBC的封装;
所以使用Hibernate就不需要直接手写sql语句了, 可以直接通过面向对象的做法对数据库进行操作;
比如, 我想在数据库的user表中获取一个User类的实体, 如果手写sql可能是类似这样:

User a = new User();
try {
	Connection conn = DButil.getConnection();
	Statement st = conn.createStatement();
   	ResultSet rs = stmt.executeQuery("SELECT * FROM `user` where usr_id="+x);
    if (rs.next()){
        a.setName(rs.getString("name"));
        a.setGender(rs.getString("gender"));
    }
}
 catch (SQLException e){
     e.printStackTrace();
}
return a;

这样就很麻烦, 如果使用Hibernate框架的话可以就可以类似这样来实现这个获取实体的过程:

SessionFactory sf = new Configuration().configure().buildSessionFactory();
Session s = sf.openSession();
s.beginTransaction();

ProductEntity p = s.get(ProductEntity.class, 1);//获取ID为1的产品
System.out.println(p.getClass());
System.out.println(p);

s.getTransaction().commit();
s.close();
sf.close();

这样就很简单;

然后就先开始尝试使用Hibernate框架!

我的环境是
IntelliJ IDEA 2018.2.5 (Ultimate Edition)
JRE: 1.8.0_152-release-1248-b19 x86_64
macOS 10.13.5

在Idea中先新建一个Java的项目, 勾选上Hibernate框架:
Java框架 Hibernate入门笔记一 简单CRUD
这里记得要勾选上Create default hibernate configuration and main class这个选项, 否则后面自己手动写容易错~

然后大概会获得一个类似这样的目录:
Java框架 Hibernate入门笔记一 简单CRUD
然后我在src的目录下新建了一个Package叫Entity来存储实体类, 这里不需要手写实体类, 可以先去数据库中建好表之后由idea自动生成entity;
然后选择连接数据库:
Java框架 Hibernate入门笔记一 简单CRUD
然后输入数据库配置信息:
Java框架 Hibernate入门笔记一 简单CRUD
然后往数据库中新建一个表
Java框架 Hibernate入门笔记一 简单CRUD
然后在Persistence里面选择我们创建的项目, 选择通过数据库结构自动生成持久层映射
Java框架 Hibernate入门笔记一 简单CRUD
Java框架 Hibernate入门笔记一 简单CRUD
完成之后可以看到在之前创建的Entity包中出现了一个自动生成的实体类, 并且按照Bean写了基本的方法:
Java框架 Hibernate入门笔记一 简单CRUD
然后要进入到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"/>
        <property name="connection.driver_class"/>
        <!-- <property name="connection.username"/> -->
        <!-- <property name="connection.password"/> -->

        <!-- DB schema will be updated if needed -->
        <!-- <property name="hbm2ddl.auto">update</property> -->
    </session-factory>
</hibernate-configuration>

下面贴上我的配置:

<?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://localhost:3306/demo</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="connection.username">zpw</property>
        <property name="connection.password">ciscocisco</property>
        <property name="hbm2ddl.auto">update</property>
        <mapping class="Entity.User"/>
        <mapping resource="Entity/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

大概理解一下这些配置的意思:

<property name="connection.url">jdbc:mysql://localhost:3306/demo</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">zpw</property>
<property name="connection.password">ciscocisco</property>

这一部分是做数据库的配置, 地址, 端口, 数据库名, 用户名密码, 驱动指定这些;

然后这里是开启了dialect方言功能, 因为对于Hibernate而言, 虽然对于Oracle, mysql这些不同数据库他们的底层语言可能是不同的, 但是只要开启了dialect功能之后, HIbernate就会自动根据所选择的数据库自动的生成对应的底层数据库语言;

<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

然后这部分是打开了update功能, 这个意思是Hibernate会自动根据我们写的Entity类更新数据库中的表, 但是这里我们是不需要的, 因为我的Entity都是根据表结构自动生成的…

<property name="hbm2ddl.auto">update</property>

然后在测试之前别忘了在Project Structure里面导入mysql的driver的jar包:
Java框架 Hibernate入门笔记一 简单CRUD

然后我在src中直接创建了一个Test类做测试:

import Entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class Test {
    public static void main(String[] args) {
        SessionFactory sf = new Configuration().configure().buildSessionFactory();
        Session s = sf.openSession();
        s.beginTransaction();

        User a = new User();
        a.setName("cisco");
        a.setBalance(10002.234);
        s.save(a);

        s.getTransaction().commit();
        s.close();
        sf.close();
    }
}

这里注意一下, Configuration这个类不仅在Hibernate里面有, 在javafx和其他的一些包里面也有, 所以一定要导入正确的包;
然后运行这个Test类之后可能会看到很多红色的日志信息, 类似这样:
Java框架 Hibernate入门笔记一 简单CRUD
这些是正常的, 然后在数据库中可以检查到, 的确已经成功插入了一条数据:
Java框架 Hibernate入门笔记一 简单CRUD
然后上面是插入数据的方法, 那么自然也就有CRUD增删改查的方法: 差不多是下面这样的:
1.Create(插入)上面有了;
2.Retrieve(查询):

import Entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class Test {
    public static void main(String[] args) {
        SessionFactory sf = new Configuration().configure().buildSessionFactory();
        Session s = sf.openSession();
        s.beginTransaction();

        User a = s.get(User.class, 1);
        System.out.println(a);

        s.getTransaction().commit();
        s.close();
        sf.close();
    }
}

结果(我在Entity中重写了一下toString方法):
Java框架 Hibernate入门笔记一 简单CRUD

    @Override
    public String toString() {
        return "[id:"+id+",name:"+name+",balance:"+balance+"]";
    }

3.Update(更新)

import Entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class Test {
    public static void main(String[] args) {
        SessionFactory sf = new Configuration().configure().buildSessionFactory();
        Session s = sf.openSession();
        s.beginTransaction();

        User a = s.get(User.class, 1);
        a.setBalance(200.321);
        s.update(a);

        s.getTransaction().commit();
        s.close();
        sf.close();
    }
}

4.Delete(删除)

import Entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class Test {
    public static void main(String[] args) {
        SessionFactory sf = new Configuration().configure().buildSessionFactory();
        Session s = sf.openSession();
        s.beginTransaction();

        User a = s.get(User.class, 1);
        s.delete(a);

        s.getTransaction().commit();
        s.close();
        sf.close();
    }
}