• MyBatis-Spring(五)--MapperScannerConfigurer实现增删改查


    上一篇文章中已经介绍,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项目的搭建过程总结完毕。

  • 相关阅读:
    《数据结构》2.2顺序表(sequence list)
    《算法竞赛入门经典》6.3.1二叉树-小球下落
    java_时间戳与Date_相互转化
    java事物
    Mysql如何向存在外键的数据表中插入数据
    git基本配置
    mysql时间属性之时间戳和datetime之间的转换
    【转】变量命名(简短且无歧义)
    【转】mybatis实战教程(mybatis in action),mybatis入门到精通
    [转]DAO层,Service层,Controller层、View层
  • 原文地址:https://www.cnblogs.com/hellowhy/p/9729184.html
Copyright © 2020-2023  润新知