SSM整合笔记


整合

结构图

依赖

    <dependencies>
        <!--spring-->
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>

        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>


        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--spring操作数据库-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.2</version>
        </dependency>

        <!--log4j-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

        <!--注解-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <!--spring操作数据库-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.13</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.2</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
        </dependency>

        <!--springmvc-->
        <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>

    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <!--我的是GBK,此处应为False-->
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

Java

存放主要的业务代码

Pojo

最基础的层,存放元素类。
Books.java

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Books {
    private int id;
    private String name;
    private int counts;
    private String detail;
}


Dao

最接近数据库的一层。
BookMapper.java

public interface BookMapper {
    // 增加
    int addBooks(Books books);

    // 查询
    Books queryBooks(int id);

    // 更新
    int updateBooks(Books books);

    // 删除
    int delBooks(int id);

    // 查询所有
    List<Books> queryAll();

    // 模糊查询
    List<Books> queryFuzzy(String string);
}

BookMapper.xml

<?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="it.dao.BookMapper">
    <insert id="addBooks" parameterType="books">
        insert into ssmbuild.books values (#{id}, #{name}, #{counts},#{detail})
    </insert>

    <select id="queryBooks" resultType="books">
        select * from ssmbuild.books where id=#{id}
    </select>

    <update id="updateBooks" parameterType="books">
        update ssmbuild.books set name=#{name}, counts=#{counts}, detail=#{detail} where id=#{id}
    </update>

    <delete id="delBooks">
        delete from ssmbuild.books where id=#{id}
    </delete>

    <select id="queryAll" resultType="books">
        select * from ssmbuild.books
    </select>

    <select id="queryFuzzy" resultType="books">
        select * from ssmbuild.books where name like #{string}
    </select>
</mapper>

Service

利用一些Dao的数据库的操作实现一些功能,供Controller使用。

注意

  • 业务层不需要connection了,为什么呢?因为已经用SqlSessionFactoryBean注册完了,创建了SqlSession,这是mybatis的关键,同时把mapper也注入了,就可以getBean("xxxmapper")

BookService.java:

public interface BookService {
    public int addBooks(Books books);

    public Books queryBookById(int id);

    public int delBookById(int id);

    public int updateBook(Books books);

    public List<Books> queryAll();

    public List<Books> queryFuzzy(String string);
}

BookServiceImpl.java:

package it.service;

import it.dao.BookMapper;
import it.pojo.Books;
import java.util.List;

import java.awt.*;
import java.awt.print.Book;

// 可以实例化这个对象来才做,通过bean给这个类赋值bookMapper
public class BookServiceImpl implements BookService{

    // 设置一个mapper私有成员变量,可以通过这个mapper调用dao的方法
    private BookMapper bookMapper;

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

    public int addBooks(Books books) {
        return bookMapper.addBooks(books);
    }

    public Books queryBookById(int id) {
        return bookMapper.queryBooks(id);
    }

    public int delBookById(int id) {
        return bookMapper.delBooks(id);
    }

    public int updateBook(Books books) {
        return bookMapper.updateBooks(books);
    }

    public List<Books> queryAll() {
        return bookMapper.queryAll();
    }

    public List<Books> queryFuzzy(String string) {
        return bookMapper.queryFuzzy(string);
    }
}


Controller

BookController.java

package it.controller;

import it.pojo.Books;
import it.service.BookService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import java.util.List;

@Controller
@RequestMapping("/book")
public class BookController {
    // contriller 调 service
    // 报错没有获得,但是已经可以跳转了呀
    // 答:配置文件搞错了,运行的时候不被包含
    @Autowired
    @Qualifier("BookServiceImpl")
    private BookService bookService;


    @RequestMapping("/allbooks")
    public String allBooks(Model model){
        List<Books> books = bookService.queryAll();
        model.addAttribute("booklist", books);
        return "allBooks";
    }

    // 先到修改页面,修改页面显示原本信息
    // 修改页面保存修改内容传递给修改方法
    @RequestMapping("/getUpdate")
    public String getUpdate(int id, Model model){
        // 有id是因为要显示原本的内容
        Books books = bookService.queryBookById(id);
        model.addAttribute("oldMess", books);
        return "update";
    }

    // 接受修改信息,然后跳转回全部页面
    @RequestMapping("/doUpdate")
    public String updateBook(Books book){
        System.out.println("doupdate: " + book);
        bookService.updateBook(book);
        // 直接重定向
        return "redirect:/book/allbooks";
    }

    @RequestMapping("/addBook")
    public String addBook(Books book){
        bookService.addBooks(book);
        return "redirect:/book/allbooks";
    }

    // 转到点击跳转页面
    @RequestMapping("/toAddPage")
    public String toAddPaper(){
        return "addBook";
    }


    // 删除
    @RequestMapping(value = "/delBook/{did}", method = RequestMethod.GET)
    public String doDel(@PathVariable("did") int id){
        bookService.delBookById(id);
        return "redirect:/book/allbooks";
    }

    // 模糊查询
    @RequestMapping("/fuzzyQuery")
    public String queryFuzzy(String queryName, Model model){
        // 把name处理成模糊查询格式
        String sql = "%" + queryName + "%";
        System.out.println("sql" + sql);
        List<Books> books = bookService.queryFuzzy(sql);
        for (Books b: books){
            System.out.println("books" + b);
        }
        if (books.size() == 0){
            System.out.println("没找到");
            model.addAttribute("error", "未查找到内容!");
            model.addAttribute("booklist", bookService.queryAll());
            return "allBooks";
        }
        model.addAttribute("booklist", books);
        return "allBooks";
    }

}


Filter

过滤器,只要解决乱码问题。
encoder.java:

public class encoder implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=UTF-8");
        filterChain.doFilter(servletRequest, servletResponse);
    }

    public void destroy() {

    }
}


resources

database.properties
存放连接数据库的配置信息

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&userUnicode=true&characterEncoding=gbk
username=root
password=1234

mybatis-config.xml
mybatis的配置文件,但是大部分内容已经被Spring架空了 ,一般还保留日志和起别名信息。

<?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>


    <!--初始化日志-->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <!--起别名-->
    <typeAliases>
        <package name="it.pojo"/>
    </typeAliases>

</configuration>

spring-dao.xml
负责处理数据库层的业务,在此处连接数据库的数据源、获取得SqlSessionFactoryBean,同时通过扫描包来Dao接口注入到Spring容器中。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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/context
        http://www.springframework.org/schema/context/spring-context.xsd">


    <!--连接数据库的数据源-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;userUnicode=true&amp;characterEncoding=gbk"/>
        <property name="username" value="root"/>
        <property name="password" value="1234"/>
    </bean>
    <!--3. 获得SqlSessionFactoryBean-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!--绑定mybatis配置文件-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>

    <!--4. 配置dao接口扫描包,动态实现dao接口注入到Spring容器-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--注入SqlSessionFactory, 这里应是ref吧-->
        <!--这里的参数是个String,而不是SqlSessionFactoryBean类型-->
        <!--看人家方法名也知道了,是通过名字获取的-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!--要扫描的包-->
        <property name="basePackage" value="it.dao"/>
    </bean>

</beans>

spring-mvc.xml
支持MVC注解、不处理静态资源、自动扫描Controller包,配置视图解析器。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--支持MVC注解驱动-->
    <mvc:annotation-driven/>
    <!--不处理静态资源-->
    <mvc:default-servlet-handler/>
    <!--自动扫描包-->
    <context:component-scan base-package="it.controller"/>


    <!--视图解析器-->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

spring-service.xml
扫描Service下的包,将其中的实现类注入到Spring容器中,声明事务配置。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--1. 扫描service下的包,但是有什么用呢,扫描的是啥?-->
    <!--答:扫描是为注解服务的-->
    <context:component-scan base-package="it.service"/>

    <!--2. 将实现类注入到Spring-->
    <bean id="BookServiceImpl" class="it.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>

applicationContext.xml
总的配置文件,负责将所有配置信息整合到一起,方便读取。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <import resource="spring-dao.xml"/>
    <import resource="spring-mvc.xml"/>
    <import resource="spring-service.xml"/>

</beans>

注意
要在项目结构中将所有的配置信息组合到一起


Web

注意

  • DiapatcherServletname一定不能是springMVC,会失效,其他都行,不知道为啥,可能跟我某个内容冲突了
  • 别玩了加lib

web.xml:
功能就注册DispatchServlet和过滤器。

<?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">

    <!--1. 注册DispatchServlet-->
    <servlet>
        <!--这个名字就是不能用springMVC,其他都可以 -->
        <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>

    <!--自定义过滤器-->
    <filter>
        <filter-name>encoderFilter</filter-name>
        <filter-class>it.filter.encoder</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>encoderFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>


知识点

  • 一个接口有多个实现类,@Qualifier指明@Autowired具体注入哪个实现类
  • context:component-scan:扫描是为注解服务的:@Service、@Component、@Controller、@Repository修饰的类中含有@Autowired修饰的成员变量,则创建对象时会从IOC容器中取值为该成员变量赋值
  • /**代表拦截所有请求
  • 前端到后端要是只穿一个参数,要怎么做?只能通过url吗?不是,参数名一样也能传
  • 重定向:如果是直接到jsp,就是xxx.jsp,如果是jsp文件夹中的,可以用mapper跳转
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值