spring整合通用mapper

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: spring整合通用mapper

由于spring4+支持泛型,这个特性对通用Mapper来说,非常的有用,可以说有了这个特性我们就可以继承通用的Mapper<T>实现crud的操作,节省了我们开发的时间。


    以往我们使用mapper文件都是自己写sql语句,针对的是单个实体,也就是每个实体都有其对应的mapper文件。使用通用mapper给我们带来了极大的方便,通用mapper里面有许多我们常用的接口,平时开发90%的crud操作都在里面,只需我们调用相应的接口,引入jar包再进行简单的配置就好了。


这是一位大佬的开源项目,想学习的可以去他的github点击打开链接


这里我整合了一个springmvc的通用mapper例子


首先在pom.xml中添加对通用mapper的支持,其他的和springmvc一致

        <!--通用Mapper-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>${mapper.version}</version>
        </dependency>

插件配置

            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.6</version>
                <configuration>
                    <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
                    <overwrite>true</overwrite>
                    <verbose>true</verbose>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>${mysql.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>tk.mybatis</groupId>
                        <artifactId>mapper</artifactId>
                        <version>${mapper.version}</version>
                    </dependency>
                </dependencies>
            </plugin>

通用 Mapper 支持 MyBatis 3.2.4+,我这里用的mybatis版本是3.4.6,spring的版本是4.1.2,mybatis.spring的版本是1.3.1,mapper的版本是4.0.0


如果版本不匹配的话会出现错误如下




错误org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer;



解决方法:更换Spring_Mybatis整合包版本,具体版本对照如下

MyBatis-Spring MyBatis Spring
1.0.0 and 1.0.1 3.0.1 to 3.0.5 3.0.0 or higher
1.0.2 3.0.6 3.0.0 or higher
1.1.0 or higher 3.1.0 or higher 3.0.0 or higher
1.3.0 or higher 3.4.0 or higher 3.0.0 or higher

项目结构图

2018042018500489.png

1.web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  id="WebApp_ID1" version="3.0">
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-mybatis.xml</param-value>
  </context-param>
  <filter> 
    <description>字符集过滤器</description>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <description>字符集编码</description>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <listener>
    <description>spring监听器</description>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <listener>
    <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
  </listener>
  <servlet>
    <description>spring mvc servlet</description>
    <servlet-name>springMvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <description>spring mvc 配置文件</description>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>springMvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
    <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
  </servlet-mapping>
  <servlet-mapping> 
    <servlet-name>default</servlet-name>
    <url-pattern>*.gif</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.html</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>/index.jsp</welcome-file>
  </welcome-file-list>
  <session-config>
    <session-timeout>60</session-timeout>
  </session-config>
</web-app>

2.spring-mybatis.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"
  xmlns:aop="http://www.springframework.org/schema/aop" 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/tx 
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
  <!-- Spring:配置扫描容器,不扫描Controller和ControllerAdvice注解 -->
  <context:component-scan base-package="com.smxy.lq">
    <context:exclude-filter type="annotation"
      expression="org.springframework.stereotype.Controller" />
    <context:exclude-filter type="annotation"
      expression="org.springframework.web.bind.annotation.ControllerAdvice" />
  </context:component-scan>
  <!-- 引入属性文件 -->
  <context:property-placeholder location="classpath:config.properties" />
  <!-- 配置数据源 -->
  <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
    init-method="init" destroy-method="close">
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <!-- 初始化连接大小 -->
    <property name="initialSize" value="0" />
    <!-- 连接池最大使用连接数量 -->
    <property name="maxActive" value="20" />
    <!-- 连接池最大空闲 -->
    <property name="maxIdle" value="20" />
    <!-- 连接池最小空闲 -->
    <property name="minIdle" value="0" />
    <!-- 获取连接最大等待时间 -->
    <property name="maxWait" value="60000" />
    <property name="validationQuery" value="${validationQuery}" />
    <property name="testOnBorrow" value="false" />
    <property name="testOnReturn" value="false" />
    <property name="testWhileIdle" value="true" />
    <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
    <property name="timeBetweenEvictionRunsMillis" value="60000" />
    <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
    <property name="minEvictableIdleTimeMillis" value="25200000" />
    <!-- 打开removeAbandoned功能 -->
    <property name="removeAbandoned" value="true" />
    <!-- 1800秒,也就是30分钟 -->
    <property name="removeAbandonedTimeout" value="1800" />
    <!-- 关闭abanded连接时输出错误日志 -->
    <property name="logAbandoned" value="true" />
    <!-- 监控数据库 -->
    <!-- <property name="filters" value="stat" /> -->
    <property name="filters" value="mergeStat" />
  </bean>
  <!-- MyBatis配置 这个就是spring和mybatis的整合 也就是spring-mybatis jar -->
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <!--数据库的数据源配置 -->
    <property name="dataSource" ref="dataSource" />
    <!-- mysqlSqlSessionFactory会自动扫描该路径下的所有文件并解析。 -->
    <property name="mapperLocations" value="classpath:mapper/*.xml" />
    <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 ,该属性可以给包中的类注册别名,注册后可以直接使用类名,而不用使用全限定的类名 -->
    <property name="typeAliasesPackage" value="com.smxy.lq.pojo" />
  </bean>
  <!--在Spring中配置Mapper接口 -->
  <bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
    <!-- 为映射器接口文件设置基本的包路径 -->
    <property name="basePackage" value="com.smxy.lq.mapper" />
  </bean>
  <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"
    scope="prototype">
    <constructor-arg index="0" ref="sqlSessionFactory" />
  </bean>
  <!-- 配置事务管理器 -->
  <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
  </bean>
  <!-- 注解方式配置事物 -->
  <!-- <tx:annotation-driven transaction-manager="transactionManager" /> -->
  <!-- 拦截器方式配置事物 -->
  <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    <tx:attributes>
      <tx:method name="add*" propagation="REQUIRED" />
      <tx:method name="append*" propagation="REQUIRED" />
      <tx:method name="insert*" propagation="REQUIRED" />
      <tx:method name="save*" propagation="REQUIRED" />
      <tx:method name="update*" propagation="REQUIRED" />
      <tx:method name="modify*" propagation="REQUIRED" />
      <tx:method name="edit*" propagation="REQUIRED" />
      <tx:method name="delete*" propagation="REQUIRED" />
      <tx:method name="remove*" propagation="REQUIRED" />
      <tx:method name="repair" propagation="REQUIRED" />
      <tx:method name="delAndRepair" propagation="REQUIRED" />
      <tx:method name="get*" propagation="SUPPORTS" />
      <tx:method name="find*" propagation="SUPPORTS" />
      <tx:method name="load*" propagation="SUPPORTS" />
      <tx:method name="search*" propagation="SUPPORTS" />
      <tx:method name="datagrid*" propagation="SUPPORTS" />
      <tx:method name="*" propagation="SUPPORTS" />
    </tx:attributes>
  </tx:advice>
  <aop:config>
    <aop:pointcut id="transactionPointcut"
      expression="execution(* com.smxy.lq.service..*Impl.*(..))" />
    <aop:advisor pointcut-ref="transactionPointcut"
      advice-ref="transactionAdvice" />
  </aop:config>
  <!-- 配置druid监控spring jdbc -->
  <bean id="druid-stat-interceptor"
    class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
  </bean>
  <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
    scope="prototype">
    <property name="patterns">
      <list>
        <value>com.smxy.lq.service.*</value>
        <value>com.smxy.lq.serviceimpl.*</value>
      </list>
    </property>
  </bean>
  <aop:config>
    <aop:advisor advice-ref="druid-stat-interceptor"
      pointcut-ref="druid-stat-pointcut" />
  </aop:config>
</beans>

3.spring-mvc配置

<?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"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  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
  http://www.springframework.org/schema/mvc 
  http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  <!-- 1.SpringMvc:配置容器扫描只扫描Controller注解和ControllerAdvice注解 -->
  <context:component-scan base-package="com.smxy.lq"
    use-default-filters="false">
    <context:include-filter type="annotation"
      expression="org.springframework.stereotype.Controller" />
    <context:include-filter type="annotation"
      expression="org.springframework.web.bind.annotation.ControllerAdvice" />
  </context:component-scan>
  <!-- 2.配置视图解析器 -->
  <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/"></property>
    <property name="suffix" value=".jsp"></property>
  </bean>
  <!-- 3.处理静态资源 -->
  <mvc:default-servlet-handler />
  <mvc:annotation-driven></mvc:annotation-driven>
  <!-- 4.文件上传,配置MultipartResolver 使用spring的CommosMultipartResolver -->
  <bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 设置上传文件的最大尺寸为5MB -->
    <property name="maxUploadSize">
      <value>5242880</value>
    </property>
  </bean>
  <!-- 5.全局异常处理器 只要实现HandlerExceptionResolver接口就是全局异常处理器 -->
  <!-- <bean class="com.smxy.study.exception.ErrorExceptionResolver"></bean> -->
</beans>

4.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>
    <properties resource="config.properties"/>
    <context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>
        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
            <property name="caseSensitive" value="true"/>
        </plugin>
        <jdbcConnection driverClass="${jdbc.driverClass}"
                        connectionURL="${jdbc.url}"
                        userId="${jdbc.user}"
                        password="${jdbc.password}">
        </jdbcConnection>
        <javaModelGenerator targetPackage="com.smxy.lq.pojo" targetProject="src/main/java"/>
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/>
        <javaClientGenerator targetPackage="com.smxy.lq.mapper" targetProject="src/main/java"
                             type="XMLMAPPER"/>
        <table tableName="country">
            <generatedKey column="id" sqlStatement="JDBC"/>
        </table>
    </context>
</generatorConfiguration>

产生完的mapper都会继承Mapper这个接口,这个Mapper接口里面有需要我们常用的crud方法,这里面可以什么都不要写,只要在Service里面写上方法就行了。

20180420185732540.png

5.Service里面写上自定义方法

package com.smxy.lq.service;
import com.smxy.lq.pojo.Country;
public interface CountryService {
  // 查找
  public Country findCountryById(Integer id) throws Exception;
  // 删除
  public void delectCountryById(Integer id) throws Exception;
  // 插入
  public void insertCountry(Country country) throws Exception;
  // 修改
  public void updateCountry(Country country) throws Exception;
}

6.实现类重写该方法,并注入mapper,使用通用mapper方法实现crud操作,通用方法有很多,可自行尝试,我这里只有简单的增删改查四个

20180420190404231.png

7.在controller层使用

package com.smxy.lq.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.smxy.lq.pojo.Country;
import com.smxy.lq.service.CountryService;
@Controller
public class CountryController {
  @Autowired
  CountryService countryService;
  @RequestMapping("/findcountry")
  public @ResponseBody Country findcountry() throws Exception{
    return countryService.findCountryById(1);
  }
  @RequestMapping("/delectCountryById")
  public  void delectCountryById() throws Exception{
    countryService.delectCountryById(1);
  }
  @RequestMapping("/insertCountry")
  public  void insertCountry() throws Exception{
    Country country=new Country();
    country.setCountryname("asdfasdf");
    country.setCountrycode("asdfasdf");
    countryService.insertCountry(country);
  }
  @RequestMapping("/updateCountry")
  public  void updateCountry() throws Exception{
    Country country=new Country();
    country.setId(3);
    country.setCountryname("asdfasdf");
    country.setCountrycode("asdfasdf");
    countryService.updateCountry(country);
  }
}
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
Java 数据库连接 数据库
Spring Boot整合tk.Mapper/通用Mapper
Spring Boot整合tk.Mapper/通用Mapper
44 0
|
Java 数据库连接 开发者
Mybatis是如何向Spring注册Mapper的?
有时候我们需要自行定义一些注解来标记某些特定功能的类并将它们注入Spring IoC容器。比较有代表性的就是Mybatis的Mapper接口。假如有一个新的需求让你也实现类似的功能你该如何下手呢?今天我们就从Mybatis的相关功能入手来学习其思路并为我所用。
|
Java 数据库连接 数据库
Spring Boot整合tk.Mapper/通用Mapper
Spring Boot整合tk.Mapper/通用Mapper
|
XML Java 数据库连接
Eclipse spring boot MyBatis1.4插件安装及自动生成xml、domain、mapper
在使用Eclipse 开发spring boot 时自动生成对象、mapper接口、domain,在此备忘方便后面查阅 新版本的mybatis会作一些调整,具体的操作方式可看我的另外一篇文章: https://developer.aliyun.com/article/1168902?spm=a2c6h.26396819.creator-center.12.12ed3e18lXUFoo
543 0
Eclipse spring boot MyBatis1.4插件安装及自动生成xml、domain、mapper
|
Java Spring
《Mapper(compomentModel=”spring”)实例详解》几十行代码如何优化成一行
《Mapper(compomentModel=”spring”)实例详解》几十行代码如何优化成一行
《Mapper(compomentModel=”spring”)实例详解》几十行代码如何优化成一行
|
SQL druid 前端开发
绝了!这款工具让 Spring Boot 不在需要 Controller、Service、DAO、Mapper 了
ataway 是基于 DataQL 服务聚合能力,为应用提供的一个接口配置工具。使得使用者无需开发任何代码就配置一个满足需求的接口。整个接口配置、测试、冒烟、发布。一站式都通过 Dataway 提供的 UI 界面完成。UI 会以 Jar 包方式提供并集成到应用中并和应用共享同一个 http 端口,应用无需单独为 Dataway 开辟新的管理端口。 这种内嵌集成方式模式的优点是,可以使得大部分老项目都
绝了!这款工具让 Spring Boot 不在需要 Controller、Service、DAO、Mapper 了
|
Java 数据库连接 API
Mybatis-spring源码分析之注册Mapper Bean
「Mybatis源码分析之Mapper注册与绑定」讲到了 Mapper 如何注册到 Configuration 类中与 MapperProxyFactory 绑定的过程,我们平时的使用场景一般都配合着 Spring,使用 Spring 意味着需要注册 Bean,也就是说需要将 Mapper 的代理实现类注册到 Spring 容器中,成为 Spring 容器中的一个 Bean。
478 0
Mybatis-spring源码分析之注册Mapper Bean
|
缓存 搜索推荐 Java
玩转Spring Cache --- @Cacheable使用在MyBatis的Mapper接口上(解决Null key returned for cache operation)【享学Spring】(下)
玩转Spring Cache --- @Cacheable使用在MyBatis的Mapper接口上(解决Null key returned for cache operation)【享学Spring】(下)
玩转Spring Cache --- @Cacheable使用在MyBatis的Mapper接口上(解决Null key returned for cache operation)【享学Spring】(下)
|
XML SQL 缓存
玩转Spring Cache --- @Cacheable使用在MyBatis的Mapper接口上(解决Null key returned for cache operation)【享学Spring】(上)
玩转Spring Cache --- @Cacheable使用在MyBatis的Mapper接口上(解决Null key returned for cache operation)【享学Spring】(上)
|
8天前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
下一篇
无影云桌面