hibernate从零开始

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ITzhongzi/article/details/88656736

写在前头: Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象!

强烈推荐文章: Hibernate入门这一篇就够了

示例教程
  • 项目目录结构
    在这里插入图片描述
  • 创建数据库
CREATE TABLE `test`.`Untitled`  (
  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `uname` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `uage` int(11) DEFAULT NULL,
  PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
  • 下载hibernate必要的驱动包 (目前我采用的是hibernate 5.4
    在这里插入图片描述
  • 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>
    <!--设置要将java转化成 mysql数据库的语法-->
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="connection.url">jdbc:mysql://192.168.80.250:3306/test?serverTimezone=UTC</property>
    <property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
    <!-- 指定连接数据库的密码 -->
    <property name="connection.username">root</property>
    <property name="connection.password">admin</property>

    <property name="hibernate.c3p0.max_size">20</property>
    <!-- 指定连接池里最小连接数 -->
    <property name="hibernate.c3p0.min_size">1</property>
    <!-- 指定连接池里连接的超时时长 -->
    <property name="hibernate.c3p0.timeout">5000</property>


    <!-- 显示Hibernate持久化操作所生成的SQL -->
    <property name="show_sql">true</property>
    <!-- 将SQL脚本进行格式化后再输出 -->
    <property name="hibernate.format_sql">true</property>
    
    <!--配置current_session-->
    <property name="current_session_context_class">thread</property>

    <!--配置要加载的资源-->
    <mapping resource="domain/UserEntity.hbm.xml"/>
    <mapping class="domain.UserEntity"/>

  </session-factory>
</hibernate-configuration>

package domain;

import javax.persistence.*;
import java.util.Objects;

@Entity
@Table(name = "user", schema = "test", catalog = "test")
public class UserEntity {
    private int uid;
    private String uname;
    private Integer uage;

    @Id
    @Column(name = "uid")
    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    @Basic
    @Column(name = "uname")
    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    @Basic
    @Column(name = "uage")
    public Integer getUage() {
        return uage;
    }

    public void setUage(Integer uage) {
        this.uage = uage;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        UserEntity that = (UserEntity) o;
        return uid == that.uid &&
                Objects.equals(uname, that.uname) &&
                Objects.equals(uage, that.uage);
    }

    @Override
    public int hashCode() {
        return Objects.hash(uid, uname, uage);
    }
}

<?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>

    <class name="domain.UserEntity" table="user" schema="test">
        <id name="uid" column="uid"/>
        <property name="uname" column="uname"/>
        <property name="uage" column="uage"/>
    </class>
</hibernate-mapping>
  • 测试程序
    步骤:
    1. Configuration configuration = new Configuration().configure(); 读取hibernate主配置文件
    2. SessionFactory sessionFactory = configuration.buildSessionFactory(); 创建一个session工厂,用于获取session
    3. 通过 getCurrentSession或者openSession都可以获取一个 session对象。 session对象是 操作数据库的核心
    4. Transaction transaction = currentSession.beginTransaction(); 开启一个事务
    5. 创建要保存在数据库中的对象(或者其他操作)
    6. 使用 session.save(obj)来保存
    7. 最后提交事务transaction.commit();

注意: getCurrentSession或者openSession都可以获取一个 session对象, 但是 openSession 总是开启一个新的session对象,并且在使用完成之后要调用session.close()来释放资源。 getCurrentSession 会检查当前上下文有没有可用的 session对象,有的话就直接使用,没有的话就创建一个新的session对象。 在提交事务之后,getCurrentSession 获取的session是会自动释放的,不需要调用 close方法

import domain.UserEntity;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import org.hibernate.query.NativeQuery;
import org.hibernate.query.Query;
import org.junit.Test;

import java.util.List;

public class TestDemo {
    Configuration configuration = new Configuration().configure();
    SessionFactory sessionFactory = configuration.buildSessionFactory();

    /***
     * 增加一条记录
     */
    @Test
    public void test1() {

        Session currentSession = sessionFactory.getCurrentSession();
//        Session currentSession = sessionFactory.openSession();
        Transaction transaction = currentSession.beginTransaction();

        UserEntity userEntity = new UserEntity();
        userEntity.setUage(19);
        userEntity.setUname("李洪伟");

        int a  = (int)currentSession.save(userEntity);

        transaction.commit();
        System.out.println("保存成功,id为" + a);
    }

    /**
     * 修改一条记录
     *  session.save(obj); 【保存一个对象】
     *  session.update(obj); 【更新一个对象】
     *  session.saveOrUpdate(obj); 【保存或者更新的方法】
     *                              没有设置主键,执行保存;
     *                              有设置主键,执行更新操作;
     *                              如果设置主键不存在报错!
     * */
    @Test
    public void test2(){
        Session currentSession = sessionFactory.getCurrentSession();
        Transaction transaction = currentSession.beginTransaction();
        UserEntity userEntity = new UserEntity();
        userEntity.setUid(1);
        userEntity.setUname("lhw");
        userEntity.setUage(21);

        currentSession.update(userEntity);
        transaction.commit();
    }

    /**
     *  1.查询操作
     *  主键查询
     *  session.get(javaBean.class, int id); 【传入对应的class和id就可以查询】
     *  session.load(javaBean.class, int id); 【支持懒加载】
     * */
    @Test
    public void test3(){
        Session currentSession = sessionFactory.getCurrentSession();
        Transaction transaction = currentSession.beginTransaction();
        UserEntity userEntity = currentSession.get(UserEntity.class, 1);
        transaction.commit();
        System.out.println(userEntity);
    }

    /**
     *  2.查询操作
     *  HQL查询 (hibernate query language 即hibernate提供的面向对象的查询语言)
     *  查询的是对象以及对象的属性【它查询的是对象以及属性,因此是区分大小写的!】。
     * */

    @Test
    public void test4(){
        Session currentSession = sessionFactory.getCurrentSession();
        Transaction transaction = currentSession.beginTransaction();
//        Query query = currentSession.createQuery("from UserEntity");
        // 查询id 大于 2 的所有数据
        Query query = currentSession.createQuery("from UserEntity where id > :id");
        query.setParameter("id", 2);
        List list = query.list();
        transaction.commit();
        System.out.println(list.toString());
    }

    /***
     *  3.查询操作
     * QBC查询(query by criteria 完全面向对象的查询)  ~~一般用的比较少
     * HQL查询是需要SQL的基础的,因为还是要写少部分的SQL代码....QBC查询就是完全的面向对象查询...
     */
    @Test
    public void test5(){
        Session currentSession = sessionFactory.getCurrentSession();
        Transaction transaction = currentSession.beginTransaction();
        Criteria criteria = currentSession.createCriteria(UserEntity.class);

        // 增加条件
        criteria.add(Restrictions.gt("id", 1)); // 1. > gt 2. < lt 3.  = eq
        List list = criteria.list();
        System.out.println(list);
    }

    /***
     * 4.查询操作
     * 本地sql查询
     * 如果SQL是非常复杂的,我们不能靠HQL查询来实现功能的话,我们就需要使用原生的SQL来进行复杂查询了!
     */
    @Test
    public void test6(){
        Session currentSession = sessionFactory.getCurrentSession();
        Transaction transaction = currentSession.beginTransaction();
        NativeQuery nativeQuery = currentSession.createSQLQuery("select * from user").addEntity(UserEntity.class);
        List list = nativeQuery.list();
        transaction.commit();
        System.out.println(list);
    }

}


运行结果
  • test1()
Hibernate: 
    insert 
    into
        user
        (uname, uage, uid) 
    values
        (?, ?, ?)
保存成功,id为0
  • test2()
Hibernate: 
    update
        user 
    set
        uname=?,
        uage=? 
    where
        uid=?
  • test3()
Hibernate: 
    select
        userentity0_.uid as uid1_0_0_,
        userentity0_.uname as uname2_0_0_,
        userentity0_.uage as uage3_0_0_ 
    from
        user userentity0_ 
    where
        userentity0_.uid=?
UserEntity{uid=1, uname='lhw', uage=21}
  • test4()
Hibernate: 
    select
        userentity0_.uid as uid1_0_,
        userentity0_.uname as uname2_0_,
        userentity0_.uage as uage3_0_ 
    from
        user userentity0_ 
    where
        userentity0_.uid>?
[UserEntity{uid=3, uname='李洪伟', uage=19}, UserEntity{uid=4, uname='李洪伟', uage=19}, UserEntity{uid=5, uname='李洪伟', uage=19}]
  • test5()
Hibernate: 
    select
        this_.uid as uid1_0_0_,
        this_.uname as uname2_0_0_,
        this_.uage as uage3_0_0_ 
    from
        user this_ 
    where
        this_.uid>?
[UserEntity{uid=2, uname='李洪伟', uage=19}, UserEntity{uid=3, uname='李洪伟', uage=19}, UserEntity{uid=4, uname='李洪伟', uage=19}, UserEntity{uid=5, uname='李洪伟', uage=19}]
  • test6()
Hibernate: 
    select
        * 
    from
        user
[UserEntity{uid=1, uname='lhw', uage=21}, UserEntity{uid=2, uname='李洪伟', uage=19}, UserEntity{uid=3, uname='李洪伟', uage=19}, UserEntity{uid=4, uname='李洪伟', uage=19}, UserEntity{uid=5, uname='李洪伟', uage=19}]

Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/ITzhongzi/article/details/88656736