您的位置:首页 > 编程语言 > Java开发

Spring【整合DAO与Hibernate】

2016-02-14 11:03 363 查看

一。Spring配置数据源

  第一步:在根目录下配置jdbc.properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3307/myhibernate?useUnicode=true&&characterEncoding=UTF8
jdbc.username=root
jdbc.password=a617475430


  第二步:在applicationContext.xml下配置数据源

<!-- 用来解析一个Property文件  -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<!-- 去解析根目录(classpath)下的一个叫做jdbc.properties的文件 -->
<value>classpath:jdbc.properties</value>
</property>
</bean>
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password"></property>
</bean>


  【结论】:

    这样子配置后,我们就可以在页面获取数据源了

public void testDataSource(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
DataSource dataSource=(DataSource) context.getBean("dataSource");
System.out.println(dataSource);
}


    在这里我们又一次加强了面向接口编程的概念,因为我们不仅可以配置dbcp数据源,也可以配置c3p0数据源。他们都实现了Sun公司提供的DataSource接口。

二。Spring整合JDBC

  

  Spring整合JDBC,那么当然使用的是模板,什么是模板,就是动态参数+静态代码。动态参数当然就是连接数据库的一些信息,比如连接什么数据库,用户是什么,sql语句也是动态的。 静态代码是jdbc固定的语法规则,获取connection,创建Statement或者PrepareStatement,什么的。在使用Spring给我们提供的JDBC模板之前,我们先自定JDBC模板

  2.1  自定义JDBC模板

    第一步:创建核心模板类

        仔细体会这里,这里就运用了面向接口编程

public class myJDBCTemplate {
private DataSource dataSource;

public myJDBCTemplate(){} //setter注入
public myJDBCTemplate(DataSource dataSource){ //构造函数注入
this.dataSource=dataSource;
}

public void insert(String sql){
try {
//具体的jdbc操作
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//重点
getter and setter...
}


    第二步:继承自定义模板,开始使用

public class PersonDao extends myJDBCTemplate{
public void savePerson(String sql){
this.insert(sql);
}
}


    第三步:在Spring容器中配置

       这里的形式有很多,先看第一种配置形式:

  <!-- 上面了配置了数据源 -->
  <bean id="personDao" class="com.dao.PersonDao">
     <!-- 因为我们继承了模板,自然继承了模板方法setter,所以我们才能进行下面的DI -->
     <property name="dataSource" ref="dataSource"></property>
  </bean>


       第二种配置形式:把我们的自定义模板放入Spring容器中,进行DI。然后配置我们的dao时,添加parent属性即可

<bean id="module" class="com.jdbc.myJDBCTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="personDao" class="com.dao.PersonDao" parent="module">
</bean>


 

  2.2  Spring提供的模板

    先看下Springt提供的JDBC模板的类结构

     


     通过类结构图,看出最终执行数据操作的是JdbcTemplate,因为最根本的注入就是注入到了JdbcTemplate。JdbcTemplate本身给我们提供了两种注入方式,构造器和setter方法。这就是Sprint提供的JDBC模板,用来操作数据库的框架,在这里提下,不论是JDBC还是Hibernate,Spring提供的操作数据库的模板都是这样的类结构。

    Spring提供的Hibernate模板类结构

    


  2.3  使用Spring提供JDBC模板

    第一步:直接继承Spring提供给我们的模板就可以了

public class PersonDao extends JdbcDaoSupport{
public void savePerson(String sql){
this.getJdbcTemplate().execute(sql);
}
}


    第二步:配置Spring容器

  <!-- 上面了配置了数据源 -->
<bean id="personDao" class="com.dao.PersonDao">
<property name="dataSource" ref="dataSource"></property>
</bean>


三。Spring整合Hibernate

  通过上面的类结构,我们知道了Spring给我们提供了Hibernate模板,我们所要关心的只是注入sessionFactory的问题,在以前,我们使用的是Hibernate实现的SessionFactory。但这个实现类没有提供任何注入数据源的方式。所以Spring给我们提供了另一个SessionFactory实现类-LocalSessionFactoryBean

  

 第一步:Spring配置文件引入SessionFactory的两种方式

   方式一:

<bean id="sessionFactory1" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>


   方式二:

     使用这种方式就不需要hibernate.cfg.xml的配置文件了

<bean id="sessionFactory2" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- 映射文件所在的路径 -->
<property name="mappingDirectoryLocations">
<list>
<!-- spring容器会去该包以及其子包下搜索所有的映射文件 -->
<value>spring/domain</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>


 第二步:使用HibernateDaoSupport

public class PersonDaoImpl extends HibernateDaoSupport implements PersonDao {

@Override
public void savePerson(Person person) {
// TODO Auto-generated method stub
this.getHibernateTemplate().save(person);
}

}


四。HibernateTemplate深入研究-回调

  

  很明显,HibernateTemplate隐藏了Spring用session做具体动作的行为,我们只需要使用Spring提供给我们的HibernateTemplate模板就可以了。我们只需要给HibernateTemplate提供要操作的持久化对象与HQL语句即可。如果此时你需要Spring容器去执行你写的具体session操作,那我们就需要回调这个概念,Spring哦容器给我们提供下面这个类。

  HibernateCallback是Spring为程序员提供的回调接口,其中session是操作所处于的当前session,我们给HibernateTemplate赋值的时候,HibernateTemplate在调用真正的数据操作方法时,给这个真正操作方法传入了一个HibernateCallback。然后由Spring容器的doExecute(HibernateCallback callback..)方法来执行数据操作,现在把HibernateCallback提供给我们,让我们可以指定Spring容器的具体操作。

public interface HibernateCallback {
Object doInHibernate(Session session) throws HibernateException, SQLException;

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: