SpringMVC 应用 Hibernate 访问数据库

2015-11-12 22:56:59   最后更新: 2015-11-12 22:58:53   访问数量:873




hibernate 是一种 Java 语言编写的对象关系映射解决方案

他对 JDBC 进行封装,提供了完善的面向对象模型访问传统关系型数据库的映射,是一个十分方便的框架

他方便到即使你不知道数据库的用法(不只限于mysql),也可以无障碍的实现数据的各种操作

 

想要在 spring 中使用 hibernate,首先需要将 hibernate 相关的依赖加入到 pom.xml 中

<!-- Hibernate validator --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>${org.hibernate.verison}</version> </dependency> <!-- Hibernate framework --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${org.hibernate.verison}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${org.hibernate.verison}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-osgi</artifactId> <version>${org.hibernate.verison}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-envers</artifactId> <version>${org.hibernate.verison}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version>${org.hibernate.verison}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-proxool</artifactId> <version>${org.hibernate.verison}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-infinispan</artifactId> <version>${org.hibernate.verison}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>${org.hibernate.verison}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.9</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${org.springframework.version}</version> </dependency>

 

 

需要在 servlet-config.xml 中进行如下配置

<!-- 配置SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean" destroy-method="destroy"> <property name="dataSource" ref="dataSource"></property> <property name="packagesToScan"> <list><value>com.demo.model</value></list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> </props> </property> </bean>

 

 

hibernate.dialect

dialect 就是“方言”,也就是访问的是哪个类型的数据库,“方言”非常形象,所谓入乡随俗嘛,用什么数据库就要用什么方言与之沟通

主要提供以下方言:

RDBMS 方言
数据库方言
DB2org.hibernate.dialect.DB2Dialect
DB2 AS/400org.hibernate.dialect.DB2400Dialect
DB2 OS390org.hibernate.dialect.DB2390Dialect
PostgreSQLorg.hibernate.dialect.PostgreSQLDialect
MySQLorg.hibernate.dialect.MySQLDialect
MySQL with InnoDBorg.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAMorg.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version)org.hibernate.dialect.OracleDialect
Oracle 9i/10gorg.hibernate.dialect.Oracle9Dialect
Sybaseorg.hibernate.dialect.SybaseDialect
Sybase Anywhereorg.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Serverorg.hibernate.dialect.SQLServerDialect
SAP DBorg.hibernate.dialect.SAPDBDialect
Informixorg.hibernate.dialect.InformixDialect
HypersonicSQLorg.hibernate.dialect.HSQLDialect
Ingresorg.hibernate.dialect.IngresDialect
Progressorg.hibernate.dialect.ProgressDialect
Mckoi SQLorg.hibernate.dialect.MckoiDialect
Interbaseorg.hibernate.dialect.InterbaseDialect
Pointbaseorg.hibernate.dialect.PointbaseDialect
FrontBaseorg.hibernate.dialect.FrontbaseDialect
Firebirdorg.hibernate.dialect.FirebirdDialect

 

hibernate.hbm2ddl.auto

hibernate.hbm2ddl.auto 的主要作用是自动创建、更新、验证数据库表结构

主要可以取以下值:

  • create -- 每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因
  • create-drop -- 每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除
  • update -- 最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会
  • validate -- 每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值

 

hibernate.show_sql 与 hibernate.format_sql

hibernate.show_sql 取 false 或 true,是否输出所有SQL语句到控制台

如果 hibernate.show_sql 为 true,则可以通过配置 hibernate.format_sql 为 true 增加可读性

同时,还可以配置 hibernate.use_sql_comments 为 true 允许显示出的 sql 具有注释

 

事务相关配置

还可以通过下列配置指定如何支持事务:

<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 配置事务的传播特性 --> <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true"> <property name="transactionManager" ref="transactionManager" /> <property name="transactionAttributes"> <props> <prop key="save*">PROPAGATION_REQUIRED</prop> <prop key="delete*">PROPAGATION_REQUIRED</prop> <prop key="update*">PROPAGATION_REQUIRED</prop> <prop key="*">readOnly</prop> </props> </property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"> <property name="sessionFactory"> <ref local="sessionFactory" /> </property> </bean>

 

 

首先需要实现一个 HibernateDaoSupport 类:

package com.demo.util; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.orm.hibernate5.support.HibernateDaoSupport; /** * Created by techlog on 15/11/12. */ public class CustomHibernateDaoSupport extends HibernateDaoSupport { @Autowired public void anyMethodName(SessionFactory sessionFactory) { setSessionFactory(sessionFactory); } }

 

 

在 Hibernate 中,我们称之前的 model 为 Entity,首先需要创建表对应的 Entity:

package com.demo.model; import javax.persistence.*; import java.io.Serializable; /** * Created by techlog on 15/11/9. */ @Entity @Table(name="customer") public class Customer implements Serializable { private Integer custId; private String name; private Integer age; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name="cust_id", unique = true, nullable = false, length=32) public Integer getCustId() { return custId; } public void setCustId(int custId) { this.custId = custId; } @Column(length=32) public String getName() { return name; } public void setName(String name) { this.name = name; } @Column(length=32) public Integer getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Customer{" + "custId=" + custId + ", name='" + name + '\'' + ", age=" + age + '}'; } }

 

 

这里我们通过注解的方式,指定了表名及字段的属性等信息,事实上,结合我们之前了解过的 hibernate-validate 我们还可以做很多的限定

出于显示方便,我们还实现了 toString 方法,这并不是必须的,事实上,大多数情况下是不必要的

 

接下来我们来创建 DAO 接口并实现它,与之前不同,DAO 接口的实现类不仅需要实现 DAO 接口,还需要继承自我们之前创建的 HibernateDAOSupport 类

 

DAO

package com.demo.dao; import com.demo.model.Customer; /** * Created by techlog on 15/11/12. */ public interface CustomerDAO { Customer findOneById(int custId); }

 

 

DAO implement

package com.demo.dao.implement; import com.demo.dao.CustomerDAO; import com.demo.model.Customer; import com.demo.util.CustomHibernateDaoSupport; import org.springframework.stereotype.Repository; import java.util.List; /** * Created by techlog on 15/11/12. */ @Repository public class CustomerDAOImplement extends CustomHibernateDaoSupport implements CustomerDAO { @Override public Customer findOneById(int custId) { List list = getHibernateTemplate().find( "from Customer where custId = ?", custId ); return (Customer) list.get(0); } }

 

 

这里需要注意的是,find 方法的参数是 HQL 语句,他与 SQL 语句的区别在于,它使用的表名、字段名都是在 Hibernate 的 Entity 中定义的名称,而不是在数据库中的名称,事实上,所谓的 HQL 就是 Hibernate 的 SQL

 

JSP 文件我们还是使用之前的 test.jsp

 

Controller:

package com.demo.controller; import com.demo.dao.CustomerDAO; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; @RestController @RequestMapping(value = "/jdbc") public class HomeController { @Resource CustomerDAO customerDAO; @RequestMapping(value = "/find") public ModelAndView insertandfind(ModelAndView modelAndView) { modelAndView.addObject("customer", customerDAO.findOneById(1)); modelAndView.setViewName("test"); return modelAndView; } }

 

 

这样我们就可以看到展示出的结果了

 

  1. Hibernate ORM documentation (5.0) http://hibernate.org/orm/documentation/5.0/
  2. Maven + (Spring + Hibernate) Annotation + MySql Example http://www.mkyong.com/spring/maven-spring-hibernate-annotation-mysql-example/
  3. Object Relational Mapping (ORM) Data Access http://docs.spring.io/spring/docs/current/spring-framework-reference/html/orm.html
  4. Struts+Spring+Hibernate注解零配置整合 http://tianlihu.iteye.com/blog/1815404

 






技术帖      mvc      database      龙潭书斋      数据库      db      framework      orm      spring      springmvc      hibernate      repository      entity     


京ICP备15018585号