当前位置:   article > 正文

Mybatis之与Spring集成(带你体验Spring给Mybatis带来的神奇)_springcloud集成mybatis

springcloud集成mybatis

前言

在上一期的博客中我们领略到了Mybatis中的动态SQL语句给我们带来的魅力,这期博客我将与老铁分享有关Mybatis与Spring集成的神奇,让我们一起来看看吧。

一、Mybatis与Spring整合的介绍

1. 什么是Mybatis与Spring集成

MyBatis与Spring集成是指将MyBatisSpring框架结合使用,以便更方便地管理和调用数据库操作。 MyBatis是一个持久层框架,它提供了一种简单而强大的方式来自动化执行SQL查询、映射结果到Java对象、执行数据库事务等操作。而Spring框架是一个综合的应用开发框架,它提供了IoC(控制反转)和AOP(面向切面编程)等功能,使开发人员可以更轻松地构建和管理应用程序。

2. 两者集成的优点

  • 简化配置:通过集成,可以将MyBatis的配置文件与Spring的配置文件合并,减少了配置的复杂性。

  • 事务管理:Spring框架提供了强大的事务管理功能,可以更方便地对数据库事务进行控制,保证数据的一致性和完整性。

  • 依赖注入:通过Spring的IoC容器,可以将MyBatis的Mapper和其他依赖对象自动注入到Spring管理的Bean中,减少了手动管理依赖的工作。

  • AOP支持:Spring的AOP功能可以方便地为MyBatis的数据库操作添加额外的逻辑,例如日志记录、性能监控等。

总之,MyBatis与Spring集成可以提高开发效率,降低代码的耦合度,使数据库操作更加灵活和可维护。

3. 作用领域

Mybatis与Spring作用的领域
领域说明
Web应用开发在Web应用中,MyBatis与Spring集成可以协助进行数据库操作,例如查询、插入、更新和删除数据等。结合Spring MVC框架,可以实现数据的持久化和展示,构建强大的Web应用程序。
企业应用开发MyBatis与Spring集成可以提供丰富的数据库操作功能,方便企业应用中对数据库的增删改查以及事务管理等操作。结合Spring的AOP特性,可以实现事务控制、异常处理等企业级功能。
微服务架构在微服务架构中,MyBatis与Spring集成可以作为数据访问层的框架,负责处理与数据库的交互。通过Spring Cloud等组件,可以将微服务整合到一个统一的系统中,使得各个微服务之间可以方便地共享和访问数据。
数据分析和报表MyBatis与Spring集成可以方便地进行数据库查询和数据操作,适用于数据分析、报表生成等领域。通过使用Spring Boot等组件,可以快速搭建数据分析平台,提供丰富的数据分析和报表功能。
批处理任务在批处理任务中,MyBatis与Spring集成可以作为数据读取和写入的工具,方便处理大量的数据。结合Spring Batch框架,可以实现批处理任务的调度、监控等功能。

二、Mybatis与Spring整合的步骤

1. 创建一个Maven项目(步骤如下图所示)

2. 导入相关的pom.xml的依赖

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.yx</groupId>
  6. <artifactId>yx_ssm</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <packaging>war</packaging>
  9. <name>yx_ssm Maven Webapp</name>
  10. <!-- FIXME change it to the project's website -->
  11. <url>http://www.example.com</url>
  12. <properties>
  13. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  14. <maven.compiler.source>1.8</maven.compiler.source>
  15. <maven.compiler.target>1.8</maven.compiler.target>
  16. <maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version>
  17. <!--添加jar包依赖-->
  18. <!--1.spring 5.0.2.RELEASE相关-->
  19. <spring.version>5.0.2.RELEASE</spring.version>
  20. <!--2.mybatis相关-->
  21. <mybatis.version>3.4.5</mybatis.version>
  22. <!--mysql-->
  23. <mysql.version>5.1.44</mysql.version>
  24. <!--pagehelper分页jar依赖-->
  25. <pagehelper.version>5.1.2</pagehelper.version>
  26. <!--mybatis与spring集成jar依赖-->
  27. <mybatis.spring.version>1.3.1</mybatis.spring.version>
  28. <!--3.dbcp2连接池相关 druid-->
  29. <commons.dbcp2.version>2.1.1</commons.dbcp2.version>
  30. <commons.pool2.version>2.4.3</commons.pool2.version>
  31. <!--4.log日志相关-->
  32. <log4j2.version>2.9.1</log4j2.version>
  33. <!--5.其他-->
  34. <junit.version>4.12</junit.version>
  35. <servlet.version>4.0.0</servlet.version>
  36. <lombok.version>1.18.2</lombok.version>
  37. </properties>
  38. <dependencies>
  39. <!--1.spring相关-->
  40. <dependency>
  41. <groupId>org.springframework</groupId>
  42. <artifactId>spring-context</artifactId>
  43. <version>${spring.version}</version>
  44. </dependency>
  45. <dependency>
  46. <groupId>org.springframework</groupId>
  47. <artifactId>spring-orm</artifactId>
  48. <version>${spring.version}</version>
  49. </dependency>
  50. <dependency>
  51. <groupId>org.springframework</groupId>
  52. <artifactId>spring-tx</artifactId>
  53. <version>${spring.version}</version>
  54. </dependency>
  55. <dependency>
  56. <groupId>org.springframework</groupId>
  57. <artifactId>spring-aspects</artifactId>
  58. <version>${spring.version}</version>
  59. </dependency>
  60. <dependency>
  61. <groupId>org.springframework</groupId>
  62. <artifactId>spring-web</artifactId>
  63. <version>${spring.version}</version>
  64. </dependency>
  65. <dependency>
  66. <groupId>org.springframework</groupId>
  67. <artifactId>spring-test</artifactId>
  68. <version>${spring.version}</version>
  69. </dependency>
  70. <!--2.mybatis相关-->
  71. <dependency>
  72. <groupId>org.mybatis</groupId>
  73. <artifactId>mybatis</artifactId>
  74. <version>${mybatis.version}</version>
  75. </dependency>
  76. <!--mysql-->
  77. <dependency>
  78. <groupId>mysql</groupId>
  79. <artifactId>mysql-connector-java</artifactId>
  80. <version>${mysql.version}</version>
  81. </dependency>
  82. <!--pagehelper分页插件jar包依赖-->
  83. <dependency>
  84. <groupId>com.github.pagehelper</groupId>
  85. <artifactId>pagehelper</artifactId>
  86. <version>${pagehelper.version}</version>
  87. </dependency>
  88. <!--mybatis与spring集成jar包依赖-->
  89. <dependency>
  90. <groupId>org.mybatis</groupId>
  91. <artifactId>mybatis-spring</artifactId>
  92. <version>${mybatis.spring.version}</version>
  93. </dependency>
  94. <!--3.dbcp2连接池相关-->
  95. <dependency>
  96. <groupId>org.apache.commons</groupId>
  97. <artifactId>commons-dbcp2</artifactId>
  98. <version>${commons.dbcp2.version}</version>
  99. </dependency>
  100. <dependency>
  101. <groupId>org.apache.commons</groupId>
  102. <artifactId>commons-pool2</artifactId>
  103. <version>${commons.pool2.version}</version>
  104. </dependency>
  105. <!--4.log日志相关依赖-->
  106. <!--核心log4j2jar包-->
  107. <dependency>
  108. <groupId>org.apache.logging.log4j</groupId>
  109. <artifactId>log4j-core</artifactId>
  110. <version>${log4j2.version}</version>
  111. </dependency>
  112. <dependency>
  113. <groupId>org.apache.logging.log4j</groupId>
  114. <artifactId>log4j-api</artifactId>
  115. <version>${log4j2.version}</version>
  116. </dependency>
  117. <!--web工程需要包含log4j-web,非web工程不需要-->
  118. <dependency>
  119. <groupId>org.apache.logging.log4j</groupId>
  120. <artifactId>log4j-web</artifactId>
  121. <version>${log4j2.version}</version>
  122. </dependency>
  123. <!--5.其他-->
  124. <dependency>
  125. <groupId>junit</groupId>
  126. <artifactId>junit</artifactId>
  127. <version>${junit.version}</version>
  128. <scope>test</scope>
  129. </dependency>
  130. <dependency>
  131. <groupId>javax.servlet</groupId>
  132. <artifactId>javax.servlet-api</artifactId>
  133. <version>${servlet.version}</version>
  134. <scope>provided</scope>
  135. </dependency>
  136. <dependency>
  137. <groupId>org.projectlombok</groupId>
  138. <artifactId>lombok</artifactId>
  139. <version>${lombok.version}</version>
  140. <scope>provided</scope>
  141. </dependency>
  142. </dependencies>
  143. <build>
  144. <finalName>yx_ssm</finalName>
  145. <resources>
  146. <!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题-->
  147. <resource>
  148. <directory>src/main/java</directory>
  149. <includes>
  150. <include>**/*.xml</include>
  151. </includes>
  152. </resource>
  153. <!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题-->
  154. <resource>
  155. <directory>src/main/resources</directory>
  156. <includes>
  157. <include>jdbc.properties</include>
  158. <include>*.xml</include>
  159. </includes>
  160. </resource>
  161. </resources>
  162. <plugins>
  163. <plugin>
  164. <groupId>org.apache.maven.plugins</groupId>
  165. <artifactId>maven-compiler-plugin</artifactId>
  166. <version>${maven.compiler.plugin.version}</version>
  167. <configuration>
  168. <source>${maven.compiler.source}</source>
  169. <target>${maven.compiler.target}</target>
  170. <encoding>${project.build.sourceEncoding}</encoding>
  171. </configuration>
  172. </plugin>
  173. <plugin>
  174. <groupId>org.mybatis.generator</groupId>
  175. <artifactId>mybatis-generator-maven-plugin</artifactId>
  176. <version>1.3.2</version>
  177. <dependencies>
  178. <!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 -->
  179. <dependency>
  180. <groupId>mysql</groupId>
  181. <artifactId>mysql-connector-java</artifactId>
  182. <version>${mysql.version}</version>
  183. </dependency>
  184. </dependencies>
  185. <configuration>
  186. <overwrite>true</overwrite>
  187. </configuration>
  188. </plugin>
  189. <plugin>
  190. <artifactId>maven-clean-plugin</artifactId>
  191. <version>3.1.0</version>
  192. </plugin>
  193. <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
  194. <plugin>
  195. <artifactId>maven-resources-plugin</artifactId>
  196. <version>3.0.2</version>
  197. </plugin>
  198. <plugin>
  199. <artifactId>maven-compiler-plugin</artifactId>
  200. <version>3.8.0</version>
  201. </plugin>
  202. <plugin>
  203. <artifactId>maven-surefire-plugin</artifactId>
  204. <version>2.22.1</version>
  205. </plugin>
  206. <plugin>
  207. <artifactId>maven-war-plugin</artifactId>
  208. <version>3.2.2</version>
  209. </plugin>
  210. <plugin>
  211. <artifactId>maven-install-plugin</artifactId>
  212. <version>2.5.2</version>
  213. </plugin>
  214. <plugin>
  215. <artifactId>maven-deploy-plugin</artifactId>
  216. <version>2.8.2</version>
  217. </plugin>
  218. </plugins>
  219. </build>
  220. </project>

3. 导入项目相关的.xml文件

generatorConfig.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  3. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
  4. <generatorConfiguration>
  5. <!-- 引入配置文件 -->
  6. <properties resource="jdbc.properties"/>
  7. <!--指定数据库jdbc驱动jar包的位置-->
  8. <classPathEntry location="D:\\MYsoftware\\Maven\\mvn_repsoitory\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
  9. <!-- 一个数据库一个context -->
  10. <context id="infoGuardian">
  11. <!-- 注释 -->
  12. <commentGenerator>
  13. <property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
  14. <property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 -->
  15. </commentGenerator>
  16. <!-- jdbc连接 -->
  17. <jdbcConnection driverClass="${jdbc.driver}"
  18. connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
  19. <!-- 类型转换 -->
  20. <javaTypeResolver>
  21. <!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
  22. <property name="forceBigDecimals" value="false"/>
  23. </javaTypeResolver>
  24. <!-- 01 指定javaBean生成的位置 -->
  25. <!-- targetPackage:指定生成的model生成所在的包名 -->
  26. <!-- targetProject:指定在该项目下所在的路径 -->
  27. <javaModelGenerator targetPackage="com.yx.model"
  28. targetProject="src/main/java">
  29. <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
  30. <property name="enableSubPackages" value="false"/>
  31. <!-- 是否对model添加构造函数 -->
  32. <property name="constructorBased" value="true"/>
  33. <!-- 是否针对string类型的字段在set的时候进行trim调用 -->
  34. <property name="trimStrings" value="false"/>
  35. <!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 -->
  36. <property name="immutable" value="false"/>
  37. </javaModelGenerator>
  38. <!-- 02 指定sql映射文件生成的位置 -->
  39. <sqlMapGenerator targetPackage="com.yx.mapper"
  40. targetProject="src/main/java">
  41. <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
  42. <property name="enableSubPackages" value="false"/>
  43. </sqlMapGenerator>
  44. <!-- 03 生成XxxMapper接口 -->
  45. <!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 -->
  46. <!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 -->
  47. <!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 -->
  48. <javaClientGenerator targetPackage="com.yx.mapper"
  49. targetProject="src/main/java" type="XMLMAPPER">
  50. <!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] -->
  51. <property name="enableSubPackages" value="false"/>
  52. </javaClientGenerator>
  53. <!-- 配置表信息 -->
  54. <!-- schema即为数据库名 -->
  55. <!-- tableName为对应的数据库表 -->
  56. <!-- domainObjectName是要生成的实体类 -->
  57. <!-- enable*ByExample是否生成 example类 -->
  58. <!--<table schema="" tableName="t_book" domainObjectName="Book"-->
  59. <!--enableCountByExample="false" enableDeleteByExample="false"-->
  60. <!--enableSelectByExample="false" enableUpdateByExample="false">-->
  61. <!--&lt;!&ndash; 忽略列,不生成bean 字段 &ndash;&gt;-->
  62. <!--&lt;!&ndash; <ignoreColumn column="FRED" /> &ndash;&gt;-->
  63. <!--&lt;!&ndash; 指定列的java数据类型 &ndash;&gt;-->
  64. <!--&lt;!&ndash; <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> &ndash;&gt;-->
  65. <!--</table>-->
  66. <table schema="" tableName="t_mvc_Book" domainObjectName="Book"
  67. enableCountByExample="false" enableDeleteByExample="false"
  68. enableSelectByExample="false" enableUpdateByExample="false">
  69. <!-- 忽略列,不生成bean 字段 -->
  70. <!-- <ignoreColumn column="FRED" /> -->
  71. <!-- 指定列的java数据类型 -->
  72. <!-- <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> -->
  73. </table>
  74. </context>
  75. </generatorConfiguration>

jdbc.properties

  1. jdbc.driver=com.mysql.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
  3. jdbc.username=root
  4. jdbc.password=123456

 log4j2.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- status : 指定log4j本身的打印日志的级别.ALL< Trace < DEBUG < INFO < WARN < ERROR
  3. < FATAL < OFF。 monitorInterval : 用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s. -->
  4. <Configuration status="WARN" monitorInterval="30">
  5. <Properties>
  6. <!-- 配置日志文件输出目录 ${sys:user.home} -->
  7. <Property name="LOG_HOME">/root/workspace/lucenedemo/logs</Property>
  8. <property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/error</property>
  9. <property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warn</property>
  10. <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n</property>
  11. </Properties>
  12. <Appenders>
  13. <!--这个输出控制台的配置 -->
  14. <Console name="Console" target="SYSTEM_OUT">
  15. <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
  16. <ThresholdFilter level="trace" onMatch="ACCEPT"
  17. onMismatch="DENY" />
  18. <!-- 输出日志的格式 -->
  19. <!-- %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间 %p : 日志输出格式 %c : logger的名称
  20. %m : 日志内容,即 logger.info("message") %n : 换行符 %C : Java类名 %L : 日志输出所在行数 %M
  21. : 日志输出所在方法名 hostName : 本地机器名 hostAddress : 本地ip地址 -->
  22. <PatternLayout pattern="${PATTERN}" />
  23. </Console>
  24. <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 -->
  25. <!--append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true -->
  26. <File name="log" fileName="logs/test.log" append="false">
  27. <PatternLayout
  28. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
  29. </File>
  30. <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size, 则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
  31. <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
  32. filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
  33. <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
  34. <ThresholdFilter level="info" onMatch="ACCEPT"
  35. onMismatch="DENY" />
  36. <PatternLayout
  37. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
  38. <Policies>
  39. <!-- 基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。 modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am. -->
  40. <!-- 关键点在于 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval, 日期格式精确到哪一位,interval也精确到哪一个单位 -->
  41. <!-- log4j2的按天分日志文件 : info-%d{yyyy-MM-dd}-%i.log -->
  42. <TimeBasedTriggeringPolicy interval="1"
  43. modulate="true" />
  44. <!-- SizeBasedTriggeringPolicy:Policies子节点, 基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小. -->
  45. <!-- <SizeBasedTriggeringPolicy size="2 kB" /> -->
  46. </Policies>
  47. </RollingFile>
  48. <RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log"
  49. filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
  50. <ThresholdFilter level="warn" onMatch="ACCEPT"
  51. onMismatch="DENY" />
  52. <PatternLayout
  53. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
  54. <Policies>
  55. <TimeBasedTriggeringPolicy />
  56. <SizeBasedTriggeringPolicy size="2 kB" />
  57. </Policies>
  58. <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
  59. <DefaultRolloverStrategy max="20" />
  60. </RollingFile>
  61. <RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log"
  62. filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log">
  63. <ThresholdFilter level="error" onMatch="ACCEPT"
  64. onMismatch="DENY" />
  65. <PatternLayout
  66. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
  67. <Policies>
  68. <!-- log4j2的按分钟 分日志文件 : warn-%d{yyyy-MM-dd-HH-mm}-%i.log -->
  69. <TimeBasedTriggeringPolicy interval="1"
  70. modulate="true" />
  71. <!-- <SizeBasedTriggeringPolicy size="10 MB" /> -->
  72. </Policies>
  73. </RollingFile>
  74. </Appenders>
  75. <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
  76. <Loggers>
  77. <!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
  78. <logger name="org.springframework" level="INFO"></logger>
  79. <logger name="org.mybatis" level="INFO"></logger>
  80. <!-- 第三方日志系统 -->
  81. <logger name="org.springframework" level="ERROR" />
  82. <logger name="org.hibernate" level="ERROR" />
  83. <logger name="org.apache.struts2" level="ERROR" />
  84. <logger name="com.opensymphony.xwork2" level="ERROR" />
  85. <logger name="org.jboss" level="ERROR" />
  86. <!-- 配置日志的根节点 -->
  87. <root level="all">
  88. <appender-ref ref="Console" />
  89. <appender-ref ref="RollingFileInfo" />
  90. <appender-ref ref="RollingFileWarn" />
  91. <appender-ref ref="RollingFileError" />
  92. </root>
  93. </Loggers>
  94. </Configuration>

spring-context.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!-- spring框架与mybatis整合的配置文件加载到spring的上下文中-->
  6. <import resource="classpath:spring-mybatis.xml"></import>
  7. </beans>

spring-mybatis.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. 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">
  7. <!--1. 注解式开发 -->
  8. <!-- 注解驱动 -->
  9. <context:annotation-config/>
  10. <!-- 用注解方式注入bean,并指定查找范围:com.javaxl.ssm及子子孙孙包-->
  11. <context:component-scan base-package="com.yx"/>
  12. <context:property-placeholder location="classpath:jdbc.properties"/>
  13. <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
  14. destroy-method="close">
  15. <property name="driverClassName" value="${jdbc.driver}"/>
  16. <property name="url" value="${jdbc.url}"/>
  17. <property name="username" value="${jdbc.username}"/>
  18. <property name="password" value="${jdbc.password}"/>
  19. <!--初始连接数-->
  20. <property name="initialSize" value="10"/>
  21. <!--最大活动连接数-->
  22. <property name="maxTotal" value="100"/>
  23. <!--最大空闲连接数-->
  24. <property name="maxIdle" value="50"/>
  25. <!--最小空闲连接数-->
  26. <property name="minIdle" value="10"/>
  27. <!--设置为-1时,如果没有可用连接,连接池会一直无限期等待,直到获取到连接为止。-->
  28. <!--如果设置为N(毫秒),则连接池会等待N毫秒,等待不到,则抛出异常-->
  29. <property name="maxWaitMillis" value="-1"/>
  30. </bean>
  31. <!--4. spring和MyBatis整合 -->
  32. <!--1) 创建sqlSessionFactory-->
  33. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  34. <!-- 指定数据源 -->
  35. <property name="dataSource" ref="dataSource"/>
  36. <!-- 自动扫描XxxMapping.xml文件,**任意路径 -->
  37. <property name="mapperLocations" value="classpath*:com/yx/**/mapper/*.xml"/>
  38. <!-- 指定别名 -->
  39. <property name="typeAliasesPackage" value="com/javaxl/ssm/**/model"/>
  40. <!--配置pagehelper插件-->
  41. <property name="plugins">
  42. <array>
  43. <bean class="com.github.pagehelper.PageInterceptor">
  44. <property name="properties">
  45. <value>
  46. helperDialect=mysql
  47. </value>
  48. </property>
  49. </bean>
  50. </array>
  51. </property>
  52. </bean>
  53. <!--2) 自动扫描com/javaxl/ssm/**/mapper下的所有XxxMapper接口(其实就是DAO接口),并实现这些接口,-->
  54. <!-- 即可直接在程序中使用dao接口,不用再获取sqlsession对象-->
  55. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  56. <!--basePackage 属性是映射器接口文件的包路径。-->
  57. <!--你可以使用分号或逗号 作为分隔符设置多于一个的包路径-->
  58. <property name="basePackage" value="com/yx/**/mapper"/>
  59. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
  60. </bean>
  61. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  62. <property name="dataSource" ref="dataSource" />
  63. </bean>
  64. <tx:annotation-driven transaction-manager="transactionManager" />
  65. <aop:aspectj-autoproxy/>
  66. </beans>

作用:

  • 扫描所有JavaBean,将对应的组件加载到spring的上下文中。(<bean id=" " class="...">)
  • 配置数据源(数据连接池)
  • 配置session工厂
  • 配置mapper扫描接口
  • 配置事务管理器

注意事项:

  1. <context:component-scan base-package="com.yx"/>base-package的路径依据自己项目名设置。
  2. <property name="mapperLocations" value="classpath*:com/yx/**/mapper/*.xml"/>的value值根据自身项目修改。
  3. <property name="basePackage" value="com/yx/**/mapper"/>的value值根据自身项目修改。

 4. 生成对应的实体类、接口类及接口实现类

操作

 实体类Book.java

  1. package com.yx.model;
  2. import lombok.Data;
  3. @Data //相当于set、get、tostring方法
  4. public class Book {
  5. private Integer bid;
  6. private String bname;
  7. private Float price;
  8. public Integer getBid() {
  9. return bid;
  10. }
  11. public void setBid(Integer bid) {
  12. this.bid = bid;
  13. }
  14. public String getBname() {
  15. return bname;
  16. }
  17. public void setBname(String bname) {
  18. this.bname = bname;
  19. }
  20. public Float getPrice() {
  21. return price;
  22. }
  23. public void setPrice(Float price) {
  24. this.price = price;
  25. }
  26. @Override
  27. public String toString() {
  28. return "Book{" +
  29. "bid=" + bid +
  30. ", bname='" + bname + '\'' +
  31. ", price=" + price +
  32. '}';
  33. }
  34. public Book(Integer bid, String bname, Float price) {
  35. this.bid = bid;
  36. this.bname = bname;
  37. this.price = price;
  38. }
  39. public Book() {
  40. }
  41. }

接口类及接口实现类

  1. package com.yx.biz;
  2. import com.yx.model.Book;
  3. /**
  4. * @author 君易--鑨
  5. * @site www.yangxin.com
  6. * @company 木易
  7. * @create  2023-08-25 16:26
  8. */
  9. public interface BookBiz {
  10. int deleteByPrimaryKey(Integer bid);
  11. int insert(Book record);
  12. int insertSelective(Book record);
  13. Book selectByPrimaryKey(Integer bid);
  14. int updateByPrimaryKeySelective(Book record);
  15. int updateByPrimaryKey(Book record);
  16. }
  17. //========================以上是接口类的代码==================================
  18. //========================以下是接口类实现的代码==============================
  19. package com.yx.biz.impl;
  20. import com.yx.biz.BookBiz;
  21. import com.yx.mapper.BookMapper;
  22. import com.yx.model.Book;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.stereotype.Service;
  25. /**
  26. * @author 君易--鑨
  27. * @site www.yangxin.com
  28. * @company 木易
  29. * @create  2023-08-25 16:27
  30. */
  31. @Service
  32. public class BookBizImpl implements BookBiz {
  33. // @Autowired==>相当于提供了set、get方法
  34. @Autowired
  35. private BookMapper bookMapper;//封装BookMapper类
  36. @Override
  37. public int deleteByPrimaryKey(Integer bid) {
  38. return bookMapper.deleteByPrimaryKey(bid);
  39. }
  40. @Override
  41. public int insert(Book record) {
  42. return bookMapper.insert(record);
  43. }
  44. @Override
  45. public int insertSelective(Book record) {
  46. return bookMapper.insertSelective(record);
  47. }
  48. @Override
  49. public Book selectByPrimaryKey(Integer bid) {
  50. return bookMapper.selectByPrimaryKey(bid);
  51. }
  52. @Override
  53. public int updateByPrimaryKeySelective(Book record) {
  54. return bookMapper.updateByPrimaryKeySelective(record);
  55. }
  56. @Override
  57. public int updateByPrimaryKey(Book record) {
  58. return bookMapper.updateByPrimaryKey(record);
  59. }
  60. }

 方法测试类(BookBizImplTest)

  1. package com.yx.biz.impl;
  2. import com.yx.biz.BookBiz;
  3. import org.junit.Test;
  4. import org.junit.runner.RunWith;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.test.context.ContextConfiguration;
  7. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  8. /**
  9. * @author 君易--鑨
  10. * @site www.yangxin.com
  11. * @company 木易
  12. * @create  2023-08-25 16:34
  13. * 测试类
  14. *
  15. */
  16. @RunWith(SpringJUnit4ClassRunner.class)
  17. @ContextConfiguration(locations={"classpath:spring-context.xml"})
  18. public class BookBizImplTest {
  19. @Autowired
  20. private BookBiz bookBiz;//封装接口类
  21. @org.junit.Before
  22. public void setUp() throws Exception {
  23. }
  24. @org.junit.After
  25. public void tearDown() throws Exception {
  26. }
  27. @Test
  28. public void deleteByPrimaryKey() {
  29. this.bookBiz.deleteByPrimaryKey(24);
  30. }
  31. @Test
  32. public void insert() {
  33. }
  34. @Test
  35. public void insertSelective() {
  36. }
  37. @Test
  38. public void selectByPrimaryKey() {
  39. System.out.println(this.bookBiz.selectByPrimaryKey(24));
  40. }
  41. @Test
  42. public void updateByPrimaryKeySelective() {
  43. }
  44. @Test
  45. public void updateByPrimaryKey() {
  46. }
  47. }

测试方法以测试查询方法和删除方法为例

查询方法的输出结果

 删除方法的输出结果

 删除方法数据库显示结果

 三、Aop整合pageHelper分页插件

1. BookMapper.xml编写分页方法

  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.yx.mapper.BookMapper" >
  4. <resultMap id="BaseResultMap" type="com.yx.model.Book" >
  5. <constructor >
  6. <idArg column="bid" jdbcType="INTEGER" javaType="java.lang.Integer" />
  7. <arg column="bname" jdbcType="VARCHAR" javaType="java.lang.String" />
  8. <arg column="price" jdbcType="REAL" javaType="java.lang.Float" />
  9. </constructor>
  10. </resultMap>
  11. <sql id="Base_Column_List" >
  12. bid, bname, price
  13. </sql>
  14. <select id="BookPager" resultType="com.yx.model.Book" parameterType="com.yx.model.Book" >
  15. select
  16. <include refid="Base_Column_List" />
  17. from t_mvc_book
  18. <where>
  19. <if test="bname !=null">
  20. and bname like concat('%',#{bname},'%')
  21. </if>
  22. </where>
  23. </select>
  24. </mapper>

2. BookMapper.java编写方法3.

  1. package com.yx.mapper;
  2. import com.yx.model.Book;
  3. import org.springframework.stereotype.Repository;
  4. import java.util.List;
  5. //@Repository==><bean id="bookMapper" class="com.yx.mapper.BookMapper">配置
  6. @Repository
  7. public interface BookMapper {
  8. List<Book> BookPager(Book book);
  9. }

 3. 接口类及接口实现类代码

  1. package com.yx.biz;
  2. import com.yx.model.Book;
  3. import com.yx.untils.PageBean;
  4. import java.util.List;
  5. /**
  6. * @author 君易--鑨
  7. * @site www.yangxin.com
  8. * @company 木易
  9. * @create  2023-08-25 16:26
  10. */
  11. public interface BookBiz {
  12. List<Book> BookPager(Book book, PageBean pageBean);
  13. }
  14. //===================以上是接口类代码===========================================
  15. //====================以下是接口实现类代码=======================================
  16. package com.yx.biz.impl;
  17. import com.yx.biz.BookBiz;
  18. import com.yx.mapper.BookMapper;
  19. import com.yx.model.Book;
  20. import com.yx.untils.PageBean;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.stereotype.Service;
  23. import java.util.List;
  24. /**
  25. * @author 君易--鑨
  26. * @site www.yangxin.com
  27. * @company 木易
  28. * @create  2023-08-25 16:27
  29. */
  30. @Service
  31. public class BookBizImpl implements BookBiz {
  32. // @Autowired==>相当于提供了set、get方法
  33. @Autowired
  34. private BookMapper bookMapper;//封装BookMapper类
  35. @Override
  36. public List<Book> BookPager(Book book, PageBean pageBean) {
  37. // if (pageBean !=null && pageBean.isPagination())
  38. // PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
  39. // List<Book> lst = bookMapper.BookPager(book);
  40. // if (pageBean !=null && pageBean.isPagination()){
  41. // PageInfo<Book> info = new PageInfo<>(lst);
  42. // pageBean.setTotal((int) info.getTotal());
  43. // }
  44. return bookMapper.BookPager(book);
  45. }
  46. }

 4. 分页工具类

PageBean代码

  1. package com.yx.untils;
  2. import javax.servlet.http.HttpServletRequest;
  3. import java.io.Serializable;
  4. import java.util.Map;
  5. public class PageBean implements Serializable {
  6. private static final long serialVersionUID = 2422581023658455731L;
  7. //页码
  8. private int page=1;
  9. //每页显示记录数
  10. private int rows=10;
  11. //总记录数
  12. private int total=0;
  13. //是否分页
  14. private boolean isPagination=true;
  15. //上一次的请求路径
  16. private String url;
  17. //获取所有的请求参数
  18. private Map<String,String[]> map;
  19. public PageBean() {
  20. super();
  21. }
  22. //设置请求参数
  23. public void setRequest(HttpServletRequest req) {
  24. String page=req.getParameter("page");
  25. String rows=req.getParameter("rows");
  26. String pagination=req.getParameter("pagination");
  27. this.setPage(page);
  28. this.setRows(rows);
  29. this.setPagination(pagination);
  30. this.url=req.getContextPath()+req.getServletPath();
  31. this.map=req.getParameterMap();
  32. }
  33. public String getUrl() {
  34. return url;
  35. }
  36. public void setUrl(String url) {
  37. this.url = url;
  38. }
  39. public Map<String, String[]> getMap() {
  40. return map;
  41. }
  42. public void setMap(Map<String, String[]> map) {
  43. this.map = map;
  44. }
  45. public int getPage() {
  46. return page;
  47. }
  48. public void setPage(int page) {
  49. this.page = page;
  50. }
  51. public void setPage(String page) {
  52. if(null!=page&&!"".equals(page.trim()))
  53. this.page = Integer.parseInt(page);
  54. }
  55. public int getRows() {
  56. return rows;
  57. }
  58. public void setRows(int rows) {
  59. this.rows = rows;
  60. }
  61. public void setRows(String rows) {
  62. if(null!=rows&&!"".equals(rows.trim()))
  63. this.rows = Integer.parseInt(rows);
  64. }
  65. public int getTotal() {
  66. return total;
  67. }
  68. public void setTotal(int total) {
  69. this.total = total;
  70. }
  71. public void setTotal(String total) {
  72. this.total = Integer.parseInt(total);
  73. }
  74. public boolean isPagination() {
  75. return isPagination;
  76. }
  77. public void setPagination(boolean isPagination) {
  78. this.isPagination = isPagination;
  79. }
  80. public void setPagination(String isPagination) {
  81. if(null!=isPagination&&!"".equals(isPagination.trim()))
  82. this.isPagination = Boolean.parseBoolean(isPagination);
  83. }
  84. /**
  85. * 获取分页起始标记位置
  86. * @return
  87. */
  88. public int getStartIndex() {
  89. //(当前页码-1)*显示记录数
  90. return (this.getPage()-1)*this.rows;
  91. }
  92. /**
  93. * 末页
  94. * @return
  95. */
  96. public int getMaxPage() {
  97. int totalpage=this.total/this.rows;
  98. if(this.total%this.rows!=0)
  99. totalpage++;
  100. return totalpage;
  101. }
  102. /**
  103. * 下一页
  104. * @return
  105. */
  106. public int getNextPage() {
  107. int nextPage=this.page+1;
  108. if(this.page>=this.getMaxPage())
  109. nextPage=this.getMaxPage();
  110. return nextPage;
  111. }
  112. /**
  113. * 上一页
  114. * @return
  115. */
  116. public int getPreivousPage() {
  117. int previousPage=this.page-1;
  118. if(previousPage<1)
  119. previousPage=1;
  120. return previousPage;
  121. }
  122. @Override
  123. public String toString() {
  124. return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination
  125. + "]";
  126. }
  127. }

5. 编写切片类

PageAspect类代码
  1. package com.yx.aspect;
  2. import com.github.pagehelper.PageHelper;
  3. import com.github.pagehelper.PageInfo;
  4. import com.yx.untils.PageBean;
  5. import org.aspectj.lang.ProceedingJoinPoint;
  6. import org.aspectj.lang.annotation.Around;
  7. import org.aspectj.lang.annotation.Aspect;
  8. import org.springframework.stereotype.Component;
  9. import java.util.List;
  10. /**
  11. * @author 君易--鑨
  12. * @site www.yangxin.com
  13. * @company 木易
  14. * @create  2023-08-25 20:00
  15. */
  16. @Aspect//代表当前类为切片类
  17. @Component//代表当前类交给Spring进行管理 该注解是@Service的父类
  18. public class PageAspect {
  19. /*
  20. * *..*Service.*Pager(..))
  21. * *:代表返回值类型
  22. * *..:任意包,不限层级
  23. * *Service:以Service结尾的类/或者接口
  24. * *Pager:以Pager结尾的方法
  25. * 符合上述条件,即为目标类或者目标方法
  26. */
  27. @Around("execution(* *..*Biz.*Pager(..))")
  28. public Object invoke(ProceedingJoinPoint args) throws Throwable {
  29. // 实例化分页工具类
  30. PageBean pageBean=null;
  31. // 获取所有参数
  32. Object[] ags = args.getArgs();
  33. // 遍历
  34. for (Object param : ags) {
  35. if (param instanceof PageBean){
  36. pageBean= (PageBean) param;
  37. break;//中断
  38. }
  39. }
  40. if (pageBean !=null && pageBean.isPagination())
  41. PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
  42. // 执行目标方法a
  43. Object lst = args.proceed();
  44. if (pageBean !=null && pageBean.isPagination()){
  45. PageInfo info = new PageInfo((List) lst);
  46. pageBean.setTotal((int) info.getTotal());
  47. }
  48. return lst;
  49. }
  50. }

(1)注:* *..*Biz.*Pager(..)中的理解:

  •      *:代表返回值类型
  •     *..:任意包,不限层级
  •    *Service:以Service结尾的类/或者接口
  • *Pager:以Pager结尾的方法

  符合上述条件,即为目标类或者目标方法

(2)注:* *..*Biz.*Pager(..)中如果不注意大小写运行就会查询所有而不是分页查询(如下图)

  

 6.测试类代码

BookBizImplTest 代码

  1. package com.yx.biz.impl;
  2. import com.yx.biz.BookBiz;
  3. import com.yx.model.Book;
  4. import com.yx.untils.PageBean;
  5. import org.junit.Test;
  6. import org.junit.runner.RunWith;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.test.context.ContextConfiguration;
  9. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  10. /**
  11. * @author 君易--鑨
  12. * @site www.yangxin.com
  13. * @company 木易
  14. * @create  2023-08-25 16:34
  15. * 测试类
  16. *
  17. */
  18. @RunWith(SpringJUnit4ClassRunner.class)
  19. @ContextConfiguration(locations={"classpath:spring-context.xml"})
  20. public class BookBizImplTest {
  21. @Autowired
  22. private BookBiz bookBiz;//封装接口类
  23. @org.junit.Before
  24. public void setUp() throws Exception {
  25. }
  26. @org.junit.After
  27. public void tearDown() throws Exception {
  28. }
  29. @Test
  30. public void bookPager() {
  31. Book book=new Book();
  32. book.setBname("圣墟");
  33. PageBean pageBean=new PageBean();
  34. pageBean.setPage(2);
  35. pageBean.setRows(15);
  36. this.bookBiz.BookPager(book,pageBean).forEach(System.out::println);
  37. }
  38. }

 运行结果

 

 我的分享到这里就结束了,感兴趣的老铁点赞加关注,后续我会继续与老铁们分享 

一波三连,拜托拜托

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号