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

2023-11-20

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();
    });
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

6.SSH框架整合及简单使用示例 的相关文章

  • Spring Boot data-jpa 和 nativeQuery Postgres 转换

    我有一个习惯 Query在一个看起来像这样的存储库中 SELECT FROM topicaudit c14001 WHERE auditdate gt NOW AND auditdate lt NOW 1 hour INTERVAL AND
  • JCombobox 字符串项(可见)和整数键(固有)

    我有一个数据库模式 它将作为 JTable 列显示在 JCombobox 中以选择名称 但我希望将 ID 字段插入 作为外键 到另一个表中 通常 在下拉列表中选择一个项目 将所选项目带到组合框的显示区域 我想要做的是 当选择组合框中的任何项
  • 如何将 Struts 2 与 Velocity 和 Tiles 结合使用

    有人能够获得与 struts 2 一起使用的速度和图块吗 我在网上查找示例或教程时遇到一些问题 从我从邮件列表中收集到的信息来看 这似乎根本不可能 但邮件已经很旧了 https struts apache org docs tiles pl
  • HashMap何时以及如何将桶从链表转换为红黑树? [复制]

    这个问题在这里已经有答案了 我正在研究 java 8 功能 发现当存储桶上的条目集数量增加时 哈希图使用红黑树而不是链表 但是 这是否不需要密钥是可比较的或存在某种密钥排序以及这是如何工作的 这种转变何时真正发生以及如何发生 当有at le
  • Java生成范围内不重复的随机数

    我想生成 1 到 4 范围内的随机数 包括 4 这是我的代码 int num r nextInt 4 1 r is instance of Random 但是 我在循环中运行上述代码 并且不想重复随机数 现在发生的事情我经常得到 1 1 1
  • 通过 Session.update 和 HibernateTemplate.merge 进行 Hibernate 更新的区别

    我看到了更新操作的类型 第一的 getHibernateTemplate execute new HibernateCallback public Object doInHibernate Session session session f
  • 堆内存与对象内存

    根据一篇关于Java内存和特性的论文 内存分数分为两种类型 堆内存 即应用程序在运行时消耗的内存 对象内存 即程序中使用的各种对象分配的内存 例如整数和字符串等 他们的意思是stack当他们说时的记忆object记忆 或者它们是什么意思 很
  • 如何从 Jackson 中的自定义解串器调用默认解串器

    我在杰克逊的自定义解串器有问题 我想访问默认序列化器来填充我要反序列化的对象 在填充之后 我将做一些自定义的事情 但首先我想使用默认的 Jackson 行为反序列化对象 这是我目前拥有的代码 public class UserEventDe
  • Java 中内存高效的稀疏数组

    关于时间高效的稀疏数组存在一些问题 但我正在寻找内存效率 我需要相当于List
  • 无法在android中使用retrofit发出@Post请求

    我正在学习如何在 android 中使用改造 但是每当我尝试从互联网检索数据时 我的应用程序不会返回任何内容我的响应没有成功 我不知道如何修复当前我正在尝试发布的错误并使用此 URL 检索数据https jsonplaceholder ty
  • Java文本输出中的UTF-8编码问题

    我一直致力于测试高棉语 Unicode Wordbreaker 的各种解决方案 高棉语单词之间没有空格 这使得拼写检查和语法检查变得困难 以及从旧高棉语转换为高棉语 Unicode 我得到了一些源代码 现在在线 http www white
  • 使用 java 中的准备好的语句插入自定义 SQL 类型

    我有一些自定义类型 它们基本上都是枚举 以下是它们的外观示例 CREATE TYPE card suit AS ENUM spades clubs hearts diamonds 我在 Java 中有一些准备好的语句 看起来像这样 Setu
  • 如何在 Struts 2 中访问 OGNL 跟踪评估?

    有人告诉我要优化网络应用程序 为此 我使用JProfiler https www ej technologies com products jprofiler overview html 我注意到很大一部分响应时间都花在了表示层上 特别是当
  • 使用 Spark SQL 时找不到 Spark Logging 类

    我正在尝试用 Java 进行简单的 Spark SQL 编程 在程序中 我从 Cassandra 表获取数据 将RDD into a Dataset并显示数据 当我运行spark submit命令 我收到错误 java lang Class
  • 如何使用JSqlParser向sql添加where条件?

    我想用JSqlParser向sql添加where条件 例如 Before select from test table where a 1 group by c After select from test table where a 1
  • 正确的单元测试技术

    在使用 TDD 时 我发现自己需要测试一个包含查找值的常量 最终 哈希图 请查看更新中出现这种情况的原因 见下文 private static final Map
  • 当键位于父类中时,如何将一对多集合映射到连接的子类

    我想将一对多集合映射到子类 但集合的键是父类的属性 目前我正在映射 AbstractFoo Foo 和 Bar 类 如下所示
  • 无法验证 serde:org.openx.data.jsonserde.jsonserde

    我编写了这个查询来在配置单元上创建一个表 我的数据最初是 json 格式 所以我已经下载并构建了 serde 并添加了它运行所需的所有 jar 但我收到以下错误 FAILED Execution Error return code 1 fr
  • Java 8 流过滤器 - 基于排序的更新

    我正在尝试对过滤器中的字段进行排序 输入文件 样本记录 DocumentList Document id 5975ff00a213745b5e1a8ed9 u id mailboxcontent id 5975ff00a213745b5e1
  • 如果垃圾收集器没有删除未引用的对象,它们还能运行吗?

    如果一个对象正在等待垃圾收集 但包含一个在该对象的最后一个引用更改时正在运行的线程 那么该线程是否仍会运行并且代码是否仍会执行 那么您是否可能有一堆应该删除的幽灵对象 但它们对您的代码产生了影响 你如何防止这种情况发生 有没有办法让对象知道

随机推荐

  • 1-9 人机交互的角度

    操作系统的人机交互部分 OS改善人机界面 为用户使用计算机提供良好的环境 人机交互设备包括传统的终端设备和新型的模式识别设备 OS的人机交互部分用于控制有关设备运行和理解执行设备传来的命令 人机交互功能是决定计算机系统友善性的重要因素 是当
  • 机器学习算法GBDT的面试要点总结-上篇

    1 简介 gbdt全称梯度提升决策树 在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一 在前几年深度学习还没有大行其道之前 gbdt在各种竞赛是大放异彩 原因大概有几个 一是效果确实挺不错 二是即可以用于分类也可以用于回归 三是可
  • "无法找到“XXX.exe”的调试信息,或者调试信息不匹配

    今天调试一C 程序 按下F5 老是弹出一对话框显示信息 debugging information for myproject exe cannot be found or does not match No symbols loaded
  • ros_control学习

    前言 ROS中提供了丰富的机器人应用 SLAM 导航 MoveIt 但是你可能一直有一个疑问 这些功能包到底应该怎么样用到我们的机器人上 也就是说在应用和实际机器人或者机器人仿真器之间 缺少一个连接两者的东西 ros control就是RO
  • MySQL之数据类型

    目录 一 MySQL数据类型分类 二 数值类型 1 整数类型 2 bit类型 3 小数类型 三 字符串类型 1 char 2 varchar 3 char和varchar比较 四 日期和时间类型 五 enum和set 一 MySQL数据类型
  • C#短信接口开发经验及具体开发实现

    一 配置文件app config
  • Unicode编码小结

    Unicode编码 一 ASCLL码 ASCII American Standard Code for Information Interchange 美国信息交换标准代码 是基于拉丁字母的一套电脑编码系统 主要用于显示现代英语和其他西欧语
  • Flutter 扫描插件开发qrscan

    首先在pubspec yaml中集成 dependencies qrscan 0 2 17 在androd清单文件中加入以下权限
  • Ubuntu安装X11

    Qt实现linux无边框界面需要用到Xlib 安装X11命令如下 sudo apt get install libx11 dev libxext dev libxtst dev libxrender dev libxmu dev libxm
  • align-content 设置多行下的子元素排列方式 代码和图片展示

    align content 适用于 换行 多行 的情况下 单行无效 可以设置上对齐 居中拉伸和平均分配剩余空间等属性值 属性值 flex start 默认值 在侧轴头部开始排列 flex end 在侧轴尾部开始排列 center 在侧轴中间
  • 编程练习3-将文件a处理为文件b

    初始文件a txt a b c d e f o p q r s t 处理后文件b txt a b a b c d a b c d e f o p o p q r o p q r s t shell bin bash array1 awk p
  • 虚拟主机的数据库服务器怎么填,虚拟主机的数据库服务器怎么填

    虚拟主机的数据库服务器怎么填 内容精选 换一换 云服务器备份 云服务器备份可以对普通服务器进行整机备份或部分磁盘备份 不适用于部署了数据库等应用的服务器 支持备份弹性云服务器ECS和裸金属服务器BMS 成本相对于VBS较高 适合对需要备份整
  • anaconda 创建虚拟环境

    创建虚拟环境 conda create n 名字 python 版本号 e g conda create n test python 3 10 删除虚拟环境 conda remove n 名字 all e g conda remove n
  • 大数据之hive(数据仓库工具)的分组和分区操作

    注 在对hive的概念 优缺点 安装部署和参数配置在之后再进行总结 本小节主要对hive中的分组和分区进行总结 一 分组 1 group by语句 group by通常和聚合函数一起使用 按照一个或者多个列进行分组 然后对每个组进行聚合操作
  • Visual Studio 将json转换为实体类

    先复制你的json文本然后
  • JDK源码 --

    Object类 一 简介 gt java lang Object 是Java所有类的父类 在你编写一个类的时候 若无指定父类 没有显式extends一个父类 会默认的添加Object为该类的父类 在JDK 6之前是编译器处理 即编译后的zc
  • 【Python中线程和进程详解】

    一 区别 几乎所有的操作系统都支持同时运行多个任务 每个任务通常是一个程序 每一个运行中的程序就是一个进程 即进程是应用程序的执行实例 现代的操作系统几乎都支持多进程并发执行 注意 并发和并行是两个概念 并行指在同一时刻有多条指令在多个处理
  • 配置NFS服务器-debian

    NFS Network Files System 是网络文件系统的英文缩写 由Sun公司于1980年开发 用于在UNIX操作系统间实现磁盘文件共享 在Linux操作系统出现后 NFS被Linux继承 并成为文件服务的一种标准 通过网络 NF
  • 施耐德电气携中国信通院和中国联通共同发布白皮书,共探5G+PLC深度融合应用

    2023年9月20日 全球能源管理和自动化领域的数字化转型专家施耐德电气在第23届中国国际工业博览会首日的9月19日 与中国信息通信研究院 以下简称 中国信通院 及中国联合网络通信集团有限公司 以下简称 中国联通 联手重磅发布 5G PLC
  • 6.SSH框架整合及简单使用示例

    6 SSH框架整合 ssh spring spring mvc hibernate 6 1 整合的场所 web xml 跟 5 ssm框架 整合类似 可以对照学习 通过监听器配置hibernate 通过servlet配置mvc web xm