• SSH开发实践part1:Spring与Hibernate整合


    1

    之前把SSH看完了,现在从头开始进行项目实践。现在讲整个过程中的点滴记录下来,希望对后来者有参考。

    2

    SSH是一个轻量级的java开发框架,struts负责MVC开发模式中的controller角色,hibernate则是负责对象的持久化,也就是对DB的访问,spring则是利用其IOC反转控制来完成对bean对象的管理,包括对hibernate的管理。好吧,这些东西相信大家都不陌生。现在我们正式开始,整个开发步骤主要包括以下几点:

    • 新建web project项目
    • 增加spring与hibernate类库文件
    • 新建spring的配置文件:applicationContext.xml
    • 新建POJO及对应的hibernate映射文件
    • 编写DAO接口
    • 实现DAO各方法
    • 完善applicationContext.xml配置,整合spring与hibernate

    3.新建project和添加spring和hibernate就不多说了,如果嫌麻烦的话,可以通过myEclipse导入也可以。

      值得注意的就是别忘记添加你所用数据库(我用的mysql)JDBC驱动,c3p0的类库,spring orm/oxm/jdbc的类库文件。

      由于hibernate不能自动创建数据库,只能创建表结构,所以在开始项目之前我们先需要创建一个测试用的数据库,字符请选用UTF-8.

      关于applicationContext.xml的配置,主要是先配置dataSource以及sessionFactory,通过spring来进行管理,然后注入需要的DAO类中。

      以下是参考配置。

        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
            <property name="driverClass" value="com.mysql.jdbc.Driver"/>
            <property name="jdbcUrl" value="jdbc:mysql://localhost/hrsystem"/>
            <property name="user" value="root"/>
            <property name="password" value="root"/>
            <property name="maxPoolSize" value="40"/>
            <property name="minPoolSize" value="1"/>
            <property name="initialPoolSize" value="1"/>
        </bean>
        <bean id="sessionFactory"
            class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="mappingResources">
                <list>
                   
    </list> </property> <property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.hbm2ddl.auto=update hibernate.show_sql=true hibernate.format_sql=true; </value> </property> </bean>

      需要值得注意的是:

    • sessionFactory的实现类一定要写正确了,如果你用的是hibernate4以上的版本,那么记得改class属性。
    • mappingResources这里我们先留空,待后续完善bean配置文件再进行引入。
    • dialect注意写你的数据库对应的方言
    • hibernate.hbm2ddl.auto=update可以让hibernate自动生成表结构

    4.编写POJO以及hibernate映射文件

      POJO的编写就根据大家的需求自己写了,可以创建一个简单对象,同时写几个属性,通过IDE自动生成setter和getter函数

      别忘记创建一个空的构建函数。

      比如看看我的。

    public class Employee {
        private int id;
        private String name;
        private String password;
        private int age;
        
        public Employee(){}
    
      //隐藏各属性的get/set函数
      }

      然后根据POJO创建hibernate映射文件。

    <hibernate-mapping package="com.souvenir.bean">
        <class name="Employee" table="Employee">
            <!-- 映射标识属性 -->
            <id name="id" column="emp_id"
                type="int">
                <!-- 指定主键生成器策略 -->
                <generator class="identity"/>
            </id>
            <!-- 映射普通属性 -->
            <property name="name" type="string"/>
            <property name="password" type="string"/>
            <property name="age" type="int"/>
        </class>
    </hibernate-mapping>


    5.更新spring的配置文件

      将上面创建的bean映射文件引入到applicationContext.xml

    <list>
           <value>com/souvenir/bean/Employee.hbm.xml</value>
    </list>


    6.创建DAO接口

      至于为什么要用接口,我就不多说了,大家可以自行百度。

      在接口中主要定义了需要使用的方法:

    public interface EmployeeDAO {
        
        Employee get(int id);
        
        Integer save(Employee emp);
        
        void update(Employee emp);
        
        void delete(Employee emp);
        
        void delete(int id);
        
        List<Employee> findByName(String name);
        
        List<Employee> findAllEmp();
        
        int getEmpNums();
        
    }


    7.实现DAO接口

      DAO接口的实现主要是与hibernate打交道,完成对数据的持久化,或者常规的CRUD操作。

      hibernate提供一个很方便的持久层访问模板:HibernateTemplate,有个这个模板再加上sessionfactory,我们就可以很方面的对数据库进行OOP操作了。

      以下是实现代码:

      

    public class EmployeeDaoImp implements EmployeeDAO {
        private SessionFactory sessionFactory;
        private HibernateTemplate ht=null;
        
    
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
    
        private  HibernateTemplate getHibernateTemplate()
        {
            if (ht == null)
            {
                ht = new HibernateTemplate(sessionFactory);
            }
            return ht;
        }
        
        @Override
        public Employee get(int id) {
            // TODO Auto-generated method stub
            return getHibernateTemplate().get(Employee.class, id);
        }
    
        @Override
        public Integer save(Employee emp) {
            // TODO Auto-generated method stub
            return (Integer) getHibernateTemplate().save(emp);
        }
    
        @Override
        public void update(Employee emp) {
            getHibernateTemplate().update(emp);
            
        }
    
        @Override
        public void delete(Employee emp) {
            // TODO Auto-generated method stub
            getHibernateTemplate().delete(emp);
            
        }
    
        @Override
        public void delete(int id) {
            // TODO Auto-generated method stub
            getHibernateTemplate().delete(get(id));
        }
    
        @Override
        public List<Employee> findByName(String name) {
            // TODO Auto-generated method stub
            return getHibernateTemplate().find("from Employee e where e.name=?",name);
        }
    
        @Override
        public List<Employee> findAllEmp() {
            // TODO Auto-generated method stub
            return (List<Employee>) getHibernateTemplate().find("from Employee");
        }
    
        @Override
        public int getEmpNums() {
            // TODO Auto-generated method stub
            return (int)getHibernateTemplate().find("select count(*) from Employee").get(0);
        }
        

      通过代码我们可以看出,通过HibernateTemplate,我们的数据操作会很简单,很多常规的操作都已经实现了。

      然后这里我们会发现一个问题,sessionfactory怎么来呢?

      这里就需要说回spring了,我们通过spring对EmployeeDaoImp 这个类注入sessionfactory实例。

      OK,看配置!

    8.向DAO实现类注入sessionfactory

      回到之前的spring配置文件,我们需要增加一些关于employeedao的配置。

    <bean id="EmployeeDao" class="com.souvenir.daoImp.EmployeeDaoImp">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

      这里新配置了一个EmployeeDao的bean对象,并且向其注入了sessionfactory。

    9.测试

      好了,到这里我们第一阶段的工作基本上结束了,都是按照上面的几个步骤来完成。

      因为我们这里暂时没有引入struts,所以暂时不进行相关action配置。

      这里通过一个简单的main函数来测试我们的整个开发配置是正确:

      

    public static void main(String[] args) {
            
            ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
            EmployeeDAO empDao=(EmployeeDAO) ctx.getBean("EmployeeDao");
            for(int i=1;i<=10;i++){
                System.out.println("oooo==="+i);
                empDao.save(new Employee("souvenir"+i,i+1,"password"+i));
            }
        }

      通过加载applicationContext.xml配置,然后获取到dao对象,进行实体bean的操作。

      

      

      

      

      

  • 相关阅读:
    redis线程模型
    同步容器和并发容器
    200+面试题
    redis pipeline
    redis事务和脚本
    redis事务
    redis优缺点
    redis持久化策略
    Redis为什么要把所有数据放到内存中?
    redis的过期策略以及内存淘汰机制
  • 原文地址:https://www.cnblogs.com/souvenir/p/3783686.html
Copyright © 2020-2023  润新知