MyBatis与Spring的集成整合加优化分页功能

目录

一.为什么要将MyBatis和Spring整合???

二.配置环境

[2.1 pom文件](#2.1 pom文件)

[2.2 xml文件](#2.2 xml文件)

三.演示举例

[四.Aop整合pageHelper 分页插件](#四.Aop整合pageHelper 分页插件)

今天的分享就到这啦!!!


一.为什么要将MyBatis和Spring整合???

将MyBatis和Spring整合的主要目的是为了更好地管理和使用数据库连接,并实现事务管理和依赖注入等功能。

如果不进行整合,可能会导致以下问题:

  1. 需要手动管理数据库连接:在不整合的情况下,需要手动获取和释放数据库连接,而整合后可以通过Spring容器自动管理连接,提高代码的可维护性和简洁性。
  2. 需要手动处理事务:在不整合的情况下,需要手动开启、提交或回滚事务,而整合后可以通过Spring的事务管理器自动处理事务,减少代码的冗余和错误。
  3. 需要手动注入依赖:在不整合的情况下,需要手动实例化和注入依赖对象,而整合后可以使用Spring的依赖注入功能,方便管理和切换依赖。

二.配置环境

2.1 pom文件

当我们创好一个项目,然后先来配置pom文件,配置一些相关的插件

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.zking</groupId>
  <artifactId>yzssm</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>yzssm Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version>

    <!--添加jar包依赖-->
    <!--1.spring 5.0.2.RELEASE相关-->
    <spring.version>5.0.2.RELEASE</spring.version>
    <!--2.mybatis相关-->
    <mybatis.version>3.4.5</mybatis.version>
    <!--mysql-->
    <mysql.version>5.1.44</mysql.version>
    <!--pagehelper分页jar依赖-->
    <pagehelper.version>5.1.2</pagehelper.version>
    <!--mybatis与spring集成jar依赖-->
    <mybatis.spring.version>1.3.1</mybatis.spring.version>
    <!--3.dbcp2连接池相关 druid-->
    <commons.dbcp2.version>2.1.1</commons.dbcp2.version>
    <commons.pool2.version>2.4.3</commons.pool2.version>
    <!--4.log日志相关-->
    <log4j2.version>2.9.1</log4j2.version>
    <!--5.其他-->
    <junit.version>4.12</junit.version>
    <servlet.version>4.0.0</servlet.version>
    <lombok.version>1.18.2</lombok.version>
  </properties>


  <dependencies>
    <!--1.spring相关-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!--2.mybatis相关-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>
    <!--mysql-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql.version}</version>
    </dependency>
    <!--pagehelper分页插件jar包依赖-->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>${pagehelper.version}</version>
    </dependency>
    <!--mybatis与spring集成jar包依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>${mybatis.spring.version}</version>
    </dependency>

    <!--3.dbcp2连接池相关-->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-dbcp2</artifactId>
      <version>${commons.dbcp2.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
      <version>${commons.pool2.version}</version>
    </dependency>

    <!--4.log日志相关依赖-->
    <!--核心log4j2jar包-->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>${log4j2.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>${log4j2.version}</version>
    </dependency>
    <!--web工程需要包含log4j-web,非web工程不需要-->
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-web</artifactId>
      <version>${log4j2.version}</version>
    </dependency>

    <!--5.其他-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>${junit.version}</version>
     <!-- <scope>test</scope>-->
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>${servlet.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>${lombok.version}</version>
      <scope>provided</scope>
    </dependency>

  </dependencies>
  <build>
    <finalName>yzssm</finalName>
    <resources>
      <!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题-->
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <include>**/*.xml</include>
        </includes>
      </resource>
      <!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题-->
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <include>jdbc.properties</include>
          <include>*.xml</include>
        </includes>
      </resource>
    </resources>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>${maven.compiler.plugin.version}</version>
          <configuration>
            <source>${maven.compiler.source}</source>
            <target>${maven.compiler.target}</target>
            <encoding>${project.build.sourceEncoding}</encoding>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.mybatis.generator</groupId>
          <artifactId>mybatis-generator-maven-plugin</artifactId>
          <version>1.3.2</version>
          <dependencies>
            <!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 -->
            <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
              <version>${mysql.version}</version>
            </dependency>
          </dependencies>
          <configuration>
            <overwrite>true</overwrite>
          </configuration>
        </plugin>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
  </build>
</project>

2.2 xml文件

首先是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="jdbc.properties"/>
    <!-- 指定数据库jdbc驱动jar包的位置 -->
    <classPathEntry location="F:\\temp\\maven_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
    <!--  一个数据库一个context  -->
    <context id="infoGuardian">
        <!--  注释  -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <!--  是否取消注释  -->
            <property name="suppressDate" value="true"/>
            <!--  是否生成注释代时间戳  -->
        </commentGenerator>
        <!--  jdbc连接  -->
        <jdbcConnection driverClass="${jdbc.driver}" connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
        <!--  类型转换  -->
        <javaTypeResolver>
            <!--  是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.)  -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
        <!--  01 指定javaBean生成的位置  -->
        <!--  targetPackage:指定生成的model生成所在的包名  -->
        <!--  targetProject:指定在该项目下所在的路径   -->
        <javaModelGenerator targetPackage="com.zking.model" targetProject="src/main/java">
            <!--  是否允许子包,即targetPackage.schemaName.tableName  -->
            <property name="enableSubPackages" value="false"/>
            <!--  是否对model添加构造函数  -->
            <property name="constructorBased" value="true"/>
            <!--  是否针对string类型的字段在set的时候进行trim调用  -->
            <property name="trimStrings" value="false"/>
            <!--  建立的Model对象是否 不可改变  即生成的Model对象不会有 setter方法,只有构造方法  -->
            <property name="immutable" value="false"/>
        </javaModelGenerator>
        <!--  02 指定sql映射文件生成的位置  -->
        <sqlMapGenerator targetPackage="com.zking.mapper" targetProject="src/main/java">
            <!--  是否允许子包,即targetPackage.schemaName.tableName  -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>
        <!--  03 生成XxxMapper接口  -->
        <!--  type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象  -->
        <!--  type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象  -->
        <!--  type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口  -->
        <javaClientGenerator targetPackage="com.zking.mapper" targetProject="src/main/java" type="XMLMAPPER">
            <!--  是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName]  -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>
        <!--  配置表信息  -->
        <!--  schema即为数据库名  -->
        <!--  tableName为对应的数据库表  -->
        <!--  domainObjectName是要生成的实体类  -->
        <!--  enable*ByExample是否生成 example类  -->
        <!-- <table schema="" tableName="t_book" domainObjectName="Book" -->
        <!-- enableCountByExample="false" enableDeleteByExample="false" -->
        <!-- enableSelectByExample="false" enableUpdateByExample="false"> -->
        <!-- &lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt; -->
        <!-- &lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt; -->
        <!-- &lt;!&ndash; 指定列的java数据类型 &ndash;&gt; -->
        <!-- &lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt; -->
        <!-- </table> -->
        <table schema="" tableName="t_mvc_book" domainObjectName="Book" enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false" enableUpdateByExample="false">
            <!--  忽略列,不生成bean 字段  -->
            <!--  <ignoreColumn column="FRED" />  -->
            <!--  指定列的java数据类型  -->
            <!--  <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />  -->
        </table>
    </context>
</generatorConfiguration>

其次就是idbc.properties ,连接数据库文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://47.100.191.44:3308/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
jdbc.username=test01
jdbc.password=test01

第三个就是日志文件 log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- status : 指定log4j本身的打印日志的级别.ALL< Trace < DEBUG < INFO < WARN < ERROR
	< FATAL < OFF。 monitorInterval : 用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s. -->
<Configuration status="WARN" monitorInterval="30">
    <Properties>
        <!-- 配置日志文件输出目录 ${sys:user.home} -->
        <Property name="LOG_HOME">/root/workspace/lucenedemo/logs</Property>
        <property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/error</property>
        <property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warn</property>
        <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n</property>
    </Properties>

    <Appenders>
        <!--这个输出控制台的配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
            <ThresholdFilter level="trace" onMatch="ACCEPT"
                             onMismatch="DENY" />
            <!-- 输出日志的格式 -->
            <!-- %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间 %p : 日志输出格式 %c : logger的名称
                %m : 日志内容,即 logger.info("message") %n : 换行符 %C : Java类名 %L : 日志输出所在行数 %M
                : 日志输出所在方法名 hostName : 本地机器名 hostAddress : 本地ip地址 -->
            <PatternLayout pattern="${PATTERN}" />
        </Console>

        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 -->
        <!--append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true -->
        <File name="log" fileName="logs/test.log" append="false">
            <PatternLayout
                    pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </File>
        <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size, 则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
        <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
            <ThresholdFilter level="info" onMatch="ACCEPT"
                             onMismatch="DENY" />
            <PatternLayout
                    pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            <Policies>
                <!-- 基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。 modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am. -->
                <!-- 关键点在于 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval, 日期格式精确到哪一位,interval也精确到哪一个单位 -->
                <!-- log4j2的按天分日志文件 : info-%d{yyyy-MM-dd}-%i.log -->
                <TimeBasedTriggeringPolicy interval="1"
                                           modulate="true" />
                <!-- SizeBasedTriggeringPolicy:Policies子节点, 基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小. -->
                <!-- <SizeBasedTriggeringPolicy size="2 kB" /> -->
            </Policies>
        </RollingFile>

        <RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log"
                     filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="warn" onMatch="ACCEPT"
                             onMismatch="DENY" />
            <PatternLayout
                    pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="2 kB" />
            </Policies>
            <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
            <DefaultRolloverStrategy max="20" />
        </RollingFile>

        <RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log"
                     filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log">
            <ThresholdFilter level="error" onMatch="ACCEPT"
                             onMismatch="DENY" />
            <PatternLayout
                    pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
            <Policies>
                <!-- log4j2的按分钟 分日志文件 : warn-%d{yyyy-MM-dd-HH-mm}-%i.log -->
                <TimeBasedTriggeringPolicy interval="1"
                                           modulate="true" />
                <!-- <SizeBasedTriggeringPolicy size="10 MB" /> -->
            </Policies>
        </RollingFile>

    </Appenders>

    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
    <Loggers>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
        <logger name="org.springframework" level="INFO"></logger>
        <logger name="org.mybatis" level="INFO"></logger>

        <!-- 第三方日志系统 -->
        <logger name="org.springframework" level="ERROR" />
        <logger name="org.hibernate" level="ERROR" />
        <logger name="org.apache.struts2" level="ERROR" />
        <logger name="com.opensymphony.xwork2" level="ERROR" />
        <logger name="org.jboss" level="ERROR" />


        <!-- 配置日志的根节点 -->
        <root level="all">
            <appender-ref ref="Console" />
            <appender-ref ref="RollingFileInfo" />
            <appender-ref ref="RollingFileWarn" />
            <appender-ref ref="RollingFileError" />
        </root>

    </Loggers>

</Configuration>

第四个就是spring上下文配置文件 spring-context.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">

<!--将spring框架与Mybatis整合的配置文件加载到spring的上下文中-->
    <import resource="classpath:springt-mybatis.xml"></import>

</beans>

最后一个spring-mybatis.xml 它的作用是:

1.扫描所有的JavaBean,将组件加载到spring的上下文中

2.配置数据源--数据库连接池

3.配置session工厂

4.配置mapper扫描接口

5.配置事务管理器

6.配置aop自动代理

<?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:tx="http://www.springframework.org/schema/tx"
           xmlns:aop="http://www.springframework.org/schema/aop"
           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/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">
        <!--1. 注解式开发 -->
        <!-- 注解驱动 -->
        <context:annotation-config/>
        <!-- 用注解方式注入bean,并指定查找范围:com.zking及子子孙孙包-->
        <context:component-scan base-package="com.zking"/>

        <context:property-placeholder location="classpath:jdbc.properties"/>

        <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
              destroy-method="close">
            <property name="driverClassName" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
            <!--初始连接数-->
            <property name="initialSize" value="10"/>
            <!--最大活动连接数-->
            <property name="maxTotal" value="100"/>
            <!--最大空闲连接数-->
            <property name="maxIdle" value="50"/>
            <!--最小空闲连接数-->
            <property name="minIdle" value="10"/>
            <!--设置为-1时,如果没有可用连接,连接池会一直无限期等待,直到获取到连接为止。-->
            <!--如果设置为N(毫秒),则连接池会等待N毫秒,等待不到,则抛出异常-->
            <property name="maxWaitMillis" value="-1"/>
        </bean>

        <!--4. spring和MyBatis整合 -->
        <!--1) 创建sqlSessionFactory-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!-- 指定数据源 -->
            <property name="dataSource" ref="dataSource"/>
            <!-- 自动扫描XxxMapping.xml文件,**任意路径 -->
            <property name="mapperLocations" value="classpath*:com/zking/**/mapper/*.xml"/>
            <!-- 指定别名 -->
            <property name="typeAliasesPackage" value="com/zking/**/model"/>
            <!--配置pagehelper插件-->
            <property name="plugins">
                <array>
                    <bean class="com.github.pagehelper.PageInterceptor">
                        <property name="properties">
                            <value>
                                helperDialect=mysql
                            </value>
                        </property>
                    </bean>
                </array>
            </property>
        </bean>

        <!--2) 自动扫描com/zking/**/mapper下的所有XxxMapper接口(其实就是DAO接口),并实现这些接口,-->
        <!--   即可直接在程序中使用dao接口,不用再获取sqlsession对象-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!--basePackage 属性是映射器接口文件的包路径。-->
            <!--你可以使用分号或逗号 作为分隔符设置多于一个的包路径-->
            <property name="basePackage" value="com/zking/**/mapper"/>
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        </bean>

        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource" />
        </bean>
        <tx:annotation-driven transaction-manager="transactionManager" />
        <aop:aspectj-autoproxy/>
    </beans>

注意:有些地方需要根据自己的需求更改,比如数据库的路径,密码账号,还有JavaBean的文件路径,等类似这些地方需要更改

将这些配置完后,我们直接生成即可

这样我们的环境就搭建好啦!!


三.演示举例

在这里我们先给BookMapper使用注解 @Repository 将这个给spring管理,相当于之前我们在spring-context.xml文件中写的

<bean id="bookMapper class="com.zking.mapper.BookMapper" >

复制代码

有了上面生成出来的实体类和方法,现在我们直接开始写Biz层,继承BookBiz接口

这里面也是运用了注解的方式

@Service 将该类交给spring处理 ;@Autowired 相当于set,get方法

package com.zking.biz;

import com.zking.mapper.BookMapper;
import com.zking.model.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author yinzi
 * @create 2023-08-25 15:37
 */
@Service
//将类交给spring处理
public class BookBizImpl implements BookBiz{
    @Autowired   //相当于set,get方法
    private BookMapper bm;

    @Override
    public int deleteByPrimaryKey(Integer bid) {
        return bm.deleteByPrimaryKey(bid);
    }

    @Override
    public int insert(Book record) {
        return bm.insert(record);
    }

    @Override
    public int insertSelective(Book record) {
        return bm.insertSelective(record);
    }

    @Override
    public Book selectByPrimaryKey(Integer bid) {
        return bm.selectByPrimaryKey(bid);
    }

    @Override
    public int updateByPrimaryKeySelective(Book record) {
        return bm.updateByPrimaryKeySelective(record);
    }

    @Override
    public int updateByPrimaryKey(Book record) {
        return bm.updateByPrimaryKey(record);
    }
}

测试:

四.Aop整合pageHelper 分页插件

----- 也算是完善上一篇分页功能

首先,一样先导入pageBean工具类

package com.zking.util;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Map;

public class PageBean implements Serializable {

	private static final long serialVersionUID = 2422581023658455731L;

	//页码
	private int page=1;
	//每页显示记录数
	private int rows=10;
	//总记录数
	private int total=0;
	//是否分页
	private boolean isPagination=true;
	//上一次的请求路径
	private String url;
	//获取所有的请求参数
	private Map<String,String[]> map;
	
	public PageBean() {
		super();
	}
	
	//设置请求参数
	public void setRequest(HttpServletRequest req) {
		String page=req.getParameter("page");
		String rows=req.getParameter("rows");
		String pagination=req.getParameter("pagination");
		this.setPage(page);
		this.setRows(rows);
		this.setPagination(pagination);
		this.url=req.getContextPath()+req.getServletPath();
		this.map=req.getParameterMap();
	}
	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public Map<String, String[]> getMap() {
		return map;
	}

	public void setMap(Map<String, String[]> map) {
		this.map = map;
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}
	
	public void setPage(String page) {
		if(null!=page&&!"".equals(page.trim()))
			this.page = Integer.parseInt(page);
	}

	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}
	
	public void setRows(String rows) {
		if(null!=rows&&!"".equals(rows.trim()))
			this.rows = Integer.parseInt(rows);
	}

	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}
	
	public void setTotal(String total) {
		this.total = Integer.parseInt(total);
	}

	public boolean isPagination() {
		return isPagination;
	}
	
	public void setPagination(boolean isPagination) {
		this.isPagination = isPagination;
	}
	
	public void setPagination(String isPagination) {
		if(null!=isPagination&&!"".equals(isPagination.trim()))
			this.isPagination = Boolean.parseBoolean(isPagination);
	}
	
	/**
	 * 获取分页起始标记位置
	 * @return
	 */
	public int getStartIndex() {
		//(当前页码-1)*显示记录数
		return (this.getPage()-1)*this.rows;
	}
	
	/**
	 * 末页
	 * @return
	 */
	public int getMaxPage() {
		int totalpage=this.total/this.rows;
		if(this.total%this.rows!=0)
			totalpage++;
		return totalpage;
	}
	
	/**
	 * 下一页
	 * @return
	 */
	public int getNextPage() {
		int nextPage=this.page+1;
		if(this.page>=this.getMaxPage())
			nextPage=this.getMaxPage();
		return nextPage;
	}
	
	/**
	 * 上一页
	 * @return
	 */
	public int getPreivousPage() {
		int previousPage=this.page-1;
		if(previousPage<1)
			previousPage=1;
		return previousPage;
	}

	@Override
	public String toString() {
		return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination
				+ "]";
	}
}

其次,建立一个切面类aspect,我们需要使用注解的方式**@Aspect 代表为切面类 @Component 代表该类交给spring管理****,然后将写在impl里面的分页方法分出来,单独写在切面类里面,将其放在环绕通知中 需要注解****@Around("execution(* *..*Biz.*Pager(..))") 环绕通知**

* *..*Biz.*Pager(..)

  1. * *..*Service.*List(..)) 第一个* 代表了任意返回值
  2. *.. 代表了任意包,不限层级
  3. *Biz代表了以Service结尾的类/接口
  4. *List 代表了以pager结尾的方法
  5. .. 括号的点点 代表了任意参数 符合以上则为目标类或者目标方法

并且运用了环绕通知的方法,做判断,如果有pageBean作为参数就强转

package com.zking.aspect;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zking.model.Book;
import com.zking.util.PageBean;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author yinzi
 * @create 2023-08-25 17:05
 */

@Aspect //代表为切面类
@Component  //代表该类交给spring管理
public class PageAspect {

    @Around("execution(* *..*Biz.*List(..))")  //环绕通知
    //* *..*Service.*Pager(..))
    //第一个* 代表了任意返回值
    //*.. 代表了任意包,不限层级
    //*Service 代表了以Service结尾的类/接口
    //*Pager  代表了以pager结尾的方法
    //.. 括号的点点 代表了任意参数
    //符合以上则为目标类或者目标方法
    public Object invoke(ProceedingJoinPoint args) throws Throwable {
        PageBean pageBean=null;
        //获取目标方法的所有参数
        Object[] args1 = args.getArgs();
        for (Object parm:args1){
            //如果有参数是pageBean 那么就强转
            if(parm instanceof PageBean){
                pageBean = (PageBean) parm;
                break;
            }

        }
        //判空分页
        if(pageBean!=null && pageBean.isPagination())
            PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        //执行目标方法
        Object proceed = args.proceed();
        if(pageBean!=null && pageBean.isPagination()){
            PageInfo info = new PageInfo((List) proceed);
            pageBean.setTotal((int) info.getTotal());
        }
            return proceed;

    }
}

最后测试:

今天的分享就到这啦!!!

相关推荐
爱写代码的刚子1 分钟前
C++知识总结
java·开发语言·c++
冷琴19969 分钟前
基于java+springboot的酒店预定网站、酒店客房管理系统
java·开发语言·spring boot
daiyang123...35 分钟前
IT 行业的就业情况
java
Nightselfhurt1 小时前
Spring cloud 中gateway原理
spring·spring cloud·gateway
爬山算法1 小时前
Maven(6)如何使用Maven进行项目构建?
java·maven
.生产的驴1 小时前
Electron Vue框架环境搭建 Vue3环境搭建
java·前端·vue.js·spring boot·后端·electron·ecmascript
爱学的小涛1 小时前
【NIO基础】基于 NIO 中的组件实现对文件的操作(文件编程),FileChannel 详解
java·开发语言·笔记·后端·nio
吹老师个人app编程教学1 小时前
详解Java中的BIO、NIO、AIO
java·开发语言·nio
爱学的小涛1 小时前
【NIO基础】NIO(非阻塞 I/O)和 IO(传统 I/O)的区别,以及 NIO 的三大组件详解
java·开发语言·笔记·后端·nio
北极无雪1 小时前
Spring源码学习:SpringMVC(4)DispatcherServlet请求入口分析
java·开发语言·后端·学习·spring