上一篇文章中已经介绍,MapperScannerConfigurer可以通过扫描的方式获取我们需要的mapper,而不需要我们自己去配置,它的基本配置如下:
1 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 2 <!-- 配置要扫描的包路径,这样就会扫描该包及其子包 --> 3 <property name="basePackage" value="com.hyc.dao" /> 4 <!-- 指定SqlSessionFactory的bean名称 --> 5 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> 6 <!-- 指定SqlSessionTemplate的bean名称,优先级高于SqlSessionFactory --> 7 <property name="sqlSessionTemplateBeanName" value="com.hyc.mapper" /> 8 <!-- 当包下的类被这个注解@Repository标示的时候才会被扫描 --> 9 <property name="annotationClass" value="org.springframework.stereotype.Repository" /> 10 </bean>
配置属性的意义已在注释中说明,需要注意的是如果要使用SqlSessionFactory,就要注释掉属性sqlSessionTemplateBean,否则sqlSessionFactory的配置将不会生效。注意⚠️:上面的配置中,basePackage的值必须是接口所在的包,而不是mapper文件所在的包
下面将测试这种配置的实现方式,我将不再一步一步进行配置,而是直接贴出最终的配置文件。
一、Spring-mybatis配置文件spring-mybatis.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:context="http://www.springframework.org/schema/context" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/context 8 http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 9 10 <!-- 第一种:简单数据库--使用数据库连接池 --> 11 <!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> 12 <property name="driverClassName" value="org.postgresql.Driver" /> <property 13 name="url" value="jdbc:postgresql://localhost:5433/postgres" /> <property 14 name="username" value="postgres" /> <property name="password" value="hyc123" 15 /> </bean> --> 16 <!--第二种:通过jndi方式配置 --> 17 <!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 18 <property name="jndiName" value="jdbc/pg"></property> </bean> --> 19 20 <!-- 第一步:配置数据源--使用数据库连接池 --> 21 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 22 <property name="driverClassName" value="org.postgresql.Driver" /> 23 <property name="url" value="jdbc:postgresql://localhost:5433/postgres" /> 24 <property name="username" value="postgres" /> 25 <property name="password" value="hyc123" /> 26 <!-- 最大数据库连接数 --> 27 <property name="maxActive" value="100" /> 28 <!-- 最大空闲数,即等待连接数 --> 29 <property name="maxIdle" value="5" /> 30 <!-- 最大等待连接时间 --> 31 <property name="maxWait" value="10000" /> 32 </bean> 33 34 <!--第二步:配置SqlSessionFactory --> 35 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 36 <!-- 配置数据源 --> 37 <property name="dataSource" ref="dataSource" /> 38 <!-- 配置mybatis --> 39 <property name="configLocation" value="classpath:mybatis-config2.xml" /> 40 </bean> 41 42 <!--第三步:配置sqlSessionTemplate:通过带参数的构造方法创建对象 --> 43 <!-- <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> 44 以sqlSessionFactory为参数传入构造函数中 45 <constructor-arg ref="sqlSessionFactory" /> 46 mybatis执行器,取值范围是SIMPLE/REUSE/BATCH三种类型 47 <constructor-arg value="SIMPLE" /> 48 </bean> --> 49 50 <!--第三步:通过MapperFactoryBean配置SqlSessionFactory --> 51 <!-- <bean id="productMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> 52 配置mapper接口 53 <property name="mapperInterface" value="com.hyc.dao.ProductMapper" /> 54 配置SqlSessionFactory 55 <property name="sqlSessionFactory" ref="sqlSessionFactory" /> 56 如果同时配置sqlSessionTemplate和SqlSessionFactory,将优先使用sqlSessionTemplate 57 <property name="sqlSessionTemplate" ref="sqlSessionTemplate" /> 58 </bean> --> 59 60 61 <!--第三步:通过MapperScannerConfigurer的配置方式 --> 62 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 63 <!-- 配置要扫描的包路径,这样就会扫描该包及其子包 --> 64 <property name="basePackage" value="com.hyc.dao" /> 65 <!-- 指定SqlSessionFactory的bean名称 --> 66 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /> 67 <!-- 指定SqlSessionTemplate的bean名称,优先级高于SqlSessionFactory --> 68 <!-- <property name="sqlSessionTemplateBeanName" value="com.hyc.mapper" 69 /> --> 70 <!-- 当包下的类被这个注解@Repository标示的时候才会被扫描 --> 71 <property name="annotationClass" value="org.springframework.stereotype.Repository" /> 72 </bean> 73 74 <bean id="product" class="com.hyc.pojo.Product"> 75 <property name="id" value="28"></property> 76 <property name="productName" value="皮鞋1"></property> 77 <property name="productPrice" value="208"></property> 78 <property name="productType" value="男鞋"></property> 79 </bean> 80 81 </beans>
上述配置种包括数据源、sqlSessionFactory、MapperScannerConfigurer的配置,还有注释部分的另外两种数据源配置方式和另外两种MyBatis-Spring的配置方式。
二、mybatis配置文件
数据源配置种的mybatis-config2.xml文件配置如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <!-- mybatis的基本配置文件:主要配置基本的上下文参数和运行环境 --> 6 <configuration> 7 <!--设置 --> 8 <settings> 9 <!--缓存配置的全局开关:如果这里设置成false,那么即便在映射器中配置开启也无济于事 --> 10 <setting name="cacheEnabled" value="true" /> 11 <!--延时加载的全局开关 --> 12 <setting name="lazyLoadingEnabled" value="false" /> 13 <!-- 是否允许单一语句返回多结果集 --> 14 <setting name="multipleResultSetsEnabled" value="false" /> 15 <!-- 使用列标签代替列名,需要兼容驱动 --> 16 <setting name="useColumnLabel" value="true" /> 17 <!-- 允许JDBC自动生成主键,需要驱动兼容。如果设置为true,则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍能正常工作 --> 18 <setting name="useGeneratedKeys" value="false" /> 19 <!-- 指定MyBatis该如何自动映射列到字段或属性:NONE表示取消自动映射;PARTIAL表示只会自动映射,没有定义嵌套结果集和映射结果集;FULL会自动映射任意复杂的结果集,无论是否嵌套 --> 20 <setting name="autoMappingBehavior" value="PARTIAL" /> 21 <!-- 配置默认的执行器:SIMPLE是普通的执行器;REUSE会重用预处理语句;BATCH会重用语句并执行批量更新 --> 22 <setting name="defaultExecutorType" value="SIMPLE" /> 23 <!--设置超时时间:它决定驱动等待数据库响应的秒数,任何正整数 --> 24 <!-- <setting name="defaultStatementTimeout" value="25"/> --> 25 <!--设置数据库驱动程序默认返回的条数限制,此参数可以重新设置,任何正整数 --> 26 <!-- <setting name="defaultFetchSize" value="100" /> --> 27 <!-- 允许在嵌套语句中使用分页(RowBounds) --> 28 <setting name="safeRowBoundsEnabled" value="false" /> 29 <!-- 是否开启自动驼峰命名规则,即从a_example到aExample的映射 --> 30 <setting name="mapUnderscoreToCamelCase" value="true" /> 31 <!-- 本地缓存机制,防止循环引用和加速重复嵌套循环 --> 32 <setting name="localCacheScope" value="SESSION" /> 33 <!-- 当没有为参数提供特定JDBC类型时,为空值指定JDBC类型。某些驱动需要指定列的JDBC类型,多数情况直接用一般类型即可,如NULL/VARCHAR/OTHER --> 34 <setting name="jdbcTypeForNull" value="OTHER" /> 35 <!-- 指定触发延迟加载的方法,如equals/clone/hashCode/toString --> 36 <setting name="lazyLoadTriggerMethods" value="equals" /> 37 </settings> 38 <!--类型命名 --> 39 <!--别名:pojo对象的别名 --> 40 <typeAliases> 41 <!-- 对包进行扫描,可以批量进行别名设置,设置规则是:获取类名称,将其第一个字母变为小写 --> 42 <package name="com.hyc.pojo" /> 43 <package name="com.hyc.objectfactory" /> 44 <package name="com.hyc.bean" /> 45 <package name="com.hyc.dao" /> 46 </typeAliases> 47 <!--插件 --> 48 <!-- <plugins /> --> 49 <!-- 映射器 --> 50 <mappers> 51 <mapper resource="com/hyc/mapper/ProductMapper.xml" /> 52 </mappers> 53 54 </configuration>
三、创建映射器
1⃣️创建接口,增加@Repository注解标示
1 @Repository 2 public interface ProductMapper { 3 4 int insertProduct(Product product); 5 6 int deleteByPrimaryKey(String id); 7 8 int updateByPrimaryKey(Product product); 9 10 List<Product> selectProducts(String name); 11 12 }
注意使用注解,否则将不会被扫描到,在spring种往往使用注解@Repository表示数据访问层(DAO)
2⃣️创建对应的mapper文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 3 <mapper namespace="com.hyc.dao.ProductMapper"> 4 <resultMap id="BaseResultMap" type="com.hyc.pojo.Product"> 5 <id column="id" jdbcType="VARCHAR" property="id" /> 6 <result column="product_name" jdbcType="VARCHAR" property="productName" /> 7 <result column="product_price" jdbcType="VARCHAR" property="productPrice" /> 8 <result column="product_type" jdbcType="VARCHAR" property="productType" /> 9 </resultMap> 10 <sql id="Base_Column_List"> 11 id, product_name, product_price, product_type 12 </sql> 13 14 <!-- 查询所有产品 --> 15 <select id="selectProducts" resultMap="BaseResultMap" parameterType="String"> 16 select * from product where product_name like concat('%',#{name},'%') 17 </select> 18 19 <!-- 插入产品 --> 20 <insert id="insertProduct" parameterType="com.hyc.pojo.Product"> 21 insert into product 22 (id, 23 product_name, product_price, 24 product_type) 25 values 26 (#{id,jdbcType=VARCHAR}, #{productName,jdbcType=VARCHAR}, 27 #{productPrice,jdbcType=VARCHAR}, 28 #{productType,jdbcType=VARCHAR}) 29 </insert> 30 31 <!-- 根据ID删除产品 --> 32 <delete id="deleteByPrimaryKey" parameterType="java.lang.String"> 33 delete from 34 product 35 where id = #{id,jdbcType=VARCHAR} 36 </delete> 37 38 <!--修改产品 --> 39 <update id="updateByPrimaryKey" parameterType="com.hyc.pojo.Product"> 40 update product 41 set 42 product_name = #{productName,jdbcType=VARCHAR}, 43 product_price = 44 #{productPrice,jdbcType=VARCHAR}, 45 product_type = 46 #{productType,jdbcType=VARCHAR} 47 where id = #{id,jdbcType=VARCHAR} 48 </update> 49 </mapper>
四、单元测试
1⃣️基本类
用来初始化ClassPathXmlAppicationContext,从而获取bean、mapper等
1 public class BaseTest { 2 3 public SqlSessionTemplate template = null; 4 ClassPathXmlApplicationContext context = null; 5 6 @Before 7 public void before() { 8 context = new ClassPathXmlApplicationContext("classpath:spring-mybatis.xml"); 9 template = context.getBean(SqlSessionTemplate.class); 10 } 11 }
通过传入spring-mybatis的配置文件初始化ClassPathXmlApplicationContext
2⃣️测试类
1 public class TestMapperFactoryBean extends BaseTest { 2 3 @Test 4 public void testInsert() { 5 ProductMapper pm = super.context.getBean(ProductMapper.class); 6 Product product = super.context.getBean(Product.class); 7 int add = pm.insertProduct(product); 8 System.out.println(add > 0 ? "插入成功" : "插入失败"); 9 } 10 11 @Test 12 public void testDelete() { 13 ProductMapper pm = super.context.getBean(ProductMapper.class); 14 int del = pm.deleteByPrimaryKey("8cb4fc3a-dd71-46e9-a0de-0e8b967a127c"); 15 System.out.println(del > 0 ? "删除成功" : "删除失败"); 16 } 17 18 @Test 19 public void testUpdate() { 20 ProductMapper pm = super.context.getBean(ProductMapper.class); 21 Product product = super.context.getBean(Product.class); 22 product.setProductName("测试修改"); 23 product.setProductPrice("修改后价格"); 24 product.setProductType("修改后分类"); 25 int update = pm.updateByPrimaryKey(product); 26 System.out.println(update > 0 ? "修改成功" : "修改失败"); 27 } 28 29 @Test 30 public void testSelect() { 31 ProductMapper pm = super.context.getBean(ProductMapper.class); 32 List<Product> pl = pm.selectProducts("T"); 33 System.out.println(pl.size()); 34 } 35 }
测试结果都是成功,将不再贴出。
至此,MyBatis-Spring项目的搭建过程总结完毕。