• Spring【整合DAO与Hibernate】


     

    一。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;
    
    }

  • 相关阅读:
    elasticsearch数据迁移
    Leetcode <剑指 Offer 64. 求1+2+…+n>
    Leetcode <27.移除元素>
    Leetcode <7.整数反转>
    Leetcode <1. 两数之和>
    python实现对于告警规则的判断思路
    Python实现密码生成器
    Autojs 打包APP+签名
    Docker 文档整理
    Pycharm 连接Linux远程开发
  • 原文地址:https://www.cnblogs.com/xingdongpai/p/5187246.html
Copyright © 2020-2023  润新知