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);

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框架:

这里记得要勾选上Create default hibernate configuration and main class这个选项, 否则后面自己手动写容易错~

然后大概会获得一个类似这样的目录:

然后我在src的目录下新建了一个Package叫Entity来存储实体类, 这里不需要手写实体类, 可以先去数据库中建好表之后由idea自动生成entity;
然后选择连接数据库:

然后输入数据库配置信息:

然后往数据库中新建一个表

然后在Persistence里面选择我们创建的项目, 选择通过数据库结构自动生成持久层映射
在这里插入图片描述
在这里插入图片描述
完成之后可以看到在之前创建的Entity包中出现了一个自动生成的实体类, 并且按照Bean写了基本的方法:
在这里插入图片描述
然后要进入到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>

如果想要使用这个功能就要记得写mapping映射实体类

<mapping resource="Entity/User.hbm.xml"/>

这里使用这个功能的时候, 如果你的mysql版本高于5.1可能会报错类似于这样:
your MySQL server version for the right syntax to use near 'type=MyISAM'
这是因为在5.1之后的版本要写成engine=MyISAM而不能写成type
所以要把之前的设置方言的配置更新成mysql的新版:

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

到这一步还有个坑, 就是自动生成的表如果有外间约束关系的话, 在MyISAM引擎下是无法形成约束的, 所以我希望能使用默认InnoDB引擎, 所以最好把方言配置成自己的mysql对应的版本, 比如我是mysql5.7所以我设置的是:

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

如果是mysql5.5的话, 就设置成

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

以此类推~
这样自动生成出的表就可以形成约束关系了 而且采用InnoDB引擎;

然后在测试之前别忘了在Project Structure里面导入mysql的driver的jar包:
在这里插入图片描述

然后我在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类之后可能会看到很多红色的日志信息, 类似这样:
在这里插入图片描述
这些是正常的, 然后在数据库中可以检查到, 的确已经成功插入了一条数据:
在这里插入图片描述
然后上面是插入数据的方法, 那么自然也就有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方法):

    @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();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_33982232/article/details/86756930