ssm框架整合

目录

1.ssm框架简介

2.整合ssm框架

2.1项目准备

2.1.1导入需要的依赖

2.1.2 建立数据库

2.2 整合mybatis

2.3整合spring

2.3.1spring整合dao层

2.3.2spring整合service层

 2.4整合springmvc层


1.ssm框架简介

ssm框架是指spring、springmvc和mybatis,在我看来,mybatis简化了通过jdbc操作数据库的Java代码,而改用配置文件来对操作数据库进行必要配置。并且在实际操作数据库的时候,也不需要实现dao接口,而是通过配置文件来绑定设置,使得Java代码显得很简洁。

spring则是简化了获得对象的操作,将所有的对象都在spring容器中注册好,包括属性的注入,这样的结果就是在项目中不需要通过new获取对象,spring配置文件就直接可以将注册好的对象注入到需要的地方。

springmvc主要负责的就是controller层,也就是Javaweb的servlet层,它可以将请求的url地址解析出来,得到控制器,根据这个得到的控制器再去找controller相对应的方法,处理这个请求。

或许,可以不大准确地说,mybatis处理了dao层【也就是mapper,文章中出现的话mapper和dao是一个概念】对数据库操作的实际业务,spring处理了有关类的对象的获取,springmvc处理了servlet层,负责将请求分析找到对应的处理方法。这只是我学习到目前的一个看法,或许不妥,但借鉴这个思想看这篇整合文章确实是有助于理解的。

2.整合ssm框架

2.1项目准备

2.1.1导入需要的依赖

    <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>
        <!--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-webmvc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
    </dependencies>

2.1.2 建立数据库

建一个数据库ssmbuild,里面建一张books表,并且编写对应的Java实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Book {
    private int bookID;
    private String bookName;
    private int bookCounts;
    private String detail;
}

2.2 整合mybatis

mybatis主要用在dao层,实现对数据库的操作。这里需要编写一个BookMapper的接口以及接口的映射文件bookMapper.xml

public interface BookMapper {
//    获取书籍列表
    public List<Book> getBooks();
//    根据id获取书籍
    public Book getBookById(int bookID);
//    添加一本数据
    public int addBook(Book book);
//    根据id删除一本书籍
    public int deleteBookById(int bookID);
//    根据id修改一本书籍信息
    public int modifyBook(Book book);
}
<mapper namespace="com.plane.mapper.BookMapper">
    <select id="getBooks" resultType="Book">
        select * from books
    </select>

    <select id="getBookById" resultType="Book" parameterType="int">
        select * from books where bookID = #{bookID}
    </select>

    <insert id="addBook" parameterType="Book">
        insert into books(bookID, bookName, bookCounts, detail)
        VALUES (#{bookID}, #{bookName}, #{bookCounts}, #{details})
    </insert>

    <delete id="deleteBookById" parameterType="int">
        delete from books where bookID = #{bookID}
    </delete>

    <update id="modifyBook" parameterType="Book">
        update books set bookCounts=#{bookCounts}, bookName=#{bookName}, detail=#{detail}
         where bookID=#{bookID}
    </update>

</mapper>

在bookMapper.xml文件中使用了Book类的别名而没有写全限定名,这里别名在mybatis-config.xml文件中配置,配置文件如下(设置了日志、别名以及接口映射文件):

<configuration>

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

    <typeAliases>
        <typeAlias type="com.plane.pojo.Book" alias="Book"></typeAlias>
    </typeAliases>

    <mappers>
        <mapper resource="bookMapper.xml"></mapper>
    </mappers>


</configuration>

在这里,mybatis的整合就完成了。

在单纯的mybatis中,如果不整合spring,那么需要在mybatis-config.xml文件中对连接数据库进行必要的配置,如driver、url、username和password,然后通过这个配置文件获得一个SqlSessionFactory,再用SqlSessionFactory获得一个SqlSession,SqlSession获得mapper,mapper调用自身方法实现对数据库的操作。

但是我们还需要整合spring,在spring中,一切对象都托管到了spring容器中,不再由用户自己new出来了(完了,Java程序员不能自己new对象了 :  - < ),而是在spring容器中注册好,然后spring来帮我们获得。SqlSessionFactory、SqlSession等这些对数据库操作必要的对象也是由spring容器来帮我们获得的

2.3整合spring

2.3.1spring整合dao层

上一章节已经编写了一个操作数据库的mapper接口并完成了映射文件的编写,但是连接数据库必要的对象还没有。spring整合dao就是在spring容器中注册这些对象

注:这一章节的配置文件都是spring的配置文件,不是mybatis的。spring的配置文件和mybatis的配置文件头不同

编写spring-dao.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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

<!--   1 引入外部配置文件-->
    <context:property-placeholder location="classpath:db.properties"/>
<!--   2 注册连接池-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driver}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
    </bean>
<!--   3 注册sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
    </bean>
<!--   4 配置扫描mapper接口包,动态实现mapper接口注入到spring容器中
        也就是说,所有的mapper接口都已经被自动注册好了,可以直接使用-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
        <property name="basePackage" value="com.plane.mapper"></property>
    </bean>

外部配置文件如下

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
jdbc.username=root
jdbc.password=root

注:这里有一个很奇葩的坑,是一个使用了spring整合mybatis后出现连接数据库失败的错误,具体可看下面的链接:

版权声明:本文为CSDN博主「乄耂_×乀」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42069617/article/details/106059994

到此,SqlSession已经注册到spring容器中了,操作数据库的部分已经完成。

在普通的Javaweb项目中,servlet掉用service业务,service调用dao层业务,实现对数据库的操作。按照这个逻辑,现在需要进行spring对service层的整合了。

2.3.2spring整合service层

编写BookService接口和BookServiceImpl实现类,实现类中有一个BookMapper的属性,service调用mapper的方法来完成业务

public interface BookService {
    //    获取书籍列表
    public List<Book> getBooks();
    //    根据id获取书籍
    public Book getBookById(int bookID);
    //    添加一本数据
    public int addBook(Book book);
    //    根据id删除一本书籍
    public int deleteBookById(int bookID);
    //    根据id修改一本书籍信息
    public int modifyBook(Book book);
}
public class BookServiceImpl implements BookService{

    BookMapper bookMapper;

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

    public List<Book> getBooks() {
        return bookMapper.getBooks();
    }

    public Book getBookById(int bookID) {
        return bookMapper.getBookById(bookID);
    }

    public int addBook(Book book) {
        return bookMapper.addBook(book);
    }

    public int deleteBookById(int bookID) {
        return bookMapper.deleteBookById(bookID);
    }

    public int modifyBook(Book book) {
        return bookMapper.modifyBook(book);
    }
}

 编写spring-service.xml文件,将BookServiceImpl注册到spring容器中

<?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
        https://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.plane.service"></context:component-scan>-->

    <bean id="bookService" class="com.plane.service.BookServiceImpl">
        <property name="bookMapper" ref="bookMapper"></property>
    </bean>
<!--配置事务管理器到spring容器中-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>




</beans>

 2.4整合springmvc层

使用springmvc框架,首先在web.xml文件中注册了一个前端控制器dispatcherServlet,它可以将用户从前端发出的请求进行拦截解析,得到控制器。如 localhost:8080/allBooks,它可以解析得到控制器allBooks,根据这个控制器去controller中寻找相应的方法,处理请求。方法返回一个字符串,会被视图解析器解析到,进行前缀和后缀拼接,得到真实的页面资源地址。代码看下:

在web.xml文件中注册前端控制器以及乱码过滤器

    <!--1.注册DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
        <!--启动级别-1-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <!--/ 匹配所有的请求;(不包括.jsp)-->
    <!--/* 匹配所有的请求;(包括.jsp)-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>


    <filter>
        <filter-name>encoding</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>
    <!--    这里注意 / 和 /*的区别-->
    <!--      / 只会过滤请求的路径,/*会把请求和.jsp页面的路径都过滤-->
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

实现BookController类

@Controller
public class BookController {
    @Autowired
    @Qualifier("bookService")
    private BookService bookService;

    @RequestMapping("/allBooks")
    public String getAllBooks(Model model){
        List<Book> list = bookService.getBooks();
        for (Book book : list) {
            System.out.println(book);
        }
//        model.addAttribute("list", list);

        return "allBooks";
    }
}

编写springmvc-servlet.xml文件,开启注解支持、自动扫描@Controller注解以及注册视图解析器

<?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
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--    自动扫描包下的@Controller注解-->
    <context:component-scan base-package="com.plane.controller"></context:component-scan>
    <!--    让springmvc不处理静态资源-->
    <mvc:default-servlet-handler></mvc:default-servlet-handler>

    <!--    支持注解驱动
            在spring中一般采用@RequestMapping注解来完成映射关系
            想要使用@RequestMapping注解生效
            必须向上下文中注册DefaultAnnotationHandlerMapping和一个AnnotationMethodHandlerAdapter实例
            这两个实例分别在累计被和方法级别处理
            而annotation-dreven配置帮助我们自动我完成上述两个实例的注入
            它们的功能大概相当于处理映射器和处理适配器-->
    <mvc:annotation-driven></mvc:annotation-driven>

    <!--    添加 视图解析器:DispatcherServlet给它的ModelAndView-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>

 最后一步,在WEB-INF/jsp路径下新建一个allBooks.jsp文件,作为controller的跳转页面,启动项目,在浏览器地址栏输入 localhost:8080/allBooks 就会后台会打印出books表的所有数据项。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值