目录
第一步:创建Spring核心配置文件applicationContext.xml
第二步:在Spring核心配置文件中配置DataSource数据源
概述:
通过使用Spring的IoC容器,对MyBatis实例进行管理。
Spring能把MyBatis集成进来,像使用一个框架那样去使用,将MyBtatis框架中所有的对象注入Spring容器,交给Spring容器进行统一管理。直接从IoC容器中获取获取对象。
集成依赖:
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency>
整合Spring和MyBatis需要在Spring应用上下文中定义:
- SqlSessionFactory
- 数据映射器类
在MyBatis-Spring中,使用SqlSessionFactoryBean来创建SqlSessionFactory。配置这个工厂Bean到Spring的XML配置文件中:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> </bean>
注意:
SqlSessionFactory需要一个DataSource(数据源),数据源由SpringIoC容器进行统一管理。
在MyBatis单独的使用中,通过SqlSessionFactoryBuilder来创建SqlSessionFactory。在MyBatis-Spring中,使用SqlSessionBean来创建SqlSessionFactory。
MyBatis通过SqlSessionFactory来获取Session。获取Session实例之后,通过Session实例执行sql语句,提交事务,回滚连接等操作,当不在需要时,使用close方法结束Session。
SqlSessionFactory有唯一的必要属性:用于JDBC的DataSource,可以是任意的DataSource对象,这个DataSource对象是由Spring进行管理。
configLocation属性:用来指定MyBatis的XML配置文件路径,可以对基础配置进行修改<setting>或<typeAliases>等
SqlSessionTemplate是MyBatis-Spring的核心,作为SqlSession的一个实现可以代替SqlSession。模板可以参与到Spring的事务中,并且由于其是线程安全的,可以提供多个映射器类使用。
可以使用SqlSessionFactory做为构造方法参数来创建SqlSessionTemplate对象。
<!--配置sqlSession--> <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"> <!--只能通过构造器注入sqlSessionFactory,因为没有set方法--> <constructor-arg index="0" ref="sqlSessionFactory"/> </bean>
这个sqlSession直接注入到dao Bean容器中,只需要在dao接口实现类中添加SqlSession属性:
public class UserMapperImpl implements UserMapper{ private SqlSessionTemplate sqlSession; public void setSqlSession(SqlSessionTemplate sqlSession) { this.sqlSession = sqlSession; } public List<User> selectAll() { return sqlSession.getMapper(UserMapper.class).selectAll(); } }
注入SqlSessionTemplate:
<!-- 创建mapper对象--> <bean id="userMapperImpl" class="com.sunny.ssm.mapper.UserMapperImpl"> <property name="sqlSession" ref="sqlSession"/> </bean>
MyBatis使用步骤:
- 定义dao接口
- 配置dao接口对应的XML配置文件
- 定义MyBatis的主配置文件
- 通过SqlSession获取dao接口对应的XML配置文件,获取接口类的字节码文件,创建dao代理对象
如何使用dao对象,需要使用getMapper( )方法,怎么样能使用getMapper( )方法,需要哪些条件:
- 获取SqlSession对象,需要使用SqlSessionFactory的openSession( )方法。
- 创建SqlSessionFactory对象。通过读取MyBatis的主配置文件,创建SqlSessionFactory对象
需要SqlSessionFactory对象,使用Factory能获取SqlSession,有了SqlSession就能获取dao接口类,目的就是获取dao对象,通过接口的代理对象调用方法。
Factory创建需要读取主配置文件:
(我们会使用独立的连接池类替换MyBatis默认自带的,把连接池类也交给Spring创建)
<!--configuration核心配置文件--> <configuration> <environments default="development"> <environment id="development"> <!--事务管理--> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="131452"/> </dataSource> </environment> </environments> <mappers> <mapper resource="接口类对应得XML配置文件引用"/> </mappers> </configuration>
Druid数据库连接池:https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE
整合Spring-MyBatis步骤:
第一步:创建Spring核心配置文件applicationContext.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd "> <!-- Spring连接的JDBC数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8&useOldAliasMetadataBehavior=true" /> <property name="username" value="root" /> <property name="password" value="131452" /> </bean> <!-- 指出Mybatis的核心配置文件,关于数据库表和Java文件的映射写在里面 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="configuration.xml"></property> </bean> <!-- 指出数据库接口方法所在的包 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" autowire="byName"> <property name="basePackage" value="接口包路径" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> </bean> </beans>
第二步:在Spring核心配置文件中配置DataSource数据源
创建配置文件database.properties文件
#连接数据库的四个基本要素 jdbc.driverClassName=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/数据库名 jdbc.username=root jdbc.password=131452 #druid连接池其他配置,省略
<!--DataSource: 使用Spirng的数据源替换Mybatis的配置, 可以使用c3p0,dbcp,druid,或者spring提供的jdbc--> <!-- 加载数据库配置信息 --> <context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"/> <!-- 连接池对象 --> <bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="username" value="${jdbc.username}"/> <property name="url" value="${jdbc.url}"/> <property name="password" value="${jdbc.password}"/> </bean>
第三步:配置MyBatis核心配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--配置操作数据库的xml配置文件路径--> <mappers> <mapper resource="接口类映射的xml文件路径" /> </mappers> </configuration>
配置Druid数据库连接池:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="url" value="${jdbc.jdbcUrl}" /> <property name="username" value="${jdbc.user}" /> <property name="password" value="${jdbc.password}" /> <property name="driverClassName" value="${jdbc.driverClass}" /> <!-- 配置初始化大小、最小、最大 --> <property name="initialSize" value="1" /> <property name="minIdle" value="1" /> <property name="maxActive" value="20" /> <!-- 配置获取连接等待超时的时间 --> <property name="maxWait" value="60000" /> <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="validationQuery" value="SELECT 'x'" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="20" /> <!-- 配置监控统计拦截的filters --> <property name="filters" value="stat" /> </bean>