Spring整合Mybatis
- 一、引入依赖
- 二、思路
- 三、配置spring的配置文件
- 四、优化spring配置文件
- 五、spring整合业务层
- **使用spring提供的事物控制**
一、引入依赖
- spring-context 上下文
- spring-aspects 切面编程
- spring-jdbc spring对jdbc的支持
- mysql
- mybatis
- mybatis-spring mybatis对spring的支持,mybatis写的,spring默认不支持mybatis
- druid 阿里的连接池
二、思路
将mybatis核心对象(SqlSessionFactory)交给spring管理
三、配置spring的配置文件
<!-- 管理SqlSessionFactory 复杂对象命名以FactoryBean结尾的-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sessionFactory"> <!--id:SqlSessionFactory在spring容器中的唯一标识-->
<!--数据源-->
<property name="dataSource" ref="dataSource"></property>
<!--映射文件-->
<property name="mapperLocations">
<array>
<value>classpath:mapper/UserMapper.xml</value>
<value>classpath:mapper/CommentMapper.xml </value>
</array>
</property>
<!--实体类别名-->
<property name="typeAliases">
<array>
<value>entity.User</value>
<value>entity.Comment</value>
</array>
</property>
</bean>
<!--创建数据源-->
<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
<!--管理dao(复杂对象)-->
<bean class="org.mybatis.spring.mapper.MapperFactoryBean" id="userDao">
<!--SqlSessionFactory(因为需要根据SqlSession获取dao)-->
<property name="sqlSessionFactory" ref="sessionFactory"></property>
<!--指定dao-->
<property name="mapperInterface" value="dao.UserDao"></property>
</bean>
<!--管理dao-->
<bean class="org.mybatis.spring.mapper.MapperFactoryBean" id="commentDao">
<!--SqlSessionFactory(因为需要根据SqlSessio获取dao)-->
<property name="sqlSessionFactory" ref="sessionFactory"></property>
<!--指定dao-->
<property name="mapperInterface" value="dao.CommentDao"></property>
</bean>
四、优化spring配置文件
<!-- 管理SqlSessionFactory 复杂对象命名以FactoryBean结尾的 -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sessionFactory">
<!--数据源-->
<property name="dataSource" ref="dataSource"></property>
<!--
映射文件
利用通配符:映射mapper包下的以mapper.xml结尾的文件 或者包下的(*)所有文件
注意: 映射文件必须有包结构才支持通配
-->
<property name="mapperLocations" value="classpath:mapper/*Mapper.xml"></property>
<!--实体类定义别名 typeAliasesPackage 包级别:包中的所有类 -->
<property name="typeAliasesPackage" value="entity"></property>
</bean>
<!--
创建数据源
引入小配文件 location="配置文件路径"
注意:spring默认会优先加载使用系统环境变量,此时,username实际上指的是当前计算机的用户名。
而不是取值配置文件中定义的username,将${username}换成了${name}
-->
<context:property-placeholder location="mysql.properties"/>
<bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${name}"/>
<property name="password" value="${password}"/>
</bean>
<!--
管理dao
MapperScannerConfigurer:映射文件扫描配置
容器中创建dao对象的名字为: (名字首字母小写) UserDao ===> userDao
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--SqlSessionFactory(因为需要根据SqlSession获取dao)-->
<property name="sqlSessionFactoryBeanName" value="sessionFactory"></property>
<!--指明dao的位置(包级别的,包中所有dao都会被创建 首字母小写)-->
<property name="basePackage" value="dao"></property>
</bean>
引入的小配置文件mysql.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
name=root
password=root
五、spring整合业务层
使用spring提供的事物控制
1、引入依赖
- spring-tx 进行事务控制,spring提供的transaction
2、配置文件
<!--
创建DataSourceTransactionManager(数据源事务管理器)
把数据源交给数据源事务管理器, 返回的就是线程安全的事务管理对象
-->
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager id="transactionManager" ">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--
tx:advice: 在spring程序运行时, 生成环绕通知, 唯一标识为id
transaction-manager: 将线程安全的事务管理对象生成环绕通知
-->
<tx:advice id="tx" transaction-manager="transactionManager">
<!-- //细粒度控制事务
tx:method: 为哪些方法开启事务 name: 方法名(支持 *通配符)
-->
<tx:attributes>
<tx:method name="add*"/>
</tx:attributes>
</tx:advice>
<!--组装切面-->
<aop:config>
<aop:pointcut id="pt" expression="within(service.*ServiceImpl)"/>
<aop:advisor advice-ref="tx" pointcut-ref="pt"/>
</aop:config>
为什么使用spring提供的事物控制?
- 1.spring整合mybatis 默认的事务是 自动自交, 出现异常无法回滚
- 2.手动使用aop完成事物, 存在连接线程安全的问题(无法确保service与dao使用同一连接)
要引入的依赖如下:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.26.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.26.RELEASE</version>
</dependency>
<!-- mybatis相关配置 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.26.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.0</version>
</dependency>
<!-- spring提供的transaction -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.26.RELEASE</version>
</dependency>