ssm框架整合学习笔记~狂神

本文档详细介绍了如何创建一个普通的MAVEN项目,包括导入常用依赖如JUnit、数据库驱动、连接池、Servlet、JSP、Mybatis-Spring和Spring。接着,配置了Lombok、处理静态资源问题,并展示了数据库连接的配置,如数据库驱动、连接池配置、Mybatis配置文件、Mapper配置等。还涵盖了Service层的实现,包括接口、接口实现、数据库准备工作以及Spring的配置。最后,讨论了Spring MVC的整合,包括web.xml配置、DispatcherServlet的配置、视图解析器设置、JSON乱码问题以及日志配置。此外,还记录了解决项目中遇到的问题,如bean不存在、JDBC连接问题、事务管理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建一个普通的MAVEN项目

导入常用依赖

<!--依赖:junit,数据库驱动,连接池,servlet,jsp,mybatis-spring,spring-->
<dependencies>
    <!--junit-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <!--数据库驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <!--数据库连接池-->
    <dependency>
        <groupId>com.mchange</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.5.2</version>
    </dependency>
    
    <!--servlet - JSP-->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
    
    <!--Mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.2</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.2</version>
    </dependency>
    
    <!--Spring-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
</dependencies>

Lombok 偷懒

<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
</dependency>

处理静态资源问题

* 匹配0或者任意数量的字符

** 匹配0或者更多的目录

 <!--静态资源导出问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

连接数据库

xml文件

spring配置文件

  • applicationContext.xml
    • spring-mapper.xml
    • spring-service.xml
    • springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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-4.0.xsd
      ">
</beans>

Mybatis配置文件 mybatis-config.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>
    
</configuration>

database.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ssmbuild?useSSL=false&useUnicode=true&characterEncoding=utf-8
jdbc.user=root
jdbc.password=123456

Mapper

xml根据mybatis更改

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.can.mapper.BookMapper">

</mapper>

写好mapper.xml后去mybatis-config.xml注册

<mappers>
    <mapper class="com.can.mapper.BookMapper"/>
</mappers>

service

接口

接口实现 调用dao层 也是mapper层

数据库准备工作

关联数据库配置文件

<!--1、关联数据库配置文件-->
<context:property-placeholder location="classpath:database.properties"/>

连接池

c3p0

<!--2、连接池
org.springframework.jdbc.datasource.DriverManagerDataSource   是原生的
dbcp: 半自动化操作, 不能自动连接
c3p0: 自动化操作(自动化的加载配置文件,可以自动设置到对象中!)
druid:    hikari
-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driver}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="user" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.password}"/>
    
    <!--c3p0私有属性-->
    <property name="maxPoolSize" value="30"/>
    <property name="minPoolSize" value="10"/>
    
    <!--关闭连接后不自动commit-->
    <property name="autoCommitOnClose" value="false"/>
    <!--获取连接超时时间-->
    <property name="checkoutTimeout" value="10000"/>
    <!--当获取连接失败重试次数-->
    <property name="acquireRetryAttempts" value="2"/>
</bean>

jdbc

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.user}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

sqlSessionFactory

以前的用法 再写一个impl类实现

<!--sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <!--绑定Mybatis配置文件-->
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <property name="mapperLocations" value="classpath:com/can/mapper/*.xml"/>
</bean>

<!--SqlSessionTemplate就是之前使用的SqlSession-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <!--只能使用构造器注入sqlSessionFactory 因为他没有set方法-->
    <constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>

现在

<!--3、sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <!--绑定Mybatis配置文件-->
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <property name="mapperLocations" value="classpath:com/can/mapper/*.xml"/>
</bean>


<!--4.配置到接口扫描包,动态的实现了Dao接口可以注入到Spring容器中-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <!--注入SQLSessionFactory-->
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    <!--要扫描的dao包-->
    <property name="basePackage" value="com.can.mapper"/>
</bean>

相当于

<bean id="userMapper" class="com.can.mapper.UserMapperImpl">
    <property name="sqlSession" ref="sqlSession"/>
</bean>
public class UserMapperImpl implements UserMapper{


    //在原来所有的操作,都使用sqlSession来执行,现在都使用SQLSessionTemplate
    private SqlSessionTemplate sqlSession;

    public void setSqlSession(SqlSessionTemplate sqlSession) {
        this.sqlSession = sqlSession;
    }

    public List<User> selectUser(){
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        return mapper.selectUser();
    }
}

整合service

新建一个xml IDEA右上角有提示 可以整合到总的spring总的配置文件

也可以在总的配置文件里import导入

通过配置实现整合service

<!--2.将所有的业务类,注入到spring,可以通过配置,或者注解实现-->
<bean id="BookServiceImpl" class="com.can.service.BookServiceImpl">
    <property name="bookMapper" ref="bookMapper"/>
</bean>

通过注解实现

@Service
public class BookServiceImpl implements BookService{

    //service 调dao层: 组合Dao
    private BookMapper bookMapper;

    @Autowired
    public void setBookMapper(BookMapper bookMapper) {
        this.bookMapper = bookMapper;
    }
}

完整

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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-4.0.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    
    <!--1.扫描service下的包  有注解就自动扫描-->
    <context:component-scan base-package="com.can.service"/>
    
    <!--2.将所有的业务类,注入到spring,可以通过配置,或者注解实现-->
    <bean id="BookServiceImpl" class="com.can.service.BookServiceImpl">
        <property name="bookMapper" ref="bookMapper"/>
    </bean>
    
    <!--3.声明式事务-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!--注入数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    
</beans>

整合springMVC

1. 先添加web支持

在这里插入图片描述

2.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">
    
    <!--DispatchServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</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>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <!--Session-->
    <session-config>
        <session-timeout>15</session-timeout>
    </session-config>
</web-app>

SpringMVC-servlet.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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-4.0.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">
    
    
    <!--自动扫描包,让指定包下的注解生效-->
    <context:component-scan base-package="com.can.controller"/>
    
    <!--让Spring MVC不处理静态资源  .css .js .html .mp3 .mp4-->
    <mvc:default-servlet-handler/>
    
    <!--
    支持mvc注解驱动
        在spring中一般采用@RequestMapping注解来完成映射关系
        要想使@RequestMapping注解生效
        必须向上下文中注册DefaultAnnotationHandLerMapping
        和一个AnnotationMethodHandLerAdapter实例
        这两个实例分别在类级别和方法级别处理。
        而annotation-driver配置帮助我们自动完成上述两个实例的注入。
    -->
    <mvc:annotation-driven/>
    
    <!--视图解析器:模板引擎 Thymeleaf Freemarker-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    id="internalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
    
    <!--JSON乱码问题配置-->
    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                        <property name="failOnEmptyBeans" value="false"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    
</beans>

遇到的情况

在这里插入图片描述

解决步骤

问题:bean不存在

步骤
1. 查看这个bean是否存在   ok
2.Junit单元测试,看代码是否能查询出来结果   ok
3.问题不出在底层,spring出了问题
4.SpringMVC,整合的时候没有调用到Service层的bean;
	1.applicationContext.xml 没有注入bean
	2.web.xml,也绑定过配置文件  发现问题 这里配置的是springmvc-servlet.xml,这里面确实没有service bean 所以报空。

第二步test出错

java.security.cert.CertPathValidatorException: Path does not chain with any

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ssmbuild?useSSL=false&useUnicode=true&characterEncoding=utf-8
jdbc.user=root
jdbc.password=123456

useUnicode=true 改为 false

第四步,分析

第六行,要拿到上下文的配置文件,但是classpath:springmvc-servlet.xml只拿到了springmvc-servlet.xml里面的配置信息,没有拿到service的xml,可以将service的导入到:springmvc-servlet.xml,但是不现实,因为这三层已经导入到applicationContext里,所以可以直接调用classpath:applicationContext.xml

<!--DispatchServlet-->
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

可选择:声明式事务

spring-service.xml

<!--配置声明式事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<!--结合AOP实现事务的织入-->
<!--配置事务通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <!--给那些方法配置事务-->
    <!--配置事务的传播特性:new propagation-->
    <tx:attributes>
        <tx:method name="add" propagation="REQUIRED"/>
        <tx:method name="delete" propagation="REQUIRED"/>
        <tx:method name="query" read-only="true"/>
        <tx:method name="update" propagation="REQUIRED"/>
        <tx:method name="*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

<!--配置事务切入-->
<aop:config>
    <aop:pointcut id="txPointCut" expression="execution(* com.can.mapper.*.* (..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>

pom.xml

<!--aop事务支持-->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.13</version>
</dependency>

lib导包

基本配置完成,优化界面

<%--BootStrap--%>
<link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">

导入新包时lib没有导入报500错误

去lib中导入

修改书籍遇到问题

<%--出现问题,提交了修改的sql请求,但是修改失败
初次考虑,是事务问题,配置事务之后依旧无法修改!
看了sql发现没有传入id
sql执行失败,修改失败
前段传递隐藏域
--%>
<input type="hidden" name="bookID" value="${QBook.bookID}">

日志功能

标准日志

在mybatis核心配置文件中,配置日志!

<settings>
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

Log4j

  1. 先导入log4j包

    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>
    
  2. log4j.properties

    #将等级为DEBUG的日志信息输出到console和file这两个目的地,console和fiLe的定义在下面的代码
    1og4j.rootLogger=DEBUG, console,file
    #控制台输出的相关设置
    log4j.appender.console = org.apache.log4j.ConsoleAppender
    1og4j.appender.console.Target = System.out
    log4j.appender.console.Threshold=DEBUG
    log4j.appender.console.layout = org.apache.log4j.PatternLayout
    log4j.appender.console.layout.conversionPattern=[%c]-%m%n
    
    #文件输出的相关设置
    log4j.appender.file = org.apache.log4j.RollingFileAppender
    1og4j.appender.file.File=./log/kuang.log
    log4j.appender.file.MaxFileSize=10mb
    log4j.appender.file.Threshold=DEBUG
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c ]%m%n
    
    #目志输出级别
    log4j.logger.org.mybatis=DEBUG
    log4j.logger.java.sq1=DEBUG
    1og4j.logger.java.sq1.statement=DEBUG
    log4j.logger.java.sq1.ResultSet=DEBUG
    log4j.logger.java.sq1.PreparedStatement=DEBUG
    
  3. 配置log4j为日志的实现

    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    

模糊查询Mybatis 报错500

直接传参法

直接传参法,就是将要查询的关键字keyword,在代码中拼接好要查询的格式,如%keyword%,然后直接作为参数传入mapper.xml的映射文件中。

public void selectBykeyWord(String keyword) {
     String id = "%" + keyword + "%";
     String roleType = "%" + keyword + "%";
     String roleName = "%" + keyword + "%";
     userDao.selectBykeyWord(id,roleName,roleType);
 }

在Dao层指定各个参数的别名

 List<RoleEntity> selectBykeyWord(@Param("id") String id,@Param("roleName") String roleName,@Param("roleType") String roleType);

spring-mybatis.xml

    <select id="selectBykeyWord" parameterType="string" resultType="com.why.mybatis.entity.RoleEntity">
       SELECT
            *
        FROM
            t_role
        WHERE
            role_name LIKE #{roleName}
            OR id LIKE #{id}
            OR role_type LIKE #{roleType}
    </select>

CONCAT()函数

CONCAT(str1,str2,...)
  List<RoleEntity> selectBykeyWord(@Param("keyword") String keyword);
    <select id="selectBykeyWord" parameterType="string" resultType="com.why.mybatis.entity.RoleEntity">
        SELECT
            *
        FROM
            t_role
        WHERE
            role_name LIKE CONCAT('%',#{keyword},'%')
        OR
            id LIKE CONCAT('%',#{keyword},'%')
        OR
            role_type LIKE CONCAT('%',#{keyword},'%')
    </select>

Mybatis的bind

List<RoleEntity> selectBykeyWord(@Param("keyword") String keyword);
    <select id="selectBykeyWord" parameterType="string" resultType="com.why.mybatis.entity.RoleEntity">
        <bind name="pattern" value="'%' + keyword + '%'" />
        SELECT
        *
        FROM
        t_role
        WHERE
        role_name LIKE #{pattern}
        OR
        id LIKE #{pattern}
        OR
        role_type like #{pattern}
    </select>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值