7spring集成hibernate

Posted yuanGrowing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7spring集成hibernate相关的知识,希望对你有一定的参考价值。

1、感想

spring很重要的一个功能就是管理类,所谓spring和hibernate集成,无非就是将hibernate的类交于spring容器去管理。
一个是cfg.xml(用来配置hibernate与数据库相连的信息);
一个是hbm.xml(用来配置类与数据库表格的对应),使用了spring以后,我们可以在spring的文件里面写数据库相连的配置
信息,因此只需要写hbm.xml文件就行了。
多说无益,如果会hibernate的话,看了下面的例子很快就能成功集成了。

2、例子

2.1
  首先,很重要的一步是环境的配置,我建议使用maven或者gradle来进行项目的搭建,这样可以省去很多因为jar包冲突而引起的
很不必要的麻烦。
我使用的是maven,pom文件如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example.learnspring</groupId>
  <artifactId>learnspring</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>learnspring Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>3.2.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>3.2.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>3.2.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>4.2.1.Final</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.30</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>3.2.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-dbcp2</artifactId>
      <version>2.1</version>
    </dependency>
  </dependencies>
  <build>
    <resources>
      <resource>
        <directory>src/main/java</directory>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
      </resource>
    </resources>
  </build>
</project>
maven编译完以后的jar包情况如下:

2.2 设计一个User类:
public class User 
    private String name ;
    private String school ;

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String getSchool() 
        return school;
    

    public void setSchool(String school) 
        this.school = school;
    
和User类相对应的hbm.xml文件:
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.example.orm.User" table="USER">
        <id name="name" type="java.lang.String">
            <column name="NAME"/>
            <generator class="assigned"/>
        </id>
        <property name="school" type="java.lang.String">
            <column name="SCHOOL"/>
        </property>
    </class>
</hibernate-mapping>
一个IUserDao接口
public interface IUserDao 
    User[] getUsers();
UserDaoImpl实现IUserDao接口:
public class UserDaoImpl implements IUserDao
    private SessionFactory sessionFactory ;
    private Session session ;
    @Test
    public void test()
        ApplicationContext app = new ClassPathXmlApplicationContext("spring-main.xml");
        IUserDao userDao = (IUserDao) app.getBean("userdao");
        User[] users = userDao.getUsers();
        System.out.println(users.length);
    
    public User[] getUsers() 
        String hql = "from User" ;
        Query query = session.createQuery(hql);
        List list = query.list();
        if (list==null||list.size()==0)
            return null;
        else 
            User[] users = new User[list.size()];
            for(int i=0;i<users.length;i++)
                users[i] = (User) list.get(i);
            
            return users ;
        
    

    public SessionFactory getSessionFactory() 
        return sessionFactory;
    

    public void setSessionFactory(SessionFactory sessionFactory) 
        this.sessionFactory = sessionFactory;
        this.session = this.sessionFactory.openSession();
    
然后是spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="datasource" class="org.apache.commons.dbcp2.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
    <bean id="sessionfactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="datasource"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="show_sql">true</prop>
            </props>
        </property>
        <property name="mappingResources">
            <list>
                <value>com/example/orm/User.hbm.xml</value>
            </list>
        </property>
    </bean>
    <bean id="userdao" class="com.example.orm.UserDaoImpl">
        <property name="sessionFactory" ref="sessionfactory"/>
    </bean>
</beans>
这个配置文件的意思很简单,就是先定义了一个datasource,
里面有连接数据库的信息(代替了hibernate.cfg.xml的功能),
然后定义了一个sessionFactory,将datasource作为依赖注入,
然后sessionFactory里面还有hibernateProperties依赖
(用来描述hibernate的一些属性比如数据库方言等)和mappingResources(用来指向hbm.xml文件)。
最后一个自己写的UserDao,将sessionFactory作为依赖注入(注意,请看UserDaoImpl类中的set方法)

测试代码:(在数据库里面已经存了一个数据)
![这里写图片描述](https://img-blog.csdn.net/20160406161838821)
ApplicationContext app = new ClassPathXmlApplicationContext("spring-main.xml");
IUserDao userDao = (IUserDao) app.getBean("userdao");
User[] users = userDao.getUsers();
System.out.println(users.length);

运行结果:

1

3、细节

在上面spring文件中的datasource,其类型是一个接口,javax.sql.DataSource,因此,只要实现了这个接口的类应该都可以作为注入sessionFactory的依赖类,比如spring框架提供的org.springframework.jdbc.datasource.DriverManagerDataSource。
你也可以不使用datasource,在hibernateProperties里面直接配置数据库的连接信息:
<property name="hibernateProperties">
    <props>
        <prop key="hibernate.hbm2ddl.auto">update</prop>
        <prop key="show_sql">true</prop>
        <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
        <prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/test</prop>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
        <prop key="hibernate.connection.username">root</prop>
        <prop key="hibernate.connection.password">root</prop>
    </props>
</property>
但是一旦这么配置了以后就一定不要使用datasource,不然会出现奇怪的错误。

以上是关于7spring集成hibernate的主要内容,如果未能解决你的问题,请参考以下文章

7Spring+Struts2+MyBaits(无映射接口实现类)

Java -- Spring学习笔记7Spring事务

7Spring -Cloud-路由网管Spring Cloud Zuul

Java面试题总结 7Spring框架综合篇(附答案)

7Spring 源码学习 ~ 默认标签的解析之嵌入式 beans 标签的解析

7Spring 源码学习 ~ 默认标签的解析之嵌入式 beans 标签的解析