学习主题:Hibernate
学习目标:
1 掌握Spring整合Hibernate
2 掌握Hibernate的CURD
3 掌握HQL语句
1. Spring Data课程中的技术介绍
(1)什么是Hibernate?
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,Hibernate可以自动生成SQL语句,自动执行,是的Java程序员可以随心所欲的使用对象编程思维来操作数据库。Hibernate可以应用在任何JDBC的场合,就可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
(2)什么是JPA?
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
(3)什么是Hibernate JPA?
Hibernate 在 3.2 以后根据 JPA 规范提供了一套操作持久层的 API
(4)什么是Spring Data?
(5)什么是Spring Data JPA?
(6)什么是Spring Data Redis
2.Spring整合Hibernate
(1)如何在Spring的配置文件中配置DataSource?
<!-- 配置数据库连接池 -->
<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>
(2)如何在Spring的配置文件中配置SessionFactory?
<!-- 配置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>
(3)如何在Spring的配置文件中配置Hibernate的事物管理器?
<!-- 配置Hibernate的事务管理器 -->
<bean id=”transactionManager”
class=”org.springframework.orm.hibernate5.HibernateTransactionManager”
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
3.Hibernate添加、修改、删除操作
(1)@Entity注解的作用是什么?
表示当前类为实体类
(2)@Table注解的作用是什么?
第一层含义是表示当前创建的类对象是与@Table注解中的name的数据库表名做映射。
第二层含义是如果该项目使用正向工程,则注解中name的值作为在数据库中要创建的表的表名。
(3)@Id注解的作用是什么?
表示当前字段为该表的主键
(4)@GeneratedValue注解的作用是什么?
表示主键的生成策略,就是Hibernate提供了多种生成主键值的方法。
(5)@Column注解的作用是什么?
第一层含义是表示该属性与@Table注解中name属性值(创建的数据库表名)中的@Column注解的name属性值(表中的某个字段)是相对应的,需要去映射。
第二层含义是表示该项目的正向工程中我们需要创建的表中有一个字段是该注解中name属性的值。
4.Hibernate-HQL查询
(1)什么是HQL语言?
Hibernate Query Language
是一种面向对象的查询语言,类似于SQL,但是不去对表和列进行操作,而是面向对象和它们的属性。HQL查询翻译为传统的SQL查询从而对数据库进行操作。
(2)HQL语言的语法是什么?
HQL语法:就是将原来的sql语句中的表与字段名称换成对象与属性的名称就可以了。
//select * from t_users where username=
Query query = session.createQuery(“from Users where username= :abc”);
(3)getCurrentSession与openSession的区别?
getCurrentSession: 当前session必须要有事务边界,而且只能处理唯一的一个事务,当事务提交或者回滚后session自动失效。
openSession: 每次都会打开一个新的session加入每次使用多次。则获得的是不同session对象。使用完毕后我们需要手动的调用close方法关闭session
5.Hibernate-SQL查询
(1)使用SQL查询方式,根据用户姓名查询用户。
//SQL查询
List<Users> selectUsersByNameUseSQL(String username);
//SQL根据名字查询
@Override
public List<Users> selectUsersByNameUseSQL(String username) {
Session session=hibernateTemplate.getSessionFactory().getCurrentSession();
Query query = session.createSQLQuery("select * from t_users where username= ?").addEntity(Users.class).setString(0, username);
return query.list();
}
//SQL测试
@Test
@Transactional
public void testSelectByNameUseSQL(){
List<Users> list = usersDao.selectUsersByNameUseSQL("zhangsan");
for (Users users:list){
System.out.println(users);
}
}
6.Hibernate-QBC查询
(1)什么是QBC查询?
QBC查询是一种通过Criteria对象实现的不需要写查询语句,而是直接调用方法实现查询的查询方式
7.hibernate-jpa环境搭建
(1)什么是JPA?
是由Sun公司提供了一对对于持久层操作的标准(接口+文档)
(2)什么是Hibernate JPA?
是在Hibernate3.2版本那种提供了对于JPA的标准的实现,提供了一套按照JPA标准来实现持久层开发的API.
(3)Spring在整合Hibernate JPA时需要添加什么jar包?
(4)如何配置EntityManagerFactory?
<!-- Spring整合JPA 配置EntityManagerFactory-->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="jpaVedorAdapter">
<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>
8.hibernate-jpa中的CRUD操作
(1)@PersistenceContext注解的作用是什么?
表示会从工厂中取出一个EntityManager对象注入给我们的属性
9.hiberante-jpa中的HQL语句
(1)在Hibernate JAP中通过使用HQL方式,根据用户名查询用户信息。
//HQL查询
@Override
public List<Users> selectUsersByName(String username) {
return this.entityManager.createQuery("from Users where username= :abc").setParameter("abc",username).getResultList();
}
10.hibernate-jpa中的SQL语句
(1)在Hibernate JAP中通过使用SQL方式,根据用户名查询用户信息。
//SQL根据名字查询
@Override
public List<Users> selectUsersByNameUseSQL(String username) {
//在Hibernate JPA中如果用 ? 来帮顶参数,那它的查数是从1开始,而hibernamet是从0开始
return this.entityManager.createNativeQuery("select * from t_users where username= ?",Users.class).setParameter(1,username).getResultList();
}
11.hibernate-jpa中的Criteria操作
(1)在Hibernate JAP中通过使用Criteria方式,根据用户名查询用户信息。
//QBC查询
@Override
public List<Users> selectUsersByNameUseQBC(String username) {
//CriteriaBuilder对象,创建CriteriaQuery对象,创建查询条件
CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
//CriteriaQuery对象,执行查询的Criteria对象
//select * from t_users
CriteriaQuery<Users> query = builder.createQuery(Users.class);
//获取要查询的实体类的对象
Root<Users> root = query.from(Users.class);
//封装查询条件
Predicate cate = builder.equal(root.get("username"), username);
//select * from t_users where username=
query.where(cate);
//执行查询
TypedQuery<Users> typedQuery = this.entityManager.createQuery(query);
return typedQuery.getResultList();
}
12.Spring整合SpringDataJpa
(1)什么是Spring Data JPA?
是spring data项目下的一个模块,提供了一套基于JPA标准操作数据库的简化方案。底层默认是依赖Hibernate JPA来实现的。
(2)Spring Data JPA技术有哪些特点?
我们只需要定义接口并集成Spring Data JPA 中所提供的接口就可以了,不需要编写接口实现类。