SSM框架整合

环境要求:

环境:

  • IDEA

  • MySQL 5.7.19

  • Tomcat 9

  • Maven 3.6

要求:

  • 需要熟练掌握MySQL数据库,Spring,JavaWeb及MyBatis知识,简单的前端知识;

 

简单的数据库环境创建:

CREATE DATABASE ssmbuild
USE ssmbuild
CREATE TABLE IF NOT EXISTS books(
    `bookid` INT(4) NOT NULL AUTO_INCREMENT COMMENT 书id,
    `bookname` VARCHAR(10) NOT NULL COMMENT  书名,
    `bookcounts` INT(4) NOT NULL COMMENT 书数量,
    `detail` VARCHAR(20) NOT NULL COMMENT 描述,
    PRIMARY KEY (`bookid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO books(`bookname`,`bookcounts`,`detail`) 
VALUES(Java,1,从入门到放弃),
(MySQL,10,从删库到跑路),
(Linux,5,从进门到进牢)

SSM框架整合

 

 

 

使用maven创建项目,并导入如下依赖:

    <dependencies>
        <!--以下依赖必须要有-->
        <!--数据库连接驱动包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--数据源jar 与下面c3p0作用一致-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>
        <!--spring-mybatis整合jar包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.2</version>
        </dependency>
        <!--servlet jar包-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
        </dependency>
        <!--mybatis jar包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <!--spring jar包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.2.0.RELEASE</version>
        </dependency>
        <!--数据库源jar包,可以使用其他源-->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <!--spring aop切面jar包-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.13</version>
        </dependency>
        <!--jsp jar包-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>
        
        <!--以下jar非必需-->
        <!--调试jar包-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
        <!--日志 jar包-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!--注解jar包,实体类省去get,set代码-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
        </dependency>
        <!--json转换jar包-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.10.0</version>
        </dependency>
        <!--jstl jar包-->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
        <!--便准包-->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
    </dependencies>

并且配置maven资源过滤:

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

 

首先POJP实体类的创建,属性和数据库表的字段匹配:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
    private int bookId;
    private String bookName;
    private int bookCount;
    private String detail;
}

 

数据库连接层的配置:dao层接口创建,配置对应mapper文件(sql语句),配置mybtis文件,使用spring配置数据库源和连接数据库:

   1,dao层接口(bookDao)的创建

package com.hys.dao;

import com.hys.pojo.Book;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface bookDao {
    public void addBook(Book book);
    public void deleteBookById(@Param("bookId") int id);
    public void updateBook(Book book);
    public Book queryBookById(@Param("bookId") int id);
    public List<Book> queryBooks();
}

2,配置对应mapper文件(bookDao.xml),即调取bookDao接口的方法,配置对应sql语句

<mapper namespace="com.hys.dao.bookDao">
    <select id="addBook" parameterType="book">
        insert into ssmbuild.books(bookname, bookcount, detail) VALUES (#{bookName},#{bookCount},#{detail})
    </select>

    <delete id="deleteBookById" parameterType="int">
        delete from ssmbuild.books where bookid=#{bookId}
    </delete>

    <update id="updateBook" parameterType="book">
        update ssmbuild.books
        set bookname=#{bookName},bookcount=#{bookCount},detail=#{detail}
        where bookid=#{bookId}
    </update>

    <select id="queryBookById" resultType="book">
       select * from ssmbuild.books where bookid=#{bookId}
    </select>

    <select id="queryBooks" resultType="book">
        select * from ssmbuild.books
    </select>
</mapper>

 

3,mybtis文件(mybatis-config.xml)配置,这里配置很简单,因为和spring整合,主要配置在spring文件

<configuration>
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <typeAliases>
        <package name="com.hys.pojo"/>
    </typeAliases>

</configuration>

 

4,spring文件(dao-beans.xml)配置,配置数据源,注册sqlseesion工厂类,注册自动扫描类MapperScannerConfigurer,这个类动态代理实现bookDao接口实例创建

        <!--spring文件获取配置文件属性,值的配置-->
        <context:property-placeholder location="classpath:db.properties"/>

        <!--连接数据库源,这里使用c3p0-->
        <bean class="com.mchange.v2.c3p0.ComboPooledDataSource" id="dataSource">
                <property name="driverClass" value="${jdbc.driver}"/>
                <property name="jdbcUrl" value="${jdbc.url}"/>
                <property name="user" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
                <property name="maxPoolSize" value="30"/>
                <property name="minPoolSize" value="10"/>
                <property name="autoCommitOnClose" value="false"/>
                <property name="checkoutTimeout" value="100000"/>
                <property name="acquireRetryAttempts" value="2"/>
        </bean>
     
     <!--声明事务支持 dataSource 确定要了要对哪个数据源进行事务支持-->
     <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="sourceTransactionManager">
      <property name="dataSource" ref="dataSource"/>
     </bean>
        <!--生成sqlseeion工厂,并且关联mybatis文件-->
        <bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
                <property name="dataSource" ref="dataSource"/>
                <property name="configLocation" value="classpath:mybatis-config.xml"/>
        </bean>


        <!-- 自动扫描,动态创建dao层接口实例,只要其他类实现了dao层接口,就可以直接使用该接口的方法,service层可以直接调用!
             省去了,额外创建一个具体类供给service层类调用!
        -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
                <!--必须有以下两个属性-->
                <property name="sqlSessionFactoryBeanName" value="SqlSessionFactory"/>
                <property name="basePackage" value="com.hys.dao"/>
        </bean>

 

service层类的构建已经文件配置


1,创建service层接口(serviceBook),以及对应实现类(serviceBookImp),srevice主要是调用dao层接口(bookDao)

serviceBook

public interface serviceBook {

    public void addBook(Book book);
    public void deleteBookById(int id);
    public void updateBook(Book book);
    public Book queryBookById(int id);
    public List<Book> queryBooks();

}

serviceBookImp

public class serviceBookImp implements serviceBook{
    private bookDao bookDao;

    public void setBookDao(  bookDao bookDao) {
        this.bookDao = bookDao;
    }

    @Override
    public void addBook(Book book) {
        bookDao.addBook(book);
    }

    @Override
    public void deleteBookById(int id) {
        bookDao.deleteBookById(id);
    }

    @Override
    public void updateBook(Book book) {
        bookDao.updateBook(book);
    }

    @Override
    public Book queryBookById(int id) {
        return bookDao.queryBookById(id);
    }

    @Override
    public List<Book> queryBooks() {
        return bookDao.queryBooks();
    }
}

service层的spring文件(service-beans.xml)配置,主要是注册这个类serviceBookImp,这里实际可以使用注解进行操作

        <bean class="com.hys.service.serviceBookImp" id="serviceBookImp">
            <property name="bookDao" ref="bookDao"/>
        </bean>

 

controller层类创建以及对应spring文件

controller层类(bookController)的创建, 主要是连接前端以及调取service层(serviceBookImp)

这个类的通过set 注入了serviceBookImp 

每个方法对应前端的请求

@Controller
//连接前端,父路径/book
@RequestMapping("/book")
public class bookController {


    private serviceBook serviceBook;
    
    //自动装配
    @Autowired
    @Qualifier("serviceBookImp")
    public void setServiceBook(serviceBookImp serviceBookImp) {
        this.serviceBook = serviceBookImp;
    }
    
    //连接前端 ,子路径/getallbook
    @RequestMapping("/getAllBook")
    public String getAllBooks(Model model) throws JsonProcessingException {
        List<Book> books = serviceBook.queryBooks();
        model.addAttribute(books);
        return "allbooks";

    }

    @RequestMapping("/toUpdate")
    public String toUpdateBook(int id,Model model) throws JsonProcessingException {
        Book book = serviceBook.queryBookById(id);
        model.addAttribute(book);

        return "updatebook";

    }
    @RequestMapping("/update")
    public String updateBook(int bookId,String bookName,int bookCount ,String detail) throws JsonProcessingException {
        //serviceBook.addBook(new Book(4,"航海王",10,"伟大世界"));
        serviceBook.updateBook(new Book(bookId,bookName,bookCount,detail));
        return "redirect:/book/getAllBook";

    }
    @RequestMapping("/toDelete")
    public String toDeleteBook(int id,Model model) throws JsonProcessingException {
        serviceBook.deleteBookById(id);
        return "redirect:/book/getAllBook";

    }
    @RequestMapping("/toAddBook")
    public String toAddBook() throws JsonProcessingException {

        return "addBook";

    }
    @RequestMapping("/addBook")
    public String addBook(Book book) throws JsonProcessingException {
        serviceBook.addBook(book);
        return "redirect:/book/getAllBook";

    }
}

对应spring文件(mvc-beans.xml)的配置:

    <!--扫描对应包下的自动注册的注解-->
    <context:component-scan base-package="com.hys.controller"/>
    
    <!--过滤静态资源-->
    <mvc:default-servlet-handler/>
    
    <!--实现注解配置 -->
    <mvc:annotation-driven/>
    <context:annotation-config/>

    <!--视图解析器,controller层方法返回的string会进行解析-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

spring文件都已配置,很多网站都配置在一起了,这里分层分开配,比较清晰,最后整合这些配置文件到一个文件(applicationContext.xml)

        <import resource="classpath:service-beans.xml"/>
        <import resource="classpath:dao-beans.xml"/>
        <import resource="classpath:mvc-beans.xml"/>

 

web.xml配置

web.xml是配置servlet的,springmvc只要需要一个servlet,前端控制器,如下

同时也配了过滤器,防止乱码,使用了spring自带的过滤器

    <!--前端控制器,分发所有前端的请求,已经返回响应给前端-->
    <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:applicationContext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    
    <!--过滤器-->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 

最后是前端页面的配置,很简单,前端知识太菜了。。~这些前端页面是如何跳转的,请查看对应jsp的跳转指向,以及controller类(bookController)的代码

 

index.jsp 首页,有一个查看所有书籍的跳转:

  <body>
  <div style="font-size: 30px;margin: auto;text-align: center">
    <a style="text-decoration: none" href="${pageContext.request.contextPath}/book/getAllBook" >书籍跳转 </a>
  </div>
  </body>

SSM框架整合

 

allbooks.jsp 如下,可以增加书籍,已经带现有书籍的修改以及删除

<body>
        <h1>
            <a  style="text-decoration: none;font-size: 20px;color: orange" href="${pageContext.request.contextPath}/book/toAddBook" >增加书籍</a>
        </h1>
        <table >
            <thead>
                <tr>编号&nbsp;  &nbsp; &nbsp;</tr>
                <tr>书名&nbsp;  &nbsp; &nbsp;</tr>
                <tr>&nbsp;&nbsp;&nbsp数量&nbsp;  &nbsp; &nbsp; &nbsp;</tr>
                <tr>&nbsp描述&nbsp;  &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;</tr>
                <tr>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;操作</tr>
            </thead>
            <c:forEach var="book" items="${bookList}" >
                <tr>
                    <td>${book.bookId} &nbsp;  &nbsp; &nbsp; &nbsp;</td>
                    <td>${book.bookName}&nbsp; &nbsp;&nbsp; &nbsp;</td>
                    <td>${book.bookCount}&nbsp; &nbsp;&nbsp; &nbsp;</td>
                    <td>${book.detail} &nbsp; &nbsp;</td>
                    <td>
                        <a href="${pageContext.request.contextPath}/book/toUpdate?id=${book.bookId}" >修改</a>
                    </td>
                    <td>&nbsp; | &nbsp;</td>
                    <td>
                        <a href="${pageContext.request.contextPath}/book/toDelete?id=${book.bookId}">删除</a>
                    </td>
                </tr>
            </c:forEach>

        </table>
</body>

对应页面如下:

SSM框架整合

 

 

updatebook.jsp页面代码如下:

<body>
    <form action="${pageContext.request.contextPath}/book/update" method="get">
        <input type="hidden" name="bookId" value="${book.bookId}">
        <input type="text" name="bookName" value="${book.bookName}" required>
        <input type="text" name="bookCount" value="${book.bookCount}" required>
        <input type="text" name="detail" value="${book.detail}" required>
        <input type="submit" value="确认更新书籍">
    </form>
</body>

页面如下:

SSM框架整合

 

 

 

 

 addBook.jsp添加书籍页面代码如下:

<body>
<form action="${pageContext.request.contextPath}/book/addBook" method="get">
    <input type="text" name="bookName" value="" required>
    <input type="text" name="bookCount" value="" required>
    <input type="text" name="detail" value="" required>
    <input type="submit" value="确认增加书籍">
</form>
</body>

页面:

SSM框架整合

 

 

SSM框架整合

上一篇:StructLayout特性(转)


下一篇:解读顶会CIKM'21 Historical Inertia论文