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
下图为SqlSessionFactoryBean的源码,从下图可以看出,内置了许多MyBatis配置的标签,在Spring框架中将其转换为属性,也就是SqlSessionFactoryBean会将SqlSessionFactory转换为对象。
配置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&characterEncoding=UTF-8&userSSL=false&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唯一且不互相冲突。其次,它提供了一系列的功能,比如增删改查等常用功能,不过在此之前需要先配置它,而配置也是比较简单的。
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&characterEncoding=UTF-8&userSSL=false&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框架整合
配置的过程:
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的配置文件。