Java web开发(9)Hibernate使用_a

建立一个Hibernate工程。

普通工程

复制如下jar包,粘贴到工程的一个文件夹下,比如叫lib,然后选中所有jar包,右键,build path-->add to build path

或者建立一个Maven工程,在依赖中添加

<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.17.Final</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>

2关键配置

在src下建立hibernate.cfg.xml文件,里面内容包含连接,可选sql配置,实体类的映射文件

<?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:///数据库名</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>
        <!-- 配置数据库方言
            在mysql里面实现分页 关键字 limit,只能使用mysql里面
            在oracle数据库,实现分页rownum
            让hibernate框架识别不同数据库的自己特有的语句
         -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        
        <!-- 在hibernate核心配置文件中配置 -->
        <property name="hibernate.current_session_context_class">thread</property>
        
        <!-- 第三部分: 把映射文件放到核心配置文件中 必须的-->
        <mapping resource="com/entity/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

 实体类的配置

比如一个实体类,包名com.entity

package com.entity;
public class User {

    private int uid;
    private String username;
    private String password;
    private String address;
......
//getter and setter
}

在该包下同时有User.hbm.xml文件

该配置文件制定了类和表,成员变量和数据表列的对应关系。

如何指定主键生成策略。

对于uid类型为String的,使用

<generator class="uuid"></generator>
<?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="com.entity.User" table="t_user">
    <id name="uid" column="uid">
    <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>

简单示例

一个插入操作的所有代码

@Test
public void test()    {
第一步 加载hibernate核心配置文件
        // 到src下面找到名称是hibernate.cfg.xml
        //在hibernate里面封装对象
        Configuration cfg = new Configuration();
        cfg.configure();
        
//        第二步 创建SessionFactory对象
        //读取hibernate核心配置文件内容,创建sessionFactory
        //在过程中,根据映射关系,在配置数据库里面把表创建
        SessionFactory sessionFactory = cfg.buildSessionFactory();
        
//        第三步 使用SessionFactory创建session对象
        // 类似于连接
        Session session = sessionFactory.openSession();
        
//        第四步 开启事务
        Transaction tx = session.beginTransaction();

//        第五步 写具体逻辑 crud操作
        //添加功能
        User user = new User();
        user.setUsername("Jack");
        user.setPassword("123456");
        user.setAddress("myaddress");
        //调用session的方法实现添加
        session.save(user);
        
//        第六步 提交事务
        tx.commit();

//        第七步 关闭资源
        session.close();
        sessionFactory.close();
}

封装和框架

对于SessionFactory,一个项目适宜只有一个对象。Session对象只可以本线程使用。可以如下封装

此时配置中需要设置

<property name="hibernate.current_session_context_class">thread</property>
public class HibernateUtils {

    static Configuration cfg = null;
    static SessionFactory sessionFactory = null;
    //静态代码块实现
    static {
        //加载核心配置文件
        cfg = new Configuration();
        cfg.configure();
        sessionFactory = cfg.buildSessionFactory();
    }
    
    //提供返回与本地线程绑定的session的方法
    public static Session getSessionobject() {
        return sessionFactory.getCurrentSession();
    }
    
    //提供方法返回sessionFactory
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

对于事务的操作框架,代码如下

try {
  开启事务
  提交事务
}catch() {
  回滚事务
}finally {
  关闭
}
SessionFactory sf=HibernateUtils.getSessionFactory();
        Session session=sf.openSession();
        Transaction tx=session.beginTransaction();
        try {
            //具体操作
            tx.commit();
        }catch(Exception ex) {
            tx.rollback();
        }finally {
            session.close();
        }

基于实体类对象的增删改查

有错误都会抛出异常

//获取session对象,事务对象

//增加(插入)
User u=new User();
u.setUsername("jack");
u.setPassword("123");
..
session.save(u);

//查询
//使用session的get方法,第一参数是实体类的class,第二个是id
User u=session.get(User.class,3);

//修改,关键先查询再修改
User u=session.get(User.class,3);
u.setName("Tom");
session.update(u);


//删除,先查询,再删除
User u=session.get(User.class,3);
session.delete(u);

Hibernate相关API操作入门

目标:查询表中所有数据

1.HQL语句

Query query =session.createQuery("from User");
List<User> list=query.list();

2.Criteria对象

Criteria c=session.createCriteria(User.class);
List<User> list=c.list();

3.SQLQuery对象

SQLQuery q=session.createSQLQuery("select * from t_user");
q.addEntity(User.class);
List<User> list=q.list();
原文地址:https://www.cnblogs.com/legion/p/9461251.html