MyBatis 提供了 MyBatis-Spring 组件,能够将 MyBatis “无缝嵌入” 到 Spring 框架,例如:将 MyBatis 映射器 “注入” 到 Bean。
引入 MyBatis-Spring 而产生的变更,主要涉及:
- 数据源(数据库连接)配置
SqlSessionFactory
:基于 MyBatis-Spring 的org.mybatis.spring.SqlSessionFactoryBean
- 映射器
- 事务
MyBatis-Spring 提供了 org.mybatis.spring.SqlSessionTemplate
作为 SqlSession
实现。
关于映射器配置,Mybatis-Spring 支持 org.mybatis.spring.mapper.MapperScannerConfigurer
和 org.mybatis.spring.mapper.MapperFactoryBean
两种形式:
MapperFactoryBean
,即手工配置映射器:类型为org.mybatis.spring.mapper.MapperFactoryBean
的 bean 作为映射器- 通过 mapperInterface 属性,配置映射器的 Java 接口类型
- 通过 sqlSessionFactory 属性,注入
SqlSessionFactory
MapperScannerConfigurer
,表示由 Spring 自动扫描,获取映射器- 通过 basePackage 属性,配置 “扫描路径”
- 通过 annotationClass 属性,配置:仅扫描 “路径” 中,被特定注解标记的 Java 接口
- 通过 markerInterface 属性,配置:仅扫描 “路径” 中,继承特定接口的 Java 接口
- 通过 sqlSessionFactoryBeanName 属性,关联
SqlSessionFactory
,以注入到映射器中
mybatis-config.xml
<?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> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> </configuration>
spring-dao.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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 导入jdbc文件 --> <context:property-placeholder location="classpath:config/jdbc/jdbc.properties"/> <!-- dataSource --> <!-- dataSource 配置 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="name" value="${jdbc.dataSourceName}"/> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> <property name="initialSize" value="5"/> <property name="minIdle" value="3"/> <property name="maxActive" value="30"/> <property name="maxWait" value="60000"/> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <property name="minEvictableIdleTimeMillis" value="300000"/> <property name="validationQuery" value="SELECT 1"/> <property name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> <property name="removeAbandoned" value="true"/> <property name="removeAbandonedTimeout" value="1800"/> <property name="logAbandoned" value="true"/> <property name="poolPreparedStatements" value="false"/> <property name="maxPoolPreparedStatementPerConnectionSize" value="20"/> <property name="filters" value="stat"/> </bean> <!-- sqlSessionFactoryBean --> <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:mybatis-config.xml" /> <property name="mapperLocations" value="classpath:mapper/*/*Mapper.xml"/> </bean> <!-- MapperScannerConfigurer --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 自动扫描 --> <property name="basePackage" value="love.ning.yang.mapper"/> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"/> </bean> </beans>
spring-transaction.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" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 启用事务注解的支持 @Transaction --> <tx:annotation-driven transaction-manager="transactionManager"/> </beans>
- 构建 org.springframework.jdbc.datasource.DriverManagerDataSource 类型的 bean,作为数据库连接配置
- 构建 org.mybatis.spring.SqlSessionFactoryBean 类型的 bean,其中:
通过 dataSource 属性注入数据库连接信息 - 通过 configLocation 属性设置 MyBatis 配置文件路径(SqlSessionFactoryBean 支持直接注入 MyBatis 配置项)
- 构建 org.springframework.jdbc.datasource.DataSourceTransactionManager 类型的 bean,并启用 “声明式事务”
MyBatis Generator
generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <!-- 数据库驱动包位置 --> <classPathEntry location="C:Userswade.m2 epositorymysqlmysql-connector-java5.1.6mysql-connector-java-5.1.6.jar"/> <context id="myBatisGeneratorContext" targetRuntime="MyBatis3"> <commentGenerator> <property name="suppressAllComments" value="true"/> <property name="suppressDate" value="true"/> </commentGenerator> <!-- 数据库链接URL、用户名、密码 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/yang?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&zeroDateTimeBehavior=convertToNull&useInformationSchema=true&useSSL=false" userId="root" password=""/> <javaTypeResolver> <property name="forceBigDecimals" value="false"/> </javaTypeResolver> <!-- 生成模型的包名和位置 --> <javaModelGenerator targetPackage="sun.flower.demo.mybatis.domain" targetProject="src/main/java"> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 生成的映射文件xml包名和位置 --> <sqlMapGenerator targetPackage="sun.flower.demo.mybatis.xml" targetProject="src/main/java"/> <!-- 生成dao的包名和位置 --> <javaClientGenerator targetPackage="sun.flower.demo.mybatis.dao" targetProject="src/main/java" type="XMLMAPPER"/> <!-- 要生成哪些表(更改tableName和domainObjectName就可以) --> <table tableName="yang_user" domainObjectName="User" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/> </context> </generatorConfiguration>
pom.xml
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <executions> <execution> <id>Generate MyBatis Files</id> <goals> <goal>generate</goal> </goals> <phase>generate</phase> <configuration> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> </execution> </executions> </plugin> </plugins> </build>