• MyBatis与Spring的集成


    目录

    一、mybatis与spring集成

            1.1 IDEA中创建Maven项目

    1.2 集成mybatis&&spring(ssm整合)

            1.2.2 建立配置文件

            1.2.3 逆向自动生成代码

     二、aop整合分页插件PageHelper

    上诉配置要生效,

    代理注释一定要打开:


    一、mybatis与spring集成

            1.1 IDEA中创建Maven项目

                    1.1.1 右键New一个module ---> 选择Maven

                    

    1.1.2 选择自己自己的jdk版本 ---> 勾选Create from archetype --->

    英文输入法输入webapp 找到:org.apache.maven.archetypes:maven-archetype-webapp

    1.1.3 设置要建立的项目名 ---> 建立项目的位置 ---> Next

    1.1.4 

    1、选择自己Maven的安装目录,记得要选择bin目录的上一层;

    2、勾选Override,如果settings.xml的安装目录不是实际上自己的settings.xml安装目录的话,

    那就手动定位选择一下;

    3、点击 + 号添加一个配置,依次填入:archetypeCatalog && internal

    4、Finish

    1.1.5 直到出现BUILD SUCCESS,就代表你的Maven项目创建成功啦! 

            小笔记:idea右侧点击Maven,出现的一列命令。

                    test命令:

    test命令:

                    ① 用来检测当前项目所有相关pom依赖是否下载成功;

                    ② 用来检测当前项目所有pom依赖是否有版本冲突;

            maven clean命令:

            清除这个依赖: 

     clean命令:

                    ① 清除本地(idea)pom依赖

    一般先执行clean,再执行test命令。 


    1.2 集成mybatis&&spring(ssm整合)

            集成步骤:

            1.2.1 导入pom依赖

                    

    1 添加spring相关依赖(5.0.2.RELEASE)

    2 添加mybatis相关依赖

    3 spring整合mybatis(1.3.1)

    4 添加dbcp2连接池

    5 添加日志配置(2.9.1)

     pom依赖文件:

    1. <properties>
    2. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    3. <maven.compiler.source>1.8maven.compiler.source>
    4. <maven.compiler.target>1.8maven.compiler.target>
    5. <maven.compiler.plugin.version>3.7.0maven.compiler.plugin.version>
    6. <spring.version>5.0.2.RELEASEspring.version>
    7. <mybatis.version>3.4.5mybatis.version>
    8. <mysql.version>5.1.44mysql.version>
    9. <pagehelper.version>5.1.2pagehelper.version>
    10. <mybatis.spring.version>1.3.1mybatis.spring.version>
    11. <commons.dbcp2.version>2.1.1commons.dbcp2.version>
    12. <commons.pool2.version>2.4.3commons.pool2.version>
    13. <log4j2.version>2.9.1log4j2.version>
    14. <junit.version>4.12junit.version>
    15. <servlet.version>4.0.0servlet.version>
    16. <lombok.version>1.18.2lombok.version>
    17. properties>
    18. <dependencies>
    19. <dependency>
    20. <groupId>org.springframeworkgroupId>
    21. <artifactId>spring-contextartifactId>
    22. <version>${spring.version}version>
    23. dependency>
    24. <dependency>
    25. <groupId>org.springframeworkgroupId>
    26. <artifactId>spring-ormartifactId>
    27. <version>${spring.version}version>
    28. dependency>
    29. <dependency>
    30. <groupId>org.springframeworkgroupId>
    31. <artifactId>spring-txartifactId>
    32. <version>${spring.version}version>
    33. dependency>
    34. <dependency>
    35. <groupId>org.springframeworkgroupId>
    36. <artifactId>spring-aspectsartifactId>
    37. <version>${spring.version}version>
    38. dependency>
    39. <dependency>
    40. <groupId>org.springframeworkgroupId>
    41. <artifactId>spring-webartifactId>
    42. <version>${spring.version}version>
    43. dependency>
    44. <dependency>
    45. <groupId>org.springframeworkgroupId>
    46. <artifactId>spring-testartifactId>
    47. <version>${spring.version}version>
    48. dependency>
    49. <dependency>
    50. <groupId>org.mybatisgroupId>
    51. <artifactId>mybatisartifactId>
    52. <version>${mybatis.version}version>
    53. dependency>
    54. <dependency>
    55. <groupId>mysqlgroupId>
    56. <artifactId>mysql-connector-javaartifactId>
    57. <version>${mysql.version}version>
    58. dependency>
    59. <dependency>
    60. <groupId>com.github.pagehelpergroupId>
    61. <artifactId>pagehelperartifactId>
    62. <version>${pagehelper.version}version>
    63. dependency>
    64. <dependency>
    65. <groupId>org.mybatisgroupId>
    66. <artifactId>mybatis-springartifactId>
    67. <version>${mybatis.spring.version}version>
    68. dependency>
    69. <dependency>
    70. <groupId>org.apache.commonsgroupId>
    71. <artifactId>commons-dbcp2artifactId>
    72. <version>${commons.dbcp2.version}version>
    73. dependency>
    74. <dependency>
    75. <groupId>org.apache.commonsgroupId>
    76. <artifactId>commons-pool2artifactId>
    77. <version>${commons.pool2.version}version>
    78. dependency>
    79. <dependency>
    80. <groupId>org.apache.logging.log4jgroupId>
    81. <artifactId>log4j-coreartifactId>
    82. <version>${log4j2.version}version>
    83. dependency>
    84. <dependency>
    85. <groupId>org.apache.logging.log4jgroupId>
    86. <artifactId>log4j-apiartifactId>
    87. <version>${log4j2.version}version>
    88. dependency>
    89. <dependency>
    90. <groupId>org.apache.logging.log4jgroupId>
    91. <artifactId>log4j-webartifactId>
    92. <version>${log4j2.version}version>
    93. dependency>
    94. <dependency>
    95. <groupId>junitgroupId>
    96. <artifactId>junitartifactId>
    97. <version>${junit.version}version>
    98. <scope>testscope>
    99. dependency>
    100. <dependency>
    101. <groupId>javax.servletgroupId>
    102. <artifactId>javax.servlet-apiartifactId>
    103. <version>${servlet.version}version>
    104. <scope>providedscope>
    105. dependency>
    106. <dependency>
    107. <groupId>org.projectlombokgroupId>
    108. <artifactId>lombokartifactId>
    109. <version>${lombok.version}version>
    110. <scope>providedscope>
    111. dependency>
    112. dependencies>
    113. <resources>
    114. <resource>
    115. <directory>src/main/javadirectory>
    116. <includes>
    117. <include>**/*.xmlinclude>
    118. includes>
    119. resource>
    120. <resource>
    121. <directory>src/main/resourcesdirectory>
    122. <includes>
    123. <include>jdbc.propertiesinclude>
    124. <include>*.xmlinclude>
    125. includes>
    126. resource>
    127. resources>
    128. <plugin>
    129. <groupId>org.apache.maven.pluginsgroupId>
    130. <artifactId>maven-compiler-pluginartifactId>
    131. <version>${maven.compiler.plugin.version}version>
    132. <configuration>
    133. <source>${maven.compiler.source}source>
    134. <target>${maven.compiler.target}target>
    135. <encoding>${project.build.sourceEncoding}encoding>
    136. configuration>
    137. plugin>
    138. <plugin>
    139. <groupId>org.mybatis.generatorgroupId>
    140. <artifactId>mybatis-generator-maven-pluginartifactId>
    141. <version>1.3.2version>
    142. <dependencies>
    143. <dependency>
    144. <groupId>mysqlgroupId>
    145. <artifactId>mysql-connector-javaartifactId>
    146. <version>${mysql.version}version>
    147. dependency>
    148. dependencies>
    149. <configuration>
    150. <overwrite>trueoverwrite>
    151. configuration>
    152. plugin>

            1.2.2 建立配置文件

             数据库连接配置文件:jdbc.properties:

    1. jdbc.driver=com.mysql.jdbc.Driver
    2. jdbc.url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8
    3. jdbc.username=用户名
    4. jdbc.password=密码

             逆向生成代码插件配置文件:generatorConfig.xml

    1. generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    2. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
    3. <generatorConfiguration>
    4. <properties resource="jdbc.properties"/>
    5. <classPathEntry location="E:\\AnZhuangBao\\Maven\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
    6. <context id="infoGuardian">
    7. <commentGenerator>
    8. <property name="suppressAllComments" value="true"/>
    9. <property name="suppressDate" value="true"/>
    10. commentGenerator>
    11. <jdbcConnection driverClass="${jdbc.driver}"
    12. connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
    13. <javaTypeResolver>
    14. <property name="forceBigDecimals" value="false"/>
    15. javaTypeResolver>
    16. <javaModelGenerator targetPackage="com.leaf.model"
    17. targetProject="src/main/java">
    18. <property name="enableSubPackages" value="false"/>
    19. <property name="constructorBased" value="true"/>
    20. <property name="trimStrings" value="false"/>
    21. <property name="immutable" value="false"/>
    22. javaModelGenerator>
    23. <sqlMapGenerator targetPackage="com.leaf.mapper"
    24. targetProject="src/main/java">
    25. <property name="enableSubPackages" value="false"/>
    26. sqlMapGenerator>
    27. <javaClientGenerator targetPackage="com.leaf.mapper"
    28. targetProject="src/main/java" type="XMLMAPPER">
    29. <property name="enableSubPackages" value="false"/>
    30. javaClientGenerator>
    31. <table schema="" tableName="t_mvc_Book" domainObjectName="Book"
    32. enableCountByExample="false" enableDeleteByExample="false"
    33. enableSelectByExample="false" enableUpdateByExample="false">
    34. table>
    35. <table schema="" tableName="t_oa_permission" domainObjectName="Permission"
    36. enableCountByExample="false" enableDeleteByExample="false"
    37. enableSelectByExample="false" enableUpdateByExample="false">
    38. table>
    39. context>
    40. generatorConfiguration>

        log4j2.xml:

    1. <Configuration status="WARN" monitorInterval="30">
    2. <Properties>
    3. <Property name="LOG_HOME">/root/workspace/lucenedemo/logsProperty>
    4. <property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/errorproperty>
    5. <property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warnproperty>
    6. <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%nproperty>
    7. Properties>
    8. <Appenders>
    9. <Console name="Console" target="SYSTEM_OUT">
    10. <ThresholdFilter level="trace" onMatch="ACCEPT"
    11. onMismatch="DENY" />
    12. <PatternLayout pattern="${PATTERN}" />
    13. Console>
    14. <File name="log" fileName="logs/test.log" append="false">
    15. <PatternLayout
    16. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    17. File>
    18. <RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
    19. filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
    20. <ThresholdFilter level="info" onMatch="ACCEPT"
    21. onMismatch="DENY" />
    22. <PatternLayout
    23. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    24. <Policies>
    25. <TimeBasedTriggeringPolicy interval="1"
    26. modulate="true" />
    27. Policies>
    28. RollingFile>
    29. <RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log"
    30. filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
    31. <ThresholdFilter level="warn" onMatch="ACCEPT"
    32. onMismatch="DENY" />
    33. <PatternLayout
    34. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    35. <Policies>
    36. <TimeBasedTriggeringPolicy />
    37. <SizeBasedTriggeringPolicy size="2 kB" />
    38. Policies>
    39. <DefaultRolloverStrategy max="20" />
    40. RollingFile>
    41. <RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log"
    42. filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log">
    43. <ThresholdFilter level="error" onMatch="ACCEPT"
    44. onMismatch="DENY" />
    45. <PatternLayout
    46. pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
    47. <Policies>
    48. <TimeBasedTriggeringPolicy interval="1"
    49. modulate="true" />
    50. Policies>
    51. RollingFile>
    52. Appenders>
    53. <Loggers>
    54. <logger name="org.springframework" level="INFO">logger>
    55. <logger name="org.mybatis" level="INFO">logger>
    56. <logger name="org.springframework" level="ERROR" />
    57. <logger name="org.hibernate" level="ERROR" />
    58. <logger name="org.apache.struts2" level="ERROR" />
    59. <logger name="com.opensymphony.xwork2" level="ERROR" />
    60. <logger name="org.jboss" level="ERROR" />
    61. <root level="all">
    62. <appender-ref ref="Console" />
    63. <appender-ref ref="RollingFileInfo" />
    64. <appender-ref ref="RollingFileWarn" />
    65. <appender-ref ref="RollingFileError" />
    66. root>
    67. Loggers>
    68. Configuration>

     mybatis的配置文件:mybatis.cfg.xml

    1. configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    2. <configuration>
    3. <properties resource="jdbc.properties"/>
    4. <settings>
    5. <setting name="logImpl" value="LOG4J2"/>
    6. settings>
    7. <typeAliases>
    8. typeAliases>
    9. <plugins>
    10. <plugin interceptor="com.github.pagehelper.PageInterceptor">
    11. plugin>
    12. plugins>
    13. <environments default="development">
    14. <environment id="development">
    15. <transactionManager type="jdbc"/>
    16. <dataSource type="POOLED">
    17. <property name="driver"
    18. value="${jdbc.driver}"/>
    19. <property name="url"
    20. value="${jdbc.url}"/>
    21. <property name="username" value="${jdbc.username}"/>
    22. <property name="password" value="${jdbc.password}"/>
    23. dataSource>
    24. environment>
    25. environments>
    26. <mappers>
    27. <mapper resource="com/leaf/mapper/BookMapper.xml"/>
    28. mappers>
    29. configuration>

            1.2.3 逆向自动生成代码

                    导入以上的配置文件后就可以测试生成代码了:

    这里是直接修改添加好的命令执行的项目,具体新建命令的方式可以参考我的文章:MyBatis环境搭建&&测试增删改查__Leaf1217的博客-CSDN博客 

     

    然后建立一些测试类,

    自行测试没有问题后就代表一个拥有mybatis功能的maven项目就建立好了。 

            1.2.4 添加并配置整合的配置文件

                    1.2.4.1 扫描注解驱动

                    1.2.4.2 添加并管理数据源 -> 管理sqlsession

                    1.2.4.3 扫描所有的Mapper接口

                    1.2.4.4 添加事务管理

    编写配置文件:applicationContext-mybatis.xml

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    4. xmlns:aop="http://www.springframework.org/schema/aop"
    5. 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">
    6. <context:annotation-config/>
    7. <context:component-scan base-package="com.leaf.ssm"/>
    8. <context:property-placeholder location="classpath:jdbc.properties"/>
    9. <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    10. destroy-method="close">
    11. <property name="driverClassName" value="${jdbc.driver}"/>
    12. <property name="url" value="${jdbc.url}"/>
    13. <property name="username" value="${jdbc.username}"/>
    14. <property name="password" value="${jdbc.password}"/>
    15. <property name="initialSize" value="10"/>
    16. <property name="maxTotal" value="100"/>
    17. <property name="maxIdle" value="50"/>
    18. <property name="minIdle" value="10"/>
    19. <property name="maxWaitMillis" value="-1"/>
    20. bean>
    21. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    22. <property name="dataSource" ref="dataSource"/>
    23. <property name="mapperLocations" value="classpath*:com/leaf/ssm/**/mapper/*.xml"/>
    24. <property name="typeAliasesPackage" value="com/leaf/ssm/**/model"/>
    25. <property name="plugins">
    26. <array>
    27. <bean class="com.github.pagehelper.PageInterceptor">
    28. <property name="properties">
    29. <value>
    30. helperDialect=mysql
    31. value>
    32. property>
    33. bean>
    34. array>
    35. property>
    36. bean>
    37. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    38. <property name="basePackage" value="com/leaf/ssm/**/mapper"/>
    39. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    40. bean>
    41. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    42. <property name="dataSource" ref="dataSource" />
    43. bean>
    44. <tx:annotation-driven transaction-manager="transactionManager" />
    45. <aop:aspectj-autoproxy/>
    46. beans>

    使用注解式开发

       @Repository:将DAO类声明为Bean

       @Service:通常作用在业务层

       @Constroller:通常作用在控制层,将在Spring MVC中使用

       @Component:是一个泛化的概念,仅仅表示spring中的一个组件(Bean),可以作用在任何层次

       @Scope:模式声明(singleton|prototype)

       @Autowired:将自动在代码上下文与其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方

    然后我们就可以把BookBizImpl实现类里面添加两个注解,相当于省略了set、get方法。

    1. package com.leaf.ssm.biz.impl;
    2. import com.github.pagehelper.PageHelper;
    3. import com.github.pagehelper.PageInfo;
    4. import com.leaf.ssm.biz.BookBiz;
    5. import com.leaf.ssm.mapper.BookMapper;
    6. import com.leaf.ssm.model.Book;
    7. import com.leaf.ssm.model.BookVo;
    8. import com.leaf.ssm.entity.PageBean;
    9. import org.springframework.beans.factory.annotation.Autowired;
    10. import org.springframework.stereotype.Service;
    11. import java.util.List;
    12. import java.util.Map;
    13. /**
    14. * @author Leaf
    15. * @site 2977819715
    16. * @company 玉渊工作室
    17. * @create  2022-08-11 2:21
    18. */
    19. @Service
    20. public class BookBizImpl implements BookBiz {
    21. @Autowired
    22. private BookMapper bookMapper;
    23. //Alt+Enter 快速构建实现类,填充代码的前半部分 Ctrl+1
    24. //Alt+Insert 快速提供set/get/toString/构造方法
    25. /* public BookMapper getBookMapper() {
    26. return bookMapper;
    27. }
    28. public void setBookMapper(BookMapper bookMapper) {
    29. this.bookMapper = bookMapper;
    30. }*/
    31. @Override
    32. public int deleteByPrimaryKey(Integer bid) {
    33. return bookMapper.deleteByPrimaryKey(bid);
    34. }
    35. @Override
    36. public Book selectByPrimaryKey(Integer bid) {
    37. return bookMapper.selectByPrimaryKey(bid);
    38. }
    39. @Override
    40. public List selectByIn(List bidIds) {
    41. return bookMapper.selectByIn(bidIds);
    42. }
    43. @Override
    44. public List selectBooksLike1(String bname) {
    45. return bookMapper.selectBooksLike1(bname);
    46. }
    47. @Override
    48. public List selectBooksLike2(String bname) {
    49. return bookMapper.selectBooksLike2(bname);
    50. }
    51. @Override
    52. public List selectBooksLike3(String bname) {
    53. return bookMapper.selectBooksLike3(bname);
    54. }
    55. @Override
    56. public List list1() {
    57. return bookMapper.list1();
    58. }
    59. @Override
    60. public List list2() {
    61. return bookMapper.list2();
    62. }
    63. @Override
    64. public List list3(BookVo vo) {
    65. return bookMapper.list3(vo);
    66. }
    67. @Override
    68. public List list4() {
    69. return bookMapper.list4();
    70. }
    71. @Override
    72. public Map list5(Map map) {
    73. return bookMapper.list5(map);
    74. }
    75. @Override
    76. public List listPager(Map map, PageBean pageBean) {
    77. //pageHelper分页插件相关代码
    78. if(pageBean != null && pageBean.isPagination()){
    79. PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
    80. }
    81. List maps=bookMapper.listPager(map,pageBean);
    82. if(pageBean != null && pageBean.isPagination()){
    83. //处理查询结果的前提,是需要分页的
    84. PageInfo info=new PageInfo(maps);
    85. pageBean.setTotal(info.getTotal()+"");
    86. }
    87. return maps;
    88. }
    89. @Override
    90. public List list6(BookVo vo) {
    91. return bookMapper.list6(vo);
    92. }
    93. @Override
    94. public List list7(BookVo vo) {
    95. return bookMapper.list7(vo);
    96. }
    97. }

    管理数据源 -> 管理sqlsession

    我们还要给BookMapper.java添加一个标记

     然后在测试类里面添加:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations={"classpath:applicationContext-mybatis.xml"})
    1. package com.leaf.ssm.imp;
    2. import com.leaf.ssm.biz.BookBiz;
    3. import com.leaf.ssm.biz.impl.BookBizImpl;
    4. import com.leaf.ssm.entity.PageBean;
    5. import com.leaf.ssm.mapper.BookMapper;
    6. import com.leaf.ssm.model.BookVo;
    7. import com.leaf.ssm.util.SessionUtil;
    8. import org.apache.ibatis.session.SqlSession;
    9. import org.junit.After;
    10. import org.junit.Before;
    11. import org.junit.Test;
    12. import org.junit.runner.RunWith;
    13. import org.springframework.beans.factory.annotation.Autowired;
    14. import org.springframework.test.context.ContextConfiguration;
    15. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    16. import java.util.Arrays;
    17. import java.util.HashMap;
    18. import java.util.List;
    19. import java.util.Map;
    20. /**
    21. * @author Leaf
    22. * @site 2977819715
    23. * @company 玉渊工作室
    24. * @create  2022-08-11 2:29
    25. */
    26. @RunWith(SpringJUnit4ClassRunner.class)
    27. @ContextConfiguration(locations={"classpath:applicationContext-mybatis.xml"})
    28. public class BookBizImplTest {
    29. @Autowired
    30. private BookBiz bookBiz;
    31. //private SqlSession sqlSession;
    32. @Before
    33. public void setUp() throws Exception {
    34. System.out.println("初始化方法...");
    35. // BookBizImpl bookBiz = new BookBizImpl();
    36. // //工具类中获取session对象
    37. // sqlSession = SessionUtil.openSession();
    38. // //从session对象中获取mapper对象
    39. // BookMapper mapper = sqlSession.getMapper(BookMapper.class);
    40. // //bookBiz.setBookMapper(mapper);
    41. // this.bookBiz = bookBiz;
    42. }
    43. @After
    44. public void tearDown() throws Exception {
    45. System.out.println("方法测试结束...");
    46. /* sqlSession.commit();
    47. sqlSession.close();*/
    48. }
    49. @Test
    50. public void deleteByPrimaryKey() {
    51. bookBiz.deleteByPrimaryKey(44);
    52. }
    53. @Test
    54. public void selectByPrimaryKey() {
    55. System.out.println("测试的业务方法...");
    56. System.out.println(bookBiz.selectByPrimaryKey(45));
    57. }
    58. @Test
    59. public void test() {
    60. int[] ints = {1,2,3,4,5,6};
    61. //将数组变成字符串 1,2,3,4,5,6
    62. StringBuffer sb = new StringBuffer();
    63. for (int i:ints){
    64. sb.append(",").append(i);
    65. }
    66. String s = sb.toString();
    67. System.out.println(s.substring(1));
    68. }
    69. @Test
    70. public void getBookMapper() {
    71. }
    72. @Test
    73. public void setBookMapper() {
    74. }
    75. @Test
    76. public void selectByIn() {
    77. List<Integer> bookIds = Arrays.asList(new Integer[]{31, 32, 33, 34});
    78. bookBiz.selectByIn(bookIds).forEach(System.out::println);
    79. }
    80. @Test
    81. public void selectBooksLike1() {
    82. bookBiz.selectBooksLike1("%圣墟%").forEach(System.out::println);
    83. }
    84. @Test
    85. public void selectBooksLike2() {
    86. bookBiz.selectBooksLike2("%圣墟%").forEach(System.out::println);
    87. }
    88. @Test
    89. public void selectBooksLike3() {
    90. bookBiz.selectBooksLike3("圣墟").forEach(System.out::println);
    91. }
    92. @Test
    93. public void list1() {
    94. bookBiz.list1().forEach(System.out::println);
    95. }
    96. @Test
    97. public void list2() {
    98. bookBiz.list2().forEach(System.out::println);
    99. }
    100. @Test
    101. public void list3() {
    102. BookVo vo=new BookVo();
    103. vo.setBookIds(Arrays.asList(new Integer[]{31,32,33,34}));
    104. bookBiz.list3(vo).forEach(System.out::println);
    105. }
    106. @Test
    107. public void list4() {
    108. bookBiz.list4().forEach(System.out::println);
    109. }
    110. @Test
    111. public void list5() {
    112. Map map=new HashMap();
    113. map.put("bid",32);
    114. System.out.println(bookBiz.list5(map));
    115. }
    116. @Test
    117. public void listPager() {
    118. Map map=new HashMap();
    119. map.put("bname","圣墟");
    120. bookBiz.listPager(map,null).forEach(System.out::println);
    121. //查询出第二页的20条数据
    122. PageBean pageBean=new PageBean();
    123. pageBean.setPage(2);
    124. pageBean.setRows(20);
    125. bookBiz.listPager(map,null).forEach(System.out::println);
    126. }
    127. @Test
    128. public void list6() {
    129. BookVo vo=new BookVo();
    130. vo.setMax(45);
    131. vo.setMin(35);
    132. bookBiz.list6(vo).forEach(System.out::println);
    133. }
    134. @Test
    135. public void list7() {
    136. BookVo vo=new BookVo();
    137. vo.setMax(45);
    138. vo.setMin(35);
    139. bookBiz.list7(vo).forEach(System.out::println);
    140. }
    141. }

    然后我们呢测试查询到了:


     二、aop整合分页插件PageHelper

    2.1 为什么要整合,解决什么问题?

    1. @Override
    2. public List listPager(Map map, PageBean pageBean) {
    3. //pageHelper分页插件相关代码
    4. if(pageBean != null && pageBean.isPagination()){
    5. PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
    6. }
    7. List maps=bookMapper.listPager(map,pageBean);
    8. if(pageBean != null && pageBean.isPagination()){
    9. //处理查询结果的前提,是需要分页的
    10. PageInfo info=new PageInfo(maps);
    11. pageBean.setTotal(info.getTotal()+"");
    12. }
    13. return maps;
    14. }

    可以使用AOP编程解决分页代码重复的问题,省掉重复的代码。

    根据Spring aop所学,我们可以利用环绕通知来解决;

    1、找到目标对象 -> *Biz.*Pager

    2、写通知

            2.1 目标对象该方法一定携带了PageBean对象

    注解:@aspect:相当于配置了环绕通知

               @component:交给Spring进行管理

               @excution

    建立一个切面类:PageAspect

    1. package com.leaf.ssm.aspect;
    2. import com.github.pagehelper.PageHelper;
    3. import com.github.pagehelper.PageInfo;
    4. import com.leaf.ssm.entity.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 Leaf
    12. * @site 2977819715
    13. * @company 玉渊工作室
    14. * @create  2022-08-15 6:43
    15. */
    16. @Component
    17. @Aspect
    18. public class PageAspect {
    19. /**
    20. * *:返回值
    21. * *..:无限包
    22. * *Service:以Service结尾的接口名
    23. * .Pager:以Pager方法
    24. * 只要同时匹配上诉四个条件,就会被列为目标对象
    25. * 上诉配置要生效,代理注释一定要打开:
    26. * @param args
    27. * @return
    28. * @throws Throwable
    29. */
    30. @Around("execution(* *..*Biz.*Pager(..))")
    31. public Object invoke(ProceedingJoinPoint args) throws Throwable {
    32. Object[] params = args.getArgs();
    33. PageBean pageBean = null;
    34. for (Object param : params) {
    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. Object list = args.proceed(params);
    43. if(null != pageBean && pageBean.isPagination()){
    44. PageInfo pageInfo = new PageInfo((List) list);
    45. pageBean.setTotal(pageInfo.getTotal()+"");
    46. }
    47. return list;
    48. }
    49. }

    @Around:代表这是一个环绕通知

    然后我们测试一下:

    1. @Test
    2. public void listPager() {
    3. Map map=new HashMap();
    4. map.put("bname","圣墟");
    5. //查询出第二页的20条数据
    6. PageBean pageBean=new PageBean();
    7. pageBean.setPage(2);
    8. pageBean.setRows(20);
    9. bookBiz.listPager(map,pageBean).forEach(System.out::println);
    10. }

    上诉配置要生效,

    代理注释一定要打开:

    查询结果:

     


    OK

  • 相关阅读:
    数说故事亮相CPG第八届中国消费品数字科技大会
    值改变事件(SMART PLC梯形图FC)
    Anaconda Prompt中的指令集
    优化改进YOLOv5算法之添加DCNv3模块,有效提升目标检测效果
    工作心得——css让元素居中的方法
    前端学习笔记02
    Pycharm无法完整运行django设计的网页
    从React源码分析看useEffect
    Linux常用命令
    HTML5 Canvas 限定文本区域大小,文字自动换行,自动缩放
  • 原文地址:https://blog.csdn.net/qq_63492318/article/details/126323039