快速搭建整合一个SSM项目框架(新手专用)?
~SSM整合框架的搭建(重点)
前言
SSM即:Spring,SpringMVC,Mybatis
1.Spring介绍
- 2002年,首先推出了Spring的雏形, Spring框架以interface21为基础,经过重新设计,并不断丰富其内涵,于2004.3.24发布了1.0正式版
- Spring Framework创始人,著名作者Rod Johnson
- Spring理念:是现有的技术更加容易使用,本身是一个大杂烩,整合了现有的技术框架
2.SpringMVC介绍
- Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。
- Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。
- Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
3.Mybatis介绍
- MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。
- MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
- MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
做一个SSM项目,步骤如下
1.分析需求
首先知道要做一个什么样的项目,把大概要做的清楚
2.设计数据库
根据需求设计项目中会涉及到的表以及所用到的字段
3.创建一个Maven项目
可以IDEA工具直接创建Maven并选择webapp模板或者创建一个空的Maven项目后右击Add加上webapp
- 导入依赖(依据自己的情况导入依赖,仅供参考!)
<!--测试junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--MySQL数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<!--c3p0连接池-->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
<!--servlet.jsp-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.1</version>
</dependency>
<!--逆向工程-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
<!--Spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.0</version>
</dependency>
<!--aop-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.0</version>
</dependency>
<!--orm-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.3.0</version>
</dependency>
<!--事务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.0</version>
</dependency>
<!--thymeleaf-->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.3</version>
</dependency>
<!--fileupload 上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.2</version>
</dependency>
<!-- ehcache核心jar包 -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.11</version>
</dependency>
<!-- MyBatis与ehcache整合jar包 -->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.2.1</version>
</dependency>
<!--小辣椒-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
</dependency>
<!--静态导出问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
- 编写会用到的包(仅供参考!)
4.编写db.properties,连接数据库
user=root
password=root
#如果使用的是Mysql8.0+,增加一个时区的配置
url=jdbc:mysql://localhost:3306/student?useSSl=true&useUnicode=true&characterEncoding=utf8
driver=com.mysql.jdbc.Driver
5.编写applicationContext.xml核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--核心配置文件-->
<configuration>
<!--配置mybatis自带日志-->
<settings>
<!--用STDOUT_LOGGING显示sql语句-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 每个属性按需要加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
<typeAliases>
<!--这里给实体类去别名,方便在mapper配置文件中使用-->
<package name="com.qianfeng.entity.User"/>
</typeAliases>
</configuration>
6.编写dao层接口代码
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface UserDao {
List<User> getAll();
User getOne(Integer id);
int delete(Integer id);
int update(User user);
int add(User user);
int checkUserName(String username);
}
7.编写Mapper.xml(实现接口,CRUD去操作数据库)
~仅供参考!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--名字命名空间--><!--如果使用的是mapper接口的形式, 则namespace 写的就是接口的全类名-->
<mapper namespace="com.qianfeng.dao.UserDao">
<select id="getAll" resultType="User">
select * from user
</select>
<select id="getOne" resultType="User" databaseId="Integer">
select * from user where id=#{id}
</select>
<delete id="delete" parameterType="integer">
delete from user where id=#{id}
</delete>
<insert id="add" parameterType="User">
insert into user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="name!=null and name!=""">
name,
</if>
<if test="username!=null">
username,
</if>
<if test="password!=null">
password,
</if>
<if test="age >=0 and age<=150">
age,
</if>
<if test="gender!=null">
gender,
</if>
<if test="birth!=null">
birth
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="name!=null and name != """>
#{name,jdbcType=VARCHAR},
</if>
<if test="username!=null">
#{username,jdbcType=VARCHAR},
</if>
<if test="password!=null">
#{password,jdbcType=VARCHAR},
</if>
<if test="age >=0 and age <=150">
#{age,jdbcType=INTEGER},
</if>
<if test="gender!=null">
#{gender,jdbcType=VARCHAR},
</if>
<if test="birth!=null">
#{birth,jdbcType=DATE}
</if>
</trim>
</insert>
<update id="update" parameterType="User">
update user
<set>
<if test="name!=null and name!=""">
name = #{name,jdbcType=VARCHAR},
</if>
<if test="age >=0 and age <=150">
age = #{age,jdbcType=INTEGER},
</if>
<if test="gender!=null">
gender = #{gender,jdbcType=VARCHAR},
</if>
<if test="birth!=null">
birth = #{birth,jdbcType=DATE}
</if>
</set>
where id=#{id,jdbcType=INTEGER}
</update>
<select id="checkUserName" parameterType="string" resultType="int">
select count(*) from user where username=#{username};
</select>
<!--联合唯一去重-->
<select id="removeCoincidence" resultType="Boolean">
alter ignore table radar_region_coincidence add unique index(parent_radar_id,radar_id);
SELECT COUNT(1) as '查询数量' from user GROUP BY parent_radar_id,radar_id;
</select>
</mapper>
8.编写 mybatis.xml 的配置文件
<?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: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/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--扫包-->
<context:component-scan base-package="com.qianfeng.dao"/>
<!--1.关联数据库配置文件 property-placeholder 文件占位-->
<context:property-placeholder location="classpath:db.properties"/>
<!--2.数据库连接池
dbcp:半自动化操作,不能自动化连接
c3p0:自动化操作(自动化的加载配置文件,并且可以自动设置到对象中!)
druid(德鲁伊):hikari:
-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="username" value="${user}"/>
<property name="password" value="${password}"/>
<property name="url" value="${url}"/>
<property name="driverClassName" value="${driver}"/>
<!-- 连接池其他属性 -->
<!--第一次连接初始化-->
<property name="initialSize" value="100" />
<!--最大连接池数量-->
<property name="maxActive" value="1000" />
<!--最大等待时间,单位毫秒-->
<property name="maxWait" value="60000" />
<!--连接保持空闲而不被驱逐的最长时间-->
<property name="minEvictableIdleTimeMillis" value="300000" />
<!--连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作-->
<property name="keepAlive" value="true"/>
<!--有两个含义:
1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接 2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明-->
<property name="timeBetweenEvictionRunsMillis" value="-1" />
<!--最小连接池数量-->
<property name="minIdle" value="20" />
<!--要求程序从池中get到连接后, N 秒后必须close,否则druid 会强制回收该连接,不管该连接中是活动还是空闲, 以防止进程不会进行close而霸占连接。-->
<property name="removeAbandoned" value="true"/>
<!--设置druid 强制回收连接的时限,当程序从池中get到连接开始算起,超过此值后,druid将强制回收该连接,单位秒。-->
<property name="removeAbandonedTimeout" value="180"/>
<!--当druid强制回收连接后,是否将stack trace 记录到日志中-->
<property name="logAbandoned" value="true" />
<!--建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。-->
<property name="testWhileIdle" value="true" />
<!--用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。-->
<property name="validationQuery" value="SELECT 'x'" />
<!--申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。-->
<property name="testOnBorrow" value="false" />
<!--归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。-->
<property name="testOnReturn" value="false" />
<!--是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。-->
<property name="poolPreparedStatements" value="true"/>
<!--要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100-->
<property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>
<!--属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:
监控统计用的filter:stat
日志用的filter:log4j
防御sql注入的filter:wall-->
<property name="filters" value="stat,wall,slf4j"/>
<!--连接属性。比如设置一些连接池统计方面的配置。-->
<property name="connectionProperties" value="druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000" />
</bean>
<!--3.配置mybatis sqlsessionfactory -->
<!--SqlSessionFactoryBean来替代SqlSessionFactoryBuilder来创建SqlSession;利用mybatis映射文件**.xml来配置-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- SqlSessionFactoryBean有一个必须属性dataSource-->
<property name="dataSource" ref="dataSource"/>
<!--扫描pojo包,给包下所有pojo对象起别名-->
<property name="typeAliasesPackage" value="com.qianfeng.entity"/>
<!-- 当mybatis的xml文件和mapper接口不在相同包下时,需要用mapperLocations属性指定xml文件的路径。*是个通配符,代表所有的文件,**代表所有目录下 -->
<property name="mapperLocations" value="classpath:mappers/*.xml"/>
<!--(用来指定mybatis的xml配置文件路径),绑定mybatis-config.xml文件-->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!--4.在springmvc与mybatis整合时,需要对每一个mapper定义对应的一个MapperFactoryBean,
可以使用MapperScannerConfigurer自动扫描mapper,然后自动为我们注册对应的MapperFactoryBean对象。-->
<!--动态实现dao接口可以注入到Spring容器中-->
<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSession"/>
<!--basePackage表示需要扫描的包,annotationClass表示需要扫描该包下有该的注解的类。-->
<property name="basePackage" value="com.qianfeng.dao"/>
</bean>
</beans>
9.编写 service.xml 配置
<?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: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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/config ">
<!--1.扫service下的包-->
<context:component-scan base-package="com.qianfeng.service"/>
<!--2.spring 提供的 datasource 平台事务管理器(用做切面切点)--><!--配置声明式事务 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"/>
</bean>
<!--3.结合aop实现事务的植入-->
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add" propagation="REQUIRED"/>
<tx:method name="delete" propagation="REQUIRED"/>
<tx:method name="update" propagation="REQUIRED"/>
<tx:method name="query" read-only="true"/>
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
10.编写WEB-INF下的 web.xml 配置文件
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--声明应用范围(整个WEB项目)内的上下文初始化参数。-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</context-param>
<!--字符编码过滤器-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- init-param 的param-name 就是参数名 param-value就是参数值, 支持多个参数-->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<!--Restful过滤器 使得支持GET、POST、PUT与DELETE请求-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--DispatcherServlet 前端控制器-->
<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-web.xml</param-value>
</init-param>
</servlet>
<!--<url-pattern>:指定相对于Servlet的URL的路径。该路径相对于web应用程序上下文的根路径。
<servlet-mapping>将URL模式映射到某个Servlet,即该Servlet处理的URL。-->
<!--servlet的映射路径,-->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--设置session的失效时间,以分钟为单位-->
<session-config>
<session-timeout>15</session-timeout>
</session-config>
</web-app>
11.编写mvc.xml配置文件
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.alibaba.com/schema/stat http://www.alibaba.com/schema/stat.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--1.扫包-->
<context:component-scan base-package="com.qianfeng.controller"/>
<!--2.注解驱动:annotation-driven配置帮助我们挖成上述两个实例的注入,代替之前的适配器和映射器的开启的配置-->
<mvc:annotation-driven/>
<!--3.处理静态资源过滤-->
<mvc:default-servlet-handler/>
<!--4.MVC模板中添加 thymeleaf模板解析器-->
<bean id="templateResolver" class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<property name="characterEncoding" value="utf-8"/>
<property name="templateMode" value="HTML"/>
<!--不使用缓存-->
<property name="cacheable" value="false"/>
<property name="suffix" value=".html"/>
<property name="prefix" value="/"/>
</bean>
<!--5.模板引擎配置-->
<bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine">
<property name="templateResolver" ref="templateResolver"/>
</bean>
<!--6.配置视图处理器-->
<bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<property name="characterEncoding" value="utf-8"/>
<property name="templateEngine" ref="templateEngine"/>
</bean>
</beans>
目前SSM框架已经搭建好,开始编写业务逻辑代码了
~希望可以帮助到您,解决问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~