6.SSH框架整合及简单使用示例

6.SSH框架整合

ssh:spring+spring-mvc+hibernate

6.1 整合的场所 :web.xml

跟 5.ssm框架 整合类似,可以对照学习,通过监听器配置hibernate,通过servlet配置mvc

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

      <!--默认访问的页面,可以不用设置-->
      <welcome-file-list>
        <welcome-file>/views/login.jsp</welcome-file>
      </welcome-file-list>

      <!--上下文配置路径-->
      <context-param>
        <param-name>contextConfigLocation</param-name>
         <!--hibernate的配置文件-->
        <param-value>classpath:applicationContext.xml</param-value>
      </context-param>
      <listener>
        <!--上下文加载监听器,主要用于监听上下文参数配置,这里主要用来监听hibernate的配置文件-->
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
    
      <!--这是对spring mvc的整合配置-->
      <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <!--上下文配置路径-->
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>*.action</url-pattern>
      </servlet-mapping>

      <filter>
        <filter-name>encodingFilter</filter-name>
        <!--字符编码过滤器-->
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
          <!--编码格式-->
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
          <!--强制编码-->
          <param-name>forceEncoding</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
</web-app>


6.2 mvc和hibernate的配置文件:

6.2.1 spring-mvc.xml:( resources文件夹下)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <!--加载配置文件,加载进来就可以通过@Value注解来获取属性的值-->
    <context:property-placeholder location="classpath:config.properties" />

    <!--视图解析器:在控制器返回视图的时候生效-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <!--字符串消息转换器-->
    <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter" />
    <!--JSON消息转换器-->
    <bean id="jsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
                <value>application/json;charset=UTF-8</value>
            </list>
        </property>
    </bean>
    <!--开启MVC注解驱动-->
    <mvc:annotation-driven>
        <!--消息转换器-->
        <mvc:message-converters>
            <ref bean="stringHttpMessageConverter" />
            <ref bean="jsonHttpMessageConverter" />
        </mvc:message-converters>
    </mvc:annotation-driven>
    <!--扫描控制器所在的包-->
    <context:component-scan base-package="com.dream.ssh.controller" />
    <mvc:default-servlet-handler />

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8" />
        <!--内存中可用大小:3 * 1024 * 1024 = 3145728 = 3M-->
        <property name="maxInMemorySize" value="3145728" />
        <!--设置临时存储目录,当上传文件大小超过内存中可使用大小时将产生临时文件-->
        <property name="uploadTempDir" value="/upload"/>
        <!--10 * 1024 * 1024 = 1048576 = 10M -->
        <!--最大上传大小-->
        <property name="maxUploadSize" value="1048576" />
        <!--单个文件大小-->
        <property name="maxUploadSizePerFile" value="1048576" />
    </bean>
    <!--组件扫描-->
</beans>

6.2.2 applicationContext.xml:( resources文件夹下)

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--********************************************配置Spring***************************************-->
    <!-- 自动扫描 -->
    <context:component-scan base-package="com.dream.ssh">
        <!-- 扫描时跳过 @Controller 注解的JAVA类(控制器) -->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>


    <!--********************************************配置hibernate********************************************-->

    <!--扫描配置文件(这里指向的是之前配置的那个config.properties)-->
    <context:property-placeholder location="classpath:/config.properties" />

    <!--Druid数据源配置 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="${jdbc.url}" />
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>

    <!--配置session工厂-->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="com.dream.ssh.pojo" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <!--hibernate根据实体自动生成数据库表-->
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>   <!--指定数据库方言-->
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>     <!--在控制台显示执行的数据库操作语句-->
                <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>     <!--在控制台显示执行的数据哭操作语句(格式)-->
            </props>
        </property>
    </bean>

    <!-- 事物管理器配置  -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <!-- 开启注解事务-->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    <bean id="hibernateTemplate"
          class="org.springframework.orm.hibernate4.HibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
</beans>

config.properties:

#database connection config
jdbc.url=
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.username=
jdbc.password=

#hibernate config
hibernate.dialect = org.hibernate.dialect.MySQLDialect
hibernate.show_sql = true
hibernate.format_sql = true
hibernate.hbm2ddl.auto = update

6.3 Dao层使用hibernate进行持久化操作

在这里插入图片描述

pojo:

注:set和get方法需添加,属性和表字段不区分大小写,但若是不相同,还需要使用注解@Column进行解释。

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;

/**
 * 用户User实体类
 */
@Entity
@Table(name = "t_user")
public class User{
    //用户id
    @Id
    private String yhid;
    //用户姓名
    private String yhxm;
    //用户口令
    private String yhkl;
    //用户性别
    private String yhxb;
    //用户部门
    private String yhbm;
    //排序号
    private Long pxh;
    //是否禁用
    private String sfjy;
    
}

dao层实现类:

注:使用Repository注解标识

/**
 * 用户持久层的对象
 */
@Repository
public class UserDaoImpl implements UserDao {

    HibernateTemplate hibernateTemplate;

    /**
     * 注入 hibernateTemplate对象
     * @param hibernateTemplate 对象
     */
    @Resource
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
        this.hibernateTemplate = hibernateTemplate;
    }
}
常用示例1(新增):
@Override
public int insert(User user) {
    if (hibernateTemplate.save(user)!=null){
        return 1;
    } else {
        return 0;
    }
}
常用示例2(删除和批量删除):
/**
 * 批量删除
 * @param ids 用户id的字符串集合
 * @return 1 =成功
 */
@Override
public Integer batchDelete(String[] ids) {
    List<User> users = new ArrayList<>();
    for (int i = 0; i < ids.length; i++) {
        User user = new User();
        user.setYhid(ids[i]);
        users.add(user);
    }
    hibernateTemplate.deleteAll(users);
    return 1;
}

/**
 * 删除
 * @param username 用户id
 * @return 1 = 成功
 */
@Override
public Integer delete(String username) {
    User user = new User();
    user.setYhid(username);
    hibernateTemplate.delete(user);
    return 1;
}
常用示例3(修改):

注:一个业务层方法中,需要同时调用查询和修改,无法直接使用hibernateTemplate.update方法,session中的持久化对象会出现多个,引发冲突报出异常,可以使用hibernateTemplate.merge(user);将需要修改的对象复制到持久化对象中。

/**
 * 修改
 * @param user 用户实体
 * @return 1 =成功
 */
@Override
public int update(User user) {
    hibernateTemplate.update(user);
    return 1;
}
常见示例4(查询)
/**
 * 根据id查询用户信息
 * @param username 用户id
 * @return 用户信息对象
 */
@Override
public User selectById(String username) {
    User user = (User) hibernateTemplate.get(User.class, username);
    return user;
}

/**
 * 根据条件查询(模糊查询+分页+排序)
 * @param name 用户名或者id
 * @param depart 用户所属部门
 * @param start 开始的条数
 * @param limit 获取的数据量
 * @return
 */
@Override
public List<User> select(String name, String depart, Integer start, Integer limit) {

    return hibernateTemplate.execute(session -> {
        Criteria criteria = session.createCriteria(User.class);
        if (StringUtils.trimObj(name)!=""){
            criteria.add(Restrictions.or(
                Restrictions.like("yhid",name,MatchMode.ANYWHERE),
                Restrictions.like("yhxm",name,MatchMode.ANYWHERE)
            ));
        }
        if (StringUtils.trimObj(depart)!=""){
            criteria.add(Restrictions.eq("yhbm",depart));
        }
        List<User> list = criteria.addOrder(Order.asc("pxh")).setFirstResult(start).setMaxResults(limit).list();
        return list;
    });
}
/**
 * 得到条件下的用户数量(结合上一个分页的方法使用)
 * @param name 用户名或id
 * @param depart 用户部门
 * @return 数量
 */
@Override
public Integer getTotal(String name, String depart) {
    return hibernateTemplate.execute(session -> {
        Criteria criteria = session.createCriteria(User.class);
        if (!StringUtils.trimObj(name).equals("")){
            criteria.add(Restrictions.or(
                Restrictions.like("yhid",name,MatchMode.ANYWHERE),
                Restrictions.like("yhxm",name,MatchMode.ANYWHERE)
            ));
        }
        if (!StringUtils.trimObj(depart).equals("")){
            criteria.add(Restrictions.eq("yhbm",depart));
        }
        Long total = (Long)criteria.setProjection(Projections.rowCount()).uniqueResult();

        return total.intValue();
    });
}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值