Spring整合MyBatis
1.引入数据库jar和C3P0连接池jar包
<!-- mysql依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!-- c3p0依赖 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.5</version>
</dependency>
2.引入Spring的jar包以及配置文件
Spring 选择的版本是5.2.1的版本,因为使用的是release版本会自动下载关联依赖包。我们在配置数据库事务的时侯需要使用AOP,所以还需要引入aspectj包,用于切面编程,如下所示:
<!-- spring依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
<!-- spring-orm依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.2.1.RELEASE</version>
</dependency>
<!-- aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.2</version>
<scope>runtime</scope>
</dependency>
配置文件我们需要引入的是 spring.xml文件,放到resources包下,为了区分Spring和SpringMVC的功能,把配置文件的名称修改为spring-application.xml。
在web.xml文件中添加上字符集过滤器,避免字符乱码的出现,如下所示:
<!--解决中文乱码的过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<!-- 要使用的字符集,一般使用UTF-8 -->
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!-- 这里不能留空或者直接写 / ,否则不起作用 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
3.引入MyBatis的jar包以及配置文件
除了MyBatis的核心包之外,好要把Spring整合MyBatis需要的mybatis-spring包引过来。如下所示:
<!-- mybatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
把MyBatis的配置文件mybatis-config.xml文件引入过来,如下图所示:
4.修改config配置文件实现数据库管理和事务管理
现在我们项目中包含了Spring和 MyBatis 的相关配置,接下来就是需要修改我们的配置文件,实现Spring的管理机制,把 MyBatis交给Spring来管理,统一调配。
在学 MyBatis 的时候,是把数据库环境书写在mybatis-config.xml文件中的,现在需要把它们全部从mybatis-config.xml文件中去除。
然后在spring-application.xml文件中增加上对数据库环境的配置,我们现在不单单使用了MyBatis,为了进一步的增加数据库的效率,采用c3po连接池来做一下数据库连接的管理。这里分成几个步骤来进行:
配置具有C3PO 连接池的数据源。这里要特别的说明一点,mysql 数据库我们选择的是8.0的版本,所以我们必须在连接数据库的url上设置上数据库时区,我们当前的时区是北京时区,但是在选择的时候,使用的是 Asia/Shanghai。不设置的话,数据库连接会失败。
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
<property name="maxPoolSize" value="20"/>
<property name="minPoolSize" value="5"/>
</bean>
- 读取mybatis-config.xml配置文件,datasource所指的是数据源,configLocation就是MyBatis的核心配置文件。
<bean name="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
- 扫描Mapper的代理对象,这一步是为了完成对mybatis中映射文件的加载,basePackage是映射文件所在的包。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
- 配置sqlSessionTemplate对象,就是sqlSession的模板对象。
<bean name="template" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
- 配置事务管理,使用声明式事务,并且开启动态代理的功能。在配置中tx:method是各种通知配置。
<!-- spring整合mybatis步骤5:配置DataSourceTransactionMananger对象 需要指定属性:dataSource -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- spring整合mybatis步骤5:使用xml完成事务的配置 -->
<aop:config>
<aop:pointcut id="trPointcut" expression="execution(public * com.gxy.service.impl.*.*(..))"/>
<aop:advisor advice-ref="myTx" pointcut-ref="trPointcut"/>
</aop:config>
<tx:advice id="myTx" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="delete*" read-only="false" isolation="SERIALIZABLE" propagation="REQUIRED"/>
<tx:method name="update*" read-only="false" isolation="SERIALIZABLE" propagation="REQUIRED"/>
<tx:method name="insert*" read-only="false" isolation="SERIALIZABLE" propagation="REQUIRED"/>
<tx:method name="select*" read-only="true" isolation="DEFAULT" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 注解aop的配置,必须开启代理,默认是false -->
<aop:aspectj-autoproxy expose-proxy="true"/>