SSM整合

1、将MyBatis整合进Spring的流程分析


目前大部分的Java互联网项目,都是用SpringMVC+Spring+MyBatis搭建平台的。使用Spring IOC可以有效管理各类Java资源,达到即插即拔的功能;通过AOP框架,数据库事务可以委托为Spring处理,消除很大一部分的事务代码,配合MyBatis的高灵活,可配置、可优化SQL等特性,完全可以构建高性能大型万丈。

在Spring的环境中使用MyBatis更加简单,节省了不少代码,甚至可以不用SqlSessionFactory、SqlSession等对象。因为MyBatis为我们封装了他们。

只是MyBatis-Spring项目不是Spring框架的子项目,因为当Spring3发布时,MyBatis3并没有完成。

1.1、原始的MyBatis-Spring项目整合 (不推荐)

配置MyBatis-Spring项目只需要这么几步:

  • 配置数据源
  • 配置SqlSessionFactory
  • 可以选择的配置有SqlSessionTemplate,在同时配置SqlSessionTemplate和SqlSessionFactory的情况下,优先采用SqlSessionTemplate。
  • 配置Mapper,可以配置单个Mapper,也可以通过扫描的方法生成Mapper,比较灵活

1.1.1、配置SqlSessionFactoryBean

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-546m30Xw-1579012800124)(02.png)]


下图为SqlSessionFactoryBean的源码,从下图可以看出,内置了许多MyBatis配置的标签,在Spring框架中将其转换为属性,也就是SqlSessionFactoryBean会将SqlSessionFactory转换为对象。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n2voJWwA-1579012800126)(03.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DkQjz03s-1579012800127)(04.png)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8VsjfABk-1579012800128)(05.png)]
配置DBCP数据源

	 <!--配置数据库连接池-->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql://localhost:3306/heima?useUnicode=true&amp;characterEncoding=UTF-8&amp;userSSL=false&amp;serverTimezone=GMT%2B8"></property>
    <property name="username" value="root"></property>
    <property name="password" value="123456"></property>
    <!--连接池中最大数据库连接池双-->
    <property name="maxIdle" value="5" ></property>
    <!--最大等待毫秒数-->
    <property name="maxWaitMillis" value="10000"></property>
</bean>

配置SqlSessionFactory

 <!--配置SqlSessionFactoryBean-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!--配置数据源:这样的话在MyBatis配置文件中就不需要再次配置数据源-->
    <property name="dataSource" ref="dataSource"></property>
    <!--配置MyBatis-config的配置文件-->
    <property name="configLocation" value="classpath:sqlMapperConfig.xml"></property>
    <!--还可以配置其他的属性,总之可以代替在MyBatis配置文件中的配置-->
</bean>

1.1.2、SqlSessionTemplate组件

严格来说,SqlSessionTemplate并不是一个必须配置的组件,但是她存在一定的价值。首先,它是一个线程安全的类,也是确保每个线程使用的SqlSession唯一且不互相冲突。其次,它提供了一系列的功能,比如增删改查等常用功能,不过在此之前需要先配置它,而配置也是比较简单的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tj7xg78d-1579012800128)(06.png)]

1.1.3使用

配置好了SqlSessionTemplate就可以使用它了,比如增删改查的应用。

  ApplicationContext applicationContext = new ClassPathXmlApplicationContext("SpringConfig.xml");

    SqlSessionTemplate sqlSessionTemplate =(SqlSessionTemplate) applicationContext.getBean("sqlSessionTemplate");

    List<User> users = sqlSessionTemplate.selectList("com.itheima.Dao.UserDao.findAll");

    System.out.println(users);

关于SqlSessionTemplate,目前运用已经不多,它需要使用字符串表明运行哪个Sql,字符串不包含业务含义,只是功能性代码,并不符合面向对象的规范,已经被弃用。

1.2、配置MapperFactoryBean(也并不是实用)

BeanFactory that enables injection of MyBatis mapper interfaces.

为了解决1。1中的问题,,,MyBatis-Spring团队提供了一个MapperFactoryBean类作为中介,我们可以通过配置它来实现我们想要的Mapper,使用Mapper接口编程方式可以有效的在逻辑代码中擦除SqlSessionTemplate,这样代码就按照面向对象的规范进行编程。

	 <!--配置MapperFactoryBean
        通过配置它来实现我们想要的Mapper,使用Mapper接口编程方式可以有效的在逻辑代码中
        擦除SqlSessionTemplate,这样代码就按照面向对象的规范进行编写
    -->
    <bean id="roleMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <!--roleMapper接口将被扫描为Mapper-->
        <property name="mapperInterface" value="com.itheima.Dao.UserDao"></property>
        <property name="sqlSessionFactory" ref="sqlSessionFactoryBean"></property>
        <!--如果同时注入sqlSessionFactory和sqlSessionTemplate,则只会启动sqlSessionTemplate-->
        <!--<property name="sqlSessionTemplate" ref="sqlSessionTemplate"></property>-->
    </bean>

这里可以看到MapperFactoryBean存在3个属性可以配置,分别是mapperInterface、SqlSessionTemplate和SqlSessionFactory,其中:

  • mapperInterface是映射器的接口

  • 如果同时配置 sqlSessionTemplate和sqlSessionFactory,那么它就可以启用sqlSessionTemplate,而SqlSessionFactory作废。

    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“SpringConfig.xml”);
    UserDao userDao = (UserDao)applicationContext.getBean(UserDao.class);
    System.out.println(userDao.findAll());

有时候项目比较大,如果一个个配置Mapper会造成配置量大的问题,这显然不利于开发,为此MyBatis也有了应对方案,那就是下面实用到灵位一个类—MapperScannerConfigure,通过它可以用扫描的形式去生产对应的Mapper.

1.3配置MapperScannerConfigurer(最常用)

这是一个通过扫描的形式进行配置的Mapper类,如果一个个去配置Mapper,显然工作量大,并且导致配置泛滥,有了它就只需要给与一些简单的配置,它就能够生成大量的Mapper,从而减少工作量:

需要注入的属性:**

  • basePackage:指定映射接口文件所在的包路径,当需要扫描多个包时可以使用分号或逗号作为分隔符
  • annotionClass:指定要扫描的注解名称,只有被注解标志的类才会被配置为映射器
  • sqlSessionFactoryBeanName:指定在Spring中定义的SqlSessionFactory的Bean名称
  • sqlSessionTemplateBeanName:指定在Spring中定义的SqlSessionTemplate的Bean的名称,则SqlSessionFactoruBeanName将不起作用

<!--有时项目较大,如果一个个配置Mapper会造成配置量大的问题,
    这显然不利于开发,为此MyBatis也有了应对的方案,那就是MapperScannerConfigurer,通过它
    可以扫描的形式去生成对应的Mapper

    -->
<!--配置MapperScannerConfigurer,这是一个通过扫描的形式配置Mapper的类,如果一个个去配置Mapper,显然
    工作量大,并且导致配置泛滥,有了它只需要给与一些简答的配置。它口能生成大量的Mapper-->

<bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.itheima.Dao"></property>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    <!-- 指定标注才扫描成Mapper-->
    <property name="annotationClass" value="org.springframework.stereotype.Repository"></property>
</bean>

1.4spring+MyBatis总结

基于以上分析,spring+MyBatis的配置步骤往往采用如下的模式(步骤):

  • 配置基础的sPring约束
  • 配置数据源
  • 配置sqlSessionFactoryBean
  • 配置MapperScannerConfigurer

<context:component-scan base-package="com.itheima"></context:component-scan>

<!--MyBatis的基础配置-->
<!--配置数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql://localhost:3306/heima?useUnicode=true&amp;characterEncoding=UTF-8&amp;userSSL=false&amp;serverTimezone=GMT%2B8"></property>
    <property name="username" value="root"></property>
    <property name="password" value="123456"></property>
    <!--连接池中最大数据库连接池双-->
    <property name="maxIdle" value="5" ></property>
    <!--最大等待毫秒数-->
    <property name="maxWaitMillis" value="10000"></property>
</bean>

<!--配置SqlSessionFactoryBean:MyBatis工厂-->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!--注入数据源-->
    <property name="dataSource" ref="dataSource"></property>
    <!--指定核心配置文件位置-->
    <property name="configLocation" value="MyBatisConfig.xml"></property>
</bean>

<!--配置MapperScannerConfigure-->
<!--MyBatis-Spring团队提供了一种自动扫描的形式来配置MyBatis中的映射器-->
<!--basePackage:指定映射接口文件所在的包路径,当需要扫描多个包时可以使用分号或逗号作为分隔符。
                    指定包路径后,会扫描该包及其子包中的所有文件

    annotationClass:指定要扫描的注解名为称,只有被注解标志的类才会被配置映射器

    sqlSessionFactoryBeanName:指定在Spring中定义的SqlSessionFactory的Bean名称

    sqlSessionTemplateBeanName:指定在Spring中定义的SqlSessionTemplate的Bean名称。
                                若定义此属性,则sqlSessionFactoryBeanName将不起作用。

    makerInterface:指定创建映射器的接口    -->

<bean id="mapperScannerConfigure" class="org.mybatis.spring.mapper.MapperScannerConfigurer">

    <property name="basePackage" value="com.itheima.Dao"></property>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"></property>
    <property name="annotationClass" value="org.springframework.stereotype.Repository"></property>
</bean>

2、 SSM框架整合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GkM3Q9ki-1579012800129)(01.png)]
配置的过程:

1、配置Maven

2、配置web.xml,加载Spring,SpringMVC

3、配置,数据源,配置事务,开启注解

4、部署tomcat

2.1、引入坐标**

详见配置文件

2.2配置web.xml

这一步注入前端控制器,过滤器,以及在其中指出spring配置文件的位置。

详见配置文件

2.3配置spring文件

在实际开发中,为了避免Spring配置文件中的信息过于臃肿,通常会将Spring配置文件中的信息按照不同的功能分散在多个配置文件中,例如可以将事务配置放在名为 spring-db.xml中,将数据源等信息防止在spring-db.xml配置文件中。在web.xml中配置加载Spring文件信息时,只需要通过spring-*.xml的方式即可自动加载全部配置文件。

2.4、配置MyBatis配置文件

可有在spring-db.xml配置文件中引入MyBatis配置文件的位置,如果在spring-db.xml的SqlSessionFactoryBean中引入的配置较为全面的话,也可以不配置MyBatis的配置文件。

发布了103 篇原创文章 · 获赞 17 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览