Skip to content
标签
数据库
字数
1183 字
阅读时间
6 分钟

一、概述

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行。

二、应用示例

2.1 Spring整合Hibernate

添加依赖

配置文件

xml
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"
       
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" 
       xmlns:tx="http://www.springframework.org/schema/tx" 
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans.xsd 
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/aop
                           http://www.springframework.org/schema/aop/spring-aop.xsd
                           http://www.springframework.org/schema/tx 
                           http://www.springframework.org/schema/tx/spring-tx.xsd"> 
    <!-- 配置读取 properties 文件的工具类 --> 
    <context:property-placeholder location="classpath:jdbc.properties"/> 
    <!-- 配置 c3p0 数据库连接池 --> 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
        <property name="jdbcUrl" value="${jdbc.url}"/> 
        <property name="driverClass" value="${jdbc.driver.class}"/> 
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean> 
    <!-- 配置 Hibernate 的 SeesionFactory --> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
        <property name="dataSource" ref="dataSource"/>
        <!-- hibernateProperties 属性:配置与 hibernate 相关的内容,如显示 sql 语句,开启正向工程 --> 
        <property name="hibernateProperties"> 
            <props> 
                <!-- 显示当前执行的 sql 语句 -->
                <prop key="hibernate.show_sql">true</prop>
                <!-- 开启正向工程 --> 
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property> 
        <!-- 扫描实体所在的包 --> 
        <property name="packagesToScan">
            <list> 
                <value>com.bjsxt.pojo</value>
            </list> 
        </property> 
    </bean> 
    <!-- 配置 Hibernate 的事务管理器 --> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> 
        <property name="sessionFactory" ref="sessionFactory"/> 
    </bean> 
    <!-- 配置开启注解事务处理 --> 
    <tx:annotation-driven transaction-manager="transactionManager"/>
    <!-- 配置 springIOC 的注解扫描 --> 
    <context:component-scan base-package="com.bjsxt"/> 
    
    <!-- 配置 HiberanteTemplate 对象 --> 
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"> 
        <property name="sessionFactory" ref="sessionFactory"/> 
    </bean>
</beans>

查询示例

  • 实体类
java
@Entity 
@Table(name="t_users") 
public class Users implements Serializable{
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)//strategy=GenerationType.IDENTITY 自增长 
    @Column(name="userid")
    private Integer userid; 
    @Column(name="username") 
    private String username; 
    //getset方法
}
  • dao
java
@Repository 
public class UsersDaoImpl implements UsersDao {
    @Autowired
    private HibernateTemplate hibernateTemplate;
    @Override 
    public void insertUsers(Users users) { 
        this.hibernateTemplate.save(users);
    }
    
    // HQL查询(Hibernate Query Language )
    // HQL 的语法:就是将原来的 sql 语句中的表与字段名称换成对象与属性的名称
    public List<Users> selectUserByName(String username) { 
        //getCurrentSession:当前 session 必须要有事务边界,且只能处理唯一 的一个事务。当事务提交或者回滚后 session 自动失效 
        //openSession:每次都会打开一个新的 session.加入每次使用多次。则获 得的是不同 session 对象。使用完毕后我们需要手动的调用 colse 方法关闭 
        session Session session = this.hibernateTemplate.getSessionFactory().getCurrentSession();
        //sql:select * from t_users where username = 
        Query query = session.createQuery("from Users where username = :abc");
        Query queryTemp = query.setString("abc",username); 
        return queryTemp.list();
    }
    
    // SQL查询
    public List<Users> selectUserByNameUseSQL(String username) {
        Session session = this.hibernateTemplate.getSessionFactory().getCurrentSession();
        Query query = session.createSQLQuery("select * from t_users where username = ?").addEntity(Users.class).setString(0, username);
        return query.list();
    }
    
    // QBC 查询 QBC:Query By Criteria
    public List<Users> selectUserByNameUseCriteria(String username) { 
        Session session = this.hibernateTemplate.getSessionFactory().getCurrentSession(); 
        //sql:select * from t_users where username = 张三 
        Criteria c = session.createCriteria(Users.class); 
        c.add(Restrictions.eq("username", username));
        return c.list(); 
    }

}
  • 执行
java
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:applicationContext.xml") 
public class UsersDaoImplTest {
    @Autowired 
    private UsersDao usersDao;
    /**
    * 添加用户 
    */ 
    @Test 
    @Transactional// 在测试类对于事务提交方式默认的是回滚。 
    @Rollback(false)//取消自动回滚 
    public void testInsertUsers(){
        Users users = new Users(); 
        users.setUserage(20);
        users.setUsername("张三");
        this.usersDao.insertUsers(users); 
    }
}

2.2 Spring整合Hibernate JPA

添加依赖

配置文件

xml
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" 
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd 
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context.xsd 
                           http://www.springframework.org/schema/aop 
                           http://www.springframework.org/schema/aop/spring-aop.xsd 
                           http://www.springframework.org/schema/tx
                           http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- 配置读取 properties 文件的工具类 --> 
    <context:property-placeholder location="classpath:jdbc.properties"/>
    <!-- 配置 c3p0 数据库连接池 --> 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="driverClass" value="${jdbc.driver.class}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/> 
    </bean> 
    <!-- Spring 整合 JPA 配置 EntityManagerFactory--> 
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
        <property name="dataSource" ref="dataSource"/> 
        <property name="jpaVendorAdapter"> 
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
                <!-- hibernate 相关的属性的注入 --> 
                <!-- 配置数据库类型 --> 
                <property name="database" value="MYSQL"/> 
                <!-- 正向工程 自动创建表 --> 
                <property name="generateDdl" value="true"/> 
                <!-- 显示执行的 SQL --> 
                <property name="showSql" value="true"/> 
            </bean> 
        </property>
        <!-- 扫描实体的包 -->
        <property name="packagesToScan"> 
            <list> 
                <value>com.bjsxt.pojo</value> 
            </list> 
        </property> 
    </bean> 
    <!-- 配置 Hibernate 的事务管理器 --> 
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean> 
    <!-- 配置开启注解事务处理 --> 
    <tx:annotation-driven transaction-manager="transactionManager"/> 
    <!-- 配置 springIOC 的注解扫描 -->
    <context:component-scan base-package="com.bjsxt"/> 
</beans>

Mapper

java
@Repository 
public class UsersDaoImpl implements UsersDao { 
    @PersistenceContext(name="entityManagerFactory") 
    private EntityManager entityManager; 
    @Override 
    public void insertUsers(Users users) {
        this.entityManager.persist(users); 
    }
    @Override 
    public void updateUsers(Users users) { 
        this.entityManager.merge(users); 
    }
    @Override 
    public void deleteUsers(Users users) { 
        Users u = this.selectUsersById(users.getUserid());
        this.entityManager.remove(u); 
    }
    @Override 
    public Users selectUsersById(Integer userid) {
        return this.entityManager.find(Users.class, userid); 
    }
    
    // HQL
    @Override 
    public List<Users> selectUserByName(String username) { 
        return this.entityManager.createQuery(" from Users where username = :abc").setParameter("abc", 			username).getResultList();
	}
    
    // SQL
    @Override
    public List<Users> selectUserByNameUseSQL(String username) {
        //在 Hibernate JPA 中 如果通过?方式来帮顶参数,那么他的查数是从 1 开始的。而 hibernate 中是从 0 开始的。
        return this.entityManager.createNativeQuery("select * from t_users where username = ?", Users.class).setParameter(1, username).getResultList(); 
    }
    
    // QBC
    @Override 
    public List<Users> selectUserByNameUseCriteria(String username) { 
        //CriteriaBuilder 对象:创建一个 CriteriaQuery,创建查询条件。
        CriteriaBuilder builber = this.entityManager.getCriteriaBuilder(); 
        //CriteriaQuery 对象:执行查询的 Criteria 对象 
        //select * from t_users
        CriteriaQuery<Users> query = builber.createQuery(Users.class); 
        //获取要查询的实体类的对象 
        Root<Users> root = query.from(Users.class); 
        //封装查询条件 
        Predicate cate = builber.equal(root.get("username"), username);
        //select * from t_users where username = 张三 
        query.where(cate); 
        //执行查询
        TypedQuery<Users> typeQuery = this.entityManager.createQuery(query); 
        return typeQuery.getResultList(); 
    }
}