• Spring4 + SpringMVC + Hibernate4 环境搭建


    Spring4 + SpringMVC + Hiberate4 整合

    参考文章

    项目搭建

    创建WebApp项目

    image-20220915153319464

    Archetype 是 Maven的模板, 选择 org.apache.maven.archetypes:maven-archetype-webapp

    创建好的 maven 项目是下面这样

    image-20220915153453109

    添加相关依赖

    Spring 和 Hibernate 的版本 :

    • spring.version : 4.3.9.RELEASE
    • hibernate.version : 4.3.11.Final

    特别注意 : Spring5 和 Hibernate5 很多地方和4是不一样的, 这里要注意的

    依赖版本 :

    依赖名版本适用范围备注
    junit4.13.2test
    spring-test4.3.9.RELEASE-
    hibernate-core4.3.11.Final-Hibernate核心依赖
    spring-context
    spring-context-support
    spring-core
    spring-tx
    spring-beans
    spring-aop
    spring-ormSpringORM框架依赖
    mysql-connector-java8.0.13根据自己的版本来, 如果是MySQL5, 就使用5.x版本的
    druid1.2.13-SNSAPSHOT阿里巴巴数据库连接池依赖

    xml配置 :

    
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0modelVersion>
    
        <groupId>cn.knightzzgroupId>
        <artifactId>mini-spring-hibernateartifactId>
        <version>1.0-SNAPSHOTversion>
    
        <properties>
            <maven.compiler.source>8maven.compiler.source>
            <maven.compiler.target>8maven.compiler.target>
            <spring.version>4.3.9.RELEASEspring.version>
            
            <hibernate.version>4.3.11.Finalhibernate.version>
        properties>
    
        <dependencies>
            <dependency>
                <groupId>junitgroupId>
                <artifactId>junitartifactId>
                <version>4.13.2version>
                <scope>testscope>
            dependency>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-testartifactId>
                <version>4.3.9.RELEASEversion>
            dependency>
            <dependency>
                <groupId>org.hibernategroupId>
                <artifactId>hibernate-coreartifactId>
                <version>${hibernate.version}version>
            dependency>
    
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-contextartifactId>
                <version>${spring.version}version>
            dependency>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-context-supportartifactId>
                <version>${spring.version}version>
            dependency>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-coreartifactId>
                <version>${spring.version}version>
            dependency>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-txartifactId>
                <version>${spring.version}version>
            dependency>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-beansartifactId>
                <version>${spring.version}version>
            dependency>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-aopartifactId>
                <version>${spring.version}version>
            dependency>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-ormartifactId>
                <version>${spring.version}version>
            dependency>
    
            
            <dependency>
                <groupId>mysqlgroupId>
                <artifactId>mysql-connector-javaartifactId>
                <version>8.0.13version>
            dependency>
            <dependency>
                <groupId>com.alibabagroupId>
                <artifactId>druidartifactId>
                <version>1.2.13-SNSAPSHOTversion>
            dependency>
    
        dependencies>
    project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86

    添加相关配置

    image-20220915154330401

    整合Spring+Hibernate : 注意和 SpringMVC是和这俩没关系的, 为了防止把自己搞混, 先配置这两个

    • db.properties : 数据库连接以及数据库
    • applicationContext.xml : Spring相关的
    db.properties
    ################### JDBC Configuration ##########################
    jdbc.driverClassName=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/ssh_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    jdbc.username=root
    jdbc.password=123456
    ################### Hibernate Configuration ##########################
    #Hibernate方言配置
    hibernate.dialect=org.hibernate.dialect.MySQLDialect
    #是否显示SQL语句
    hibernate.show_sql=true
    #是否自动更新表格
    hibernate.hbm2ddl.auto=update
    #Hibernate缓存统计策略配置
    hibernate.generate_statistics=false
    #是否使用格式化SQL语句
    hibernate.format_sql=false
    #在格式化的SQL语句的基础之上加强可读性
    hibernate.use_sql_comments=false
    ################### 以下是Hibernate的c3p0配置 ##########################
    #最大连接数
    hibernate.c3p0.max_size=20
    #最小连接数
    hibernate.c3p0.min_size=5
    #获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒
    hibernate.c3p0.timeout=120
    #最大的PreparedStatement的数量
    hibernate.c3p0.max_statements=100
    #每隔120秒检查连接池里的空闲连接 ,单位是秒
    hibernate.c3p0.idle_test_period=120
    #当连接池里面的连接用完的时候,C3P0一下获取的新的连接数
    hibernate.c3p0.acquire_increment=2
    # 每次都验证连接是否可用
    hibernate.c3p0.validate=true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    applicationContext.xml

    这个配置部分我主要分为三个部分 :

    • spring注解扫描的配置, 主要是扫描相关包下的spring注解, 通过注解而不是xml的方式进行自动注入, 不然我们就需要配置大量的bean
    • Hibernate 与 MySQL相关的配置, 主要是db.properties的位置, 以及 SessionFactory 的注入, 这个我们必须使用 xml的方式进行注入
    • Hibernate事务的配置

    首先是第一部分 :

      
        <context:component-scan base-package="cn.knightzz"/>
    
    • 1
    • 2

    用于扫描spring的注解, 比如 @Component , @Service 这样的注解


    然后是第二部分, Hibernate核心配置 :

    • 数据源的配置
    • SessionFactory的配置

    首先是数据源 :

    	
        <context:property-placeholder location="classpath:db.properties"/>
        
        <bean id="dataSource"
              class="org.springframework.jdbc.datasource.DriverManagerDataSource"
              p:driverClassName="${jdbc.driverClassName}"
              p:url="${jdbc.url}"
              p:username="${jdbc.username}"
              p:password="${jdbc.password}">
        bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    第一个是用来加载配置文件的, 这样就可以使用 ${jdbc.username} 来获取配置文件

    其次是SessionFactory :

       
        <bean id="sessionFactory"
              class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="hibernateProperties">
                <props>
                    
                    
                    <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}prop>
                    
                    <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>
                    
                    <prop key="hibernate.use_sql_comments">${hibernate.use_sql_comments}prop>
                    
                    <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}prop>
    
                    
                    
                    <prop key="hibernate.c3p0.max_size">${hibernate.c3p0.max_size}prop>
                    
                    <prop key="hibernate.c3p0.min_size">${hibernate.c3p0.min_size}prop>
                    
                    <prop key="hibernate.c3p0.timeout">${hibernate.c3p0.timeout}prop>
                    
                    <prop key="hibernate.c3p0.max_statements">${hibernate.c3p0.max_statements}prop>
                    
                    <prop key="hibernate.c3p0.idle_test_period">${hibernate.c3p0.idle_test_period}prop>
                    
                    <prop key="hibernate.c3p0.acquire_increment">${hibernate.c3p0.acquire_increment}prop>
                    
                    <prop key="hibernate.c3p0.validate">${hibernate.c3p0.validate}prop>
                props>
            property>
            
            <property name="packagesToScan" value="cn.knightzz.entity"/>
        bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    需要注意的有以下几点 :

    • 如果是Hibernate4, class = org.springframework.orm.hibernate4 , 如果是 Hibernate5, class =org.springframework.orm.hibernate5

    另外就是, 一般情况下, 我们创建了一个 实体类, 比如 :

    package com.southwind.entity;
    
    import lombok.Data;
    
    import java.util.Set;
    
    @Data
    public class Account {
        private Integer id;
        private String name;
        private Set<Course> courses;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    那么我们就需要创建一个对应的 Account.hbm.xml 文件去把实体类和数据库表进性映射 :

    
    DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
    
        <class name="com.southwind.entity.Account" table="t_account">
    
            <id name="id" type="java.lang.Integer">
                <column name="id">column>
                <generator class="identity">generator>
            id>
    
            <property name="name" type="java.lang.String">
                <column name="name">column>
            property>
    
            <set name="courses" table="account_course">
                <key column="aid">key>
                <many-to-many class="com.southwind.entity.Course" column="cid">many-to-many>
            set>
    
        class>
    
    hibernate-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    然后再 hibernate.cfg.xml 中进行配置

    
    DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
    
        <session-factory>
           	
            ..... 
            
            
    
            <mapping resource="com/southwind/entity/Orders.hbm.xml">mapping>
            <mapping resource="com/southwind/entity/Account.hbm.xml">mapping>
    
    
        session-factory>
    
    hibernate-configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    但是, 为了简化开发, 我们可以使用注解进行映射 :

    package cn.knightzz.entity;
    
    import javax.persistence.*;
    
    /**
     * @author 王天赐
     * @title: Student
     * @projectName zjq-codes
     * @description:
     * @website http://knightzz.cn/
     * @github https://github.com/knightzz1998
     * @create: 2022-09-15 15:24
     */
    @Entity
    public class Student {
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Id
        @Column(name = "id")
        private int id;
        @Basic
        @Column(name = "name")
        private String name;
        @Basic
        @Column(name = "age")
        private int age;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    注意, 如果实体类名和表名一致(不区分大小写,) 就不需要添加 @Table(name="") 注解去指定表名

    然后,我们在配置 sessionFactory时, 添加扫描配置

       
        <bean id="sessionFactory"
              class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="hibernateProperties">
                <props>
                    
                    
                    <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}prop>
                    
                    <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>
                    
                    <prop key="hibernate.use_sql_comments">${hibernate.use_sql_comments}prop>
                    
                    <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}prop>
    
                    
                    
                    <prop key="hibernate.c3p0.max_size">${hibernate.c3p0.max_size}prop>
                    
                    <prop key="hibernate.c3p0.min_size">${hibernate.c3p0.min_size}prop>
                    
                    <prop key="hibernate.c3p0.timeout">${hibernate.c3p0.timeout}prop>
                    
                    <prop key="hibernate.c3p0.max_statements">${hibernate.c3p0.max_statements}prop>
                    
                    <prop key="hibernate.c3p0.idle_test_period">${hibernate.c3p0.idle_test_period}prop>
                    
                    <prop key="hibernate.c3p0.acquire_increment">${hibernate.c3p0.acquire_increment}prop>
                    
                    <prop key="hibernate.c3p0.validate">${hibernate.c3p0.validate}prop>
                props>
            property>
            
            <property name="packagesToScan" value="cn.knightzz.entity"/>
        bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    最后一行 扫描实体类路径配置

    最后部分是 事务的部分 :

        
        <bean id="transactionManager"
              class="org.springframework.orm.hibernate4.HibernateTransactionManager"
              p:sessionFactory-ref="sessionFactory">
        bean>
        
        <tx:annotation-driven transaction-manager="transactionManager"/>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    使用bean去注入 sessionFactory, 创建 HibernateTransactionManager 类型的bean的对象, 另外这个配置名id="transactionManager"是默认识别的, 改了就识别不了

    完整的配置如下 :

    
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:p="http://www.springframework.org/schema/p"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:tx="http://www.springframework.org/schema/tx"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
    
    
        
        <context:component-scan base-package="cn.knightzz"/>
    
        
        <context:property-placeholder location="classpath:db.properties"/>
        
        <bean id="dataSource"
              class="org.springframework.jdbc.datasource.DriverManagerDataSource"
              p:driverClassName="${jdbc.driverClassName}"
              p:url="${jdbc.url}"
              p:username="${jdbc.username}"
              p:password="${jdbc.password}">
        bean>
    
        
        <bean id="sessionFactory"
              class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="hibernateProperties">
                <props>
                    
                    
                    <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}prop>
                    
                    <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>
                    
                    <prop key="hibernate.use_sql_comments">${hibernate.use_sql_comments}prop>
                    
                    <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}prop>
    
                    
                    
                    <prop key="hibernate.c3p0.max_size">${hibernate.c3p0.max_size}prop>
                    
                    <prop key="hibernate.c3p0.min_size">${hibernate.c3p0.min_size}prop>
                    
                    <prop key="hibernate.c3p0.timeout">${hibernate.c3p0.timeout}prop>
                    
                    <prop key="hibernate.c3p0.max_statements">${hibernate.c3p0.max_statements}prop>
                    
                    <prop key="hibernate.c3p0.idle_test_period">${hibernate.c3p0.idle_test_period}prop>
                    
                    <prop key="hibernate.c3p0.acquire_increment">${hibernate.c3p0.acquire_increment}prop>
                    
                    <prop key="hibernate.c3p0.validate">${hibernate.c3p0.validate}prop>
                props>
            property>
            
            <property name="packagesToScan" value="cn.knightzz.entity"/>
        bean>
    
        
        <bean id="transactionManager"
              class="org.springframework.orm.hibernate4.HibernateTransactionManager"
              p:sessionFactory-ref="sessionFactory">
        bean>
        
        <tx:annotation-driven transaction-manager="transactionManager"/>
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    hibernate.cfg.xml
    
    DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
        session-factory>
    hibernate-configuration>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这个里面一般可以配置数据源之类的, 但是在 applicationContext中配置过了,所以不需要配置任何东西

    到这里基本上整个项目已经搭建好了

    测试Spring+Hibernate

    创建数据库表

    先创建一个 ssh_db 的数据库

    create table ssh_db.student
    (
        id   int auto_increment
            primary key,
        name varchar(255) not null,
        age  int          not null
    )
        comment 'ssh测试数据库';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    然后创建数据库表

    实体类生成

    image-20220915165156027

    先使用 IDEA自带的 DataBase 登陆上, 然后找到 侧边栏有个 Persistence 的功能, 如果找不到就去 IDEA 上方菜单 View -> Tool Windows 找

    image-20220915165236175

    选中自己的项目, 单击右键, 选择 Generate … -> By DataBase Scheme

    image-20220915165408205

    如下图所示

    image-20220915165641610

    按照图上的勾选即可, 因为我们是使用注解的方式去映射实体类, 所以不需要生成 xml 文件

    Dao层代码

    Dao层

    定义具体的方法

    package cn.knightzz.dao;
    
    import cn.knightzz.entity.Student;
    
    import java.util.List;
    
    /**
     * @author 王天赐
     * @title: StudentDao
     * @projectName zjq-codes
     * @description:
     * @website http://knightzz.cn/
     * @github https://github.com/knightzz1998
     * @create: 2022-09-15 12:04
     */
    public interface StudentDao {
    
        public List<Student> findAll();
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    实现类
    package cn.knightzz.dao.impl;
    
    import cn.knightzz.dao.StudentDao;
    import cn.knightzz.entity.Student;
    import org.hibernate.Criteria;
    import org.hibernate.SessionFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Repository;
    
    import javax.transaction.Transactional;
    import java.util.List;
    
    /**
     * @author 王天赐
     * @title: StudentDaoImpl
     * @projectName zjq-codes
     * @description:
     * @website http://knightzz.cn/
     * @github https://github.com/knightzz1998
     * @create: 2022-09-15 12:05
     */
    @Repository
    @Transactional
    public class StudentDaoImpl implements StudentDao {
    
        @Autowired
        SessionFactory sessionFactory;
    
        @Override
        public List<Student> findAll() {
            Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Student.class);
            return criteria.list();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    需要注意的点是 sessionFactory.getCurrentSession().createCriteria(Student.class); 这里后面尽量用 Student.class

    Spring4+Junit4

    环境搭建

    添加相关的依赖

    
     	<dependency>
                <groupId>junitgroupId>
                <artifactId>junitartifactId>
                <version>4.13.2version>
                <scope>testscope>
            dependency>
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-testartifactId>
                <version>4.3.9.RELEASEversion>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    需要注意的是, Spring4 和 Junit4 与 Junit5的使用方式不一样, Junit4的注解使用, Junit5不一定能用

    测试
    package cn.knightzz.test;
    
    import cn.knightzz.dao.StudentDao;
    import cn.knightzz.entity.Student;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    /**
     * @author 王天赐
     * @title: HibernateTest
     * @projectName zjq-codes
     * @description:
     * @website http://knightzz.cn/
     * @github https://github.com/knightzz1998
     * @create: 2022-09-15 14:30
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath:applicationContext.xml"})
    public class HibernateTest {
    
        @Autowired
        SessionFactory sessionFactory;
    
        @Autowired
        StudentDao studentDao;
    
        @Test
        public void test01() {
            System.out.println(sessionFactory);
            Session session = sessionFactory.openSession();
            System.out.println(session);
            Student student = new Student();
            student.setAge(13);
            student.setId(12);
            student.setName("tom");
            session.save(student);
            // 手动提交事务, 这里和mybatis不一样
            session.beginTransaction().commit();
            session.close();
        }
    
        @Test
        public void test02() {
            System.out.println(studentDao.findAll());
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    注意 , 需要两个配置 :

    • @RunWith(SpringJUnit4ClassRunner.class)
    • @ContextConfiguration(locations = {“classpath:applicationContext.xml”}) , 这个很重要

    整合 SpringMVC

    前言

    SpringMVC 和前面两个关系不大! 注意

    环境搭建

    添加依赖

    添加 SpringMVC 使用的依赖

    
    		
            <dependency>
                <groupId>org.springframeworkgroupId>
                <artifactId>spring-webmvcartifactId>
                <version>${spring.version}version>
            dependency>
            <dependency>
                <groupId>javax.servletgroupId>
                <artifactId>javax.servlet-apiartifactId>
                <version>3.1.0version>
                <scope>providedscope>
            dependency>
            <dependency>
                <groupId>javax.servlet.jspgroupId>
                <artifactId>jsp-apiartifactId>
                <version>2.2version>
                <scope>providedscope>
            dependency>
            <dependency>
                <groupId>jstlgroupId>
                <artifactId>jstlartifactId>
                <version>1.2version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    我们用到的jsp以及el表达式就需要 最后两个依赖

    创建配置文件
    image-20220915185509216

    红框部分是我们需要创建或者修改的文件, 我们首先创建一个 spring-mvc.xml 的文件, 可以空着 , 以及 pages 下面的一些列的文件夹或者目录

    修改web.xml配置

    web.xml 中的配置主要分为以下几个部分 :

    • SpringMVC核心配置 DispatcherServlet
    • spring与springmvc文件映射的配置
    • 其他的监听器或者中英文处理的配置
    • hibernate的配置

    首先是 DispacherServelet , 这个东西的作用是让原本应该是Servlet处理的请求, 把它拦截下来交给 SpringMVC

        
        <servlet>
            <servlet-name>DispatcherServletservlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
            <init-param>
                <param-name>contextConfigLocationparam-name>
                <param-value>classpath:spring-mvc.xmlparam-value>
            init-param>
            <load-on-startup>2load-on-startup>
        servlet>
        <servlet-mapping>
            <servlet-name>DispatcherServletservlet-name>
            <url-pattern>/url-pattern>
        servlet-mapping>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    除此之外, 还包含了 spring-mvc.xml 这个文件地址的映射


    其次是 一些其他的配置,比如 中文处理的配置, applicationContext.xml 地址配置, ContextLoaderListener 的配置 :

        
        <filter>
            <filter-name>CharacterEncodingFilterfilter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
            <init-param>
                <param-name>encodingparam-name>
                <param-value>UTF-8param-value>
            init-param>
        filter>
        <filter-mapping>
            <filter-name>CharacterEncodingFilterfilter-name>
            <url-pattern>/*url-pattern>
        filter-mapping>
    
        
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
        listener>
        
        <context-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:applicationContext.xmlparam-value>
        context-param>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    从上往下 :

    • 第一个是处理中文的, 防止中文乱码
    • 第二个是 ContextLoaderListener监听器的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。 因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法
    • ContextLoaderListener 和 applicationContext.xml 这俩是一起的

    最后是 Hibernate的配置 , 这个是要加上的, 具体作用可以找找博客看看, 不加会报错…

        
        
        <filter>
            <filter-name>openSessionInViewfilter-name>
            <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilterfilter-class>
        filter>
        <filter-mapping>
            <filter-name>openSessionInViewfilter-name>
            <url-pattern>/*url-pattern>
        filter-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    OpenSessionInViewFilter的主要功能是用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。 目的是为了实现"Open Session in. 例如: 它允许在事务提交之后延迟加载显示所需要的对象。

    spring-mvc的配置

    spring-mvc 的配置比较简单 :

    • 配置注解扫描 : 扫描 @Controller 这样的注解
    • 视图解析器, 为Controller跳转页面的时候, 加上前后缀的
    • 处理器适配器, 增强了功能, 支持 json 的读写
    • 静态资源的处理
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">
        
        <context:component-scan base-package="cn.knightzz"/>
    
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            
            <property name="prefix" value="/pages/"/>
            <property name="suffix" value=".jsp"/>
        bean>
    
        
        <mvc:annotation-driven/>
    
    
        
        
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/pages/"/>
            <property name="suffix" value=".jsp"/>
        bean>
    
        
        
    
        
        <mvc:resources mapping="/pages/js/*" location="/pages/js/"/>
        <mvc:resources mapping="/pages/css/*" location="/pages/css/"/>
        <mvc:resources mapping="/pages/images/*" location="/pages/images/"/>
    beans>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    有几点需要提到的是 : :

    • mapping 是 浏览器地址栏请求的那个路径. location是 webapp 目录下的那个路径
    • mapping 的 / 是 http://localhost:8769/ssh/
    • location 的 / 是 webapp/
    • 这个的作用和
    • SpringMVC-----静态资源映射
    • http://localhost:8769/ssh/pages/css/student.css 会被 匹配到 webapp/pages/css

    代码测试

    controller
    package cn.knightzz.controller;
    
    import cn.knightzz.dao.StudentDao;
    import cn.knightzz.entity.Student;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.servlet.ModelAndView;
    
    import java.util.List;
    
    /**
     * @author 王天赐
     * @title: StudentController
     * @projectName zjq-codes
     * @description:
     * @website http://knightzz.cn/
     * @github https://github.com/knightzz1998
     * @create: 2022-09-15 18:24
     */
    @Controller
    public class StudentController {
    
        @Autowired
        StudentDao studentDao;
    
        @RequestMapping("/student")
        public ModelAndView findAll() {
           
            ModelAndView mav = new ModelAndView();
            List<Student> students = studentDao.findAll();
            mav.addObject("students", students);
            mav.setViewName("student");
            
            return mav;
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    controller 部分很简单, 需要注意的是, 跳转页面有很多方法, 比如 使用 ModelAndView, 或者使用 Model , 或者其他的方法等等

    student.jsp
    <%--
      Created by IntelliJ IDEA.
      User: knight'z'z
      Date: 2022/9/15
      Time: 18:17
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%-- jstl 标签--%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    
    	学生
    	
    
    
    
    

    学生管理系统

    添加
    编号 姓名 年龄
    ${student.id} ${student.name} ${student.age} 修改 删除
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    需要注意的点有一些 :

    • 引入js或者css的时候 rel 别忘了, 不然不显示

    • 要使用 ${pageContext.request.contextPath} 这个其实相当于你发起了一次请求 , 等价于

    student.css :

    .title {
        color: rebeccapurple;
        font-size: 100px;
    }
    
    • 1
    • 2
    • 3
    • 4
    index.jsp
    
    
    

    Hello World!

    Student
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    点击 Student 即可跳转

    所有的文件目录结构

    image-20220915194231706
    测试

    全部配置完成以后, 点击 上方 Run 菜单, 添加配置

    image-20220915194345751

    注意选的是 Tomact Server , 不是 Tomact EE Server

  • 相关阅读:
    网络通信框架的完善
    基于PHP+MySQL的校园二手旧书回收捐赠系统
    数据结构刷题:第十一天
    浅谈智慧水务在供水厂企业中的应用发展-Susie 周
    redis性能测试
    DLL动态链接库的导入导出
    Vue.js核心技术解析与uni-app跨平台实战开发学习笔记 第6章 Vue.js路由 6.3 路由重定向以及动画路由 && 6.4 路由传参
    python科研绘图:圆环图
    vue补充继上一篇
    LeetCode125验证一个字符串是否是回文 415字符串相加 541反转字符串 II
  • 原文地址:https://blog.csdn.net/weixin_40040107/article/details/126878330