• Mybatis 快速入门之mybatis与spring集成


    目录

    一:基本概念撰述

    1. SqlSessionFactory对象,只有创建了SqlSessionFactory对象,才能调用openSession()方法得到SqlSession对象。

    2. dao接口的代理对象,例如StudentDao接口,需要的代理对象为:SqlSeesion.getMapper(StudentDao.class)。

    3. 数据源DataSource对象,使用一个更强大、功能更多的连接池对象代替mybatis自己的PooledDataSource。

    二:将Mybatis与Spring集成的相关操作步骤

    1:对pom.xml文件添加相关依赖

    2:创建xml文件

    3.通过插件自动生成代码

    4.使用注解式开发开发方式完成开发

     @Repository:将Mapper类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在Mapper层

      @Service:将实现类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在service的实现类上(非接口)

        @Controller:将Controller类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在控制层,将在Spring MVC中使用

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

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

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

     @Resource:

    @Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配

    指定了name或者type则根据指定的类型去匹配bean

    指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

      @Transactional:在方法调用之前开启事务,在方法调用之后提交事务或者回滚事务,可以添加定任意地方

      5.Spring Test+Junit完美组合

    6.   使用AOP编程完成分页


    一:基本概念撰述

              将 MyBatis 与 Spring 进行整合,主要解决的问题就是将SqlSessionFactory 对象交由 Spring 来管理。所以,该整合,只需要将SqlSessionFactory 的对象生成器 SqlSessionFactoryBean 注册在 Spring 容器中,再将其注入给 Dao 的实现类即可完成整合。

               实现 Spring 与 MyBatis 的整合常用的方式:扫描的 Mapper 动态代理Spring 像插线板一样,mybatis 框架是插头,可以容易的组合到一起。插线板 spring 插上 mybatis,两个框架就是一个整体。

                使用mybatis,需要创建mybatis框架中的某些对象,使用这些对象,就可以使用mybatis提供的功能了。

    对于mybatis执行sql语句,需要用到的对象有:

    1. SqlSessionFactory对象,只有创建了SqlSessionFactory对象,才能调用openSession()方法得到SqlSession对象。

    2. dao接口的代理对象,例如StudentDao接口,需要的代理对象为:SqlSeesion.getMapper(StudentDao.class)。

    3. 数据源DataSource对象,使用一个更强大、功能更多的连接池对象代替mybatis自己的PooledDataSource。

    二:将Mybatis与Spring集成的相关操作步骤

    1:对pom.xml文件添加相关依赖

             在Mybatis与Spring集成中所需要添加依赖如下:

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

    • spring-core
    • spring-beans
    • spring-context
    • spring-orm
    • spring-tx
    • spring-aspects
    • spring-web
    1. //Spring版本
    2. <spring.version>5.0.2.RELEASEspring.version>
    1. <dependency>
    2. <groupId>org.springframeworkgroupId>
    3. <artifactId>spring-coreartifactId>
    4. <version>${spring.version}version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.springframeworkgroupId>
    8. <artifactId>spring-beansartifactId>
    9. <version>${spring.version}version>
    10. dependency>
    11. <dependency>
    12. <groupId>org.springframeworkgroupId>
    13. <artifactId>spring-contextartifactId>
    14. <version>${spring.version}version>
    15. dependency>
    16. <dependency>
    17. <groupId>org.springframeworkgroupId>
    18. <artifactId>spring-ormartifactId>
    19. <version>${spring.version}version>
    20. dependency>
    21. <dependency>
    22. <groupId>org.springframeworkgroupId>
    23. <artifactId>spring-txartifactId>
    24. <version>${spring.version}version>
    25. dependency>
    26. <dependency>
    27. <groupId>org.springframeworkgroupId>
    28. <artifactId>spring-aspectsartifactId>
    29. <version>${spring.version}version>
    30. dependency>
    31. <dependency>
    32. <groupId>org.springframeworkgroupId>
    33. <artifactId>spring-webartifactId>
    34. <version>${spring.version}version>
    35. dependency>
    36. <dependency>
    37. <groupId>org.springframeworkgroupId>
    38. <artifactId>spring-testartifactId>
    39. <version>${spring.version}version>
    40. dependency>

           注意:spring 5.0.1.RELEASE有冲突

    ②: 添加mybatis相关依赖

    • mybatis核心:mybatis(3.4.5)
    • Mybatis分页:pagehelper(5.1.2)
    1. <mybatis.version>3.4.5mybatis.version>
    2. <pagehelper.version>5.1.2pagehelper.version>
    1. <dependency>
    2. <groupId>org.mybatisgroupId>
    3. <artifactId>mybatisartifactId>
    4. <version>${mybatis.version}version>
    5. dependency>
    6. <dependency>
    7. <groupId>com.github.pagehelpergroupId>
    8. <artifactId>pagehelperartifactId>
    9. <version>${pagehelper.version}version>
    10. dependency>

        ③:spring整合mybatis(1.3.1)

    •    mybatis-spring
    1. <mybatis.spring.version>1.3.1mybatis.spring.version>
    1. <dependency>
    2. <groupId>org.mybatisgroupId>
    3. <artifactId>mybatis-springartifactId>
    4. <version>${mybatis.spring.version}version>
    5. dependency>

      ④:添加dbcp2连接池

    • commons-dbcp2(2.1.1)
    •  commons-pool2(2.4.3)
    1. <commons.dbcp2.version>2.1.1commons.dbcp2.version>
    2. <commons.pool2.version>2.4.3commons.pool2.version>
    1. <dependency>
    2. <groupId>org.apache.commonsgroupId>
    3. <artifactId>commons-dbcp2artifactId>
    4. <version>${commons.dbcp2.version}version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.apache.commonsgroupId>
    8. <artifactId>commons-pool2artifactId>
    9. <version>${commons.pool2.version}version>
    10. dependency>

    ⑤:添加日志配置(2.9.1)

    • log4j-core
    • log4j-api
    • log4j-web
    1. <log4j2.version>2.9.1log4j2.version>
    1. <dependency>
    2. <groupId>org.apache.logging.log4jgroupId>
    3. <artifactId>log4j-coreartifactId>
    4. <version>${log4j2.version}version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.apache.logging.log4jgroupId>
    8. <artifactId>log4j-apiartifactId>
    9. <version>${log4j2.version}version>
    10. dependency>

    ⑥: 其他

    •  junit(4.12)
    •  javax.servlet-api(4.0.0)
    1. <junit.version>4.13junit.version>
    2. <servlet.version>4.0.1servlet.version>
    1. <dependency>
    2. <groupId>junitgroupId>
    3. <artifactId>junitartifactId>
    4. <version>${junit.version}version>
    5. <scope>testscope>
    6. dependency>
    7. <dependency>
    8. <groupId>javax.servletgroupId>
    9. <artifactId>javax.servlet-apiartifactId>
    10. <version>${servlet.version}version>
    11. dependency>

    完整版pom.xml文件代码如下:

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

    2:创建xml文件

      (1):spring.xml文件

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    4. <import resource="spring-mybatis.xml"/>
    5. beans>

        (2):spring-mybatis.xml(重点文件:mybatis与spring的集成配置)

       ①:开启注解式开发,并指定扫描包的位置

    1. <context:annotation-config/>
    2. <context:component-scan base-package="com.tangyuan"/>

     

     ②:引入外部jdbc配置文件

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

       ③:配置dbcp2数据库连接池 

    1. <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    2. destroy-method="close">
    3. <property name="driverClassName" value="${jdbc.driver}"/>
    4. <property name="url" value="${jdbc.url}"/>
    5. <property name="username" value="${jdbc.username}"/>
    6. <property name="password" value="${jdbc.password}"/>
    7. <property name="initialSize" value="${jdbc.initialSize}"/>
    8. <property name="maxTotal" value="${jdbc.maxTotal}"/>
    9. <property name="maxIdle" value="${jdbc.maxIdle}"/>
    10. <property name="minIdle" value="${jdbc.minIdle}"/>
    11. <property name="maxWaitMillis" value="${jdbc.maxWaitMillis}"/>
    12. bean>

       

    ④:实现spring和mybatis整合

    1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    2. <property name="dataSource" ref="dataSource"/>
    3. <property name="mapperLocations" value="classpath*:com/tangyuan/**/mapper/*.xml"/>
    4. <property name="typeAliasesPackage" value="com/tangyuan/**/model"/>
    5. <property name="plugins">
    6. <array>
    7. <bean class="com.github.pagehelper.PageInterceptor">
    8. <property name="properties">
    9. <value>
    10. helperDialect=mysql
    11. value>
    12. property>
    13. bean>
    14. array>
    15. property>
    16. <property name="configuration">
    17. <bean class="org.apache.ibatis.session.Configuration">
    18. <property name="mapUnderscoreToCamelCase" value="true">property>
    19. bean>
    20. property>
    21. bean>
    22. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    23. <property name="basePackage" value="com/tangyuan/**/mapper"/>
    24. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    25. bean>

       ps:第四步操作用来替代以前的MybatisSessionFactoryUtils文件,让代码更加简洁明了,如果对此文件感兴趣的,可以参考以下博客:

    Mybatis 快速入门第一节 入门基础_靖康之耻的博客-CSDN博客MVC全名是ModelViewCotroller,是模型(model)——视图(view)——控制器(controller)的缩写,是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码自定义MVCSSMaction(中转站-----servlet类)controller(控制层)biz(业务逻辑处理层)servicedao(数据访问层)mapperIXxxDAO.java(接口)XxxMapper.java(接口)XxxDAOImpl.java(实现类)...https://blog.csdn.net/qq_61313896/article/details/125969558

       ⑤:开启注解式事物配置

    1. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    2. <property name="dataSource" ref="dataSource" />
    3. bean>
    4. <tx:annotation-driven transaction-manager="transactionManager" />

        ps:第五步操作用来替代以前的junit4单元测试的操作代码,让测试更加便捷,如果有感兴趣的,可以参考以前的博客:

    Mybatis 快速入门第一节 入门基础_靖康之耻的博客-CSDN博客MVC全名是ModelViewCotroller,是模型(model)——视图(view)——控制器(controller)的缩写,是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码自定义MVCSSMaction(中转站-----servlet类)controller(控制层)biz(业务逻辑处理层)servicedao(数据访问层)mapperIXxxDAO.java(接口)XxxMapper.java(接口)XxxDAOImpl.java(实现类)...https://blog.csdn.net/qq_61313896/article/details/125969558         将dbcp2数据库连接池通过ref方式注入到事物管理器中,只要拿到数据源,就能进行事务开启

       ⑥:开启动态代理

     <aop:aspectj-autoproxy/>
    外部jdbc配置文件如下:
    
    1. jdbc.driver=com.mysql.jdbc.Driver
    2. jdbc.url=jdbc:mysql://localhost:3306/db_shopping?useUnicode=true&characterEncoding=UTF-8&useSSL=false
    3. jdbc.username=root
    4. jdbc.password=1234
    5. jdbc.initialSize=10
    6. jdbc.maxTotal=100
    7. jdbc.maxIdle=50
    8. jdbc.minIdle=10
    9. jdbc.maxWaitMillis=-1
    我的spring-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.tangyuan"/>
    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="${jdbc.initialSize}"/>
    16. <property name="maxTotal" value="${jdbc.maxTotal}"/>
    17. <property name="maxIdle" value="${jdbc.maxIdle}"/>
    18. <property name="minIdle" value="${jdbc.minIdle}"/>
    19. <property name="maxWaitMillis" value="${jdbc.maxWaitMillis}"/>
    20. bean>
    21. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    22. <property name="dataSource" ref="dataSource"/>
    23. <property name="mapperLocations" value="classpath*:com/tangyuan/**/mapper/*.xml"/>
    24. <property name="typeAliasesPackage" value="com/tangyuan/**/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. <property name="configuration">
    37. <bean class="org.apache.ibatis.session.Configuration">
    38. <property name="mapUnderscoreToCamelCase" value="true">property>
    39. bean>
    40. property>
    41. bean>
    42. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    43. <property name="basePackage" value="com/tangyuan/**/mapper"/>
    44. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    45. bean>
    46. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    47. <property name="dataSource" ref="dataSource" />
    48. bean>
    49. <tx:annotation-driven transaction-manager="transactionManager" />
    50. <aop:aspectj-autoproxy/>
    51. beans>

    3.通过插件自动生成代码

       插件的配置请参考以前的博客:
    Mybatis 快速入门第一节 入门基础_靖康之耻的博客-CSDN博客MVC全名是ModelViewCotroller,是模型(model)——视图(view)——控制器(controller)的缩写,是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码自定义MVCSSMaction(中转站-----servlet类)controller(控制层)biz(业务逻辑处理层)servicedao(数据访问层)mapperIXxxDAO.java(接口)XxxMapper.java(接口)XxxDAOImpl.java(实现类)...https://blog.csdn.net/qq_61313896/article/details/125969558

    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:\repository\mvn-repository\mysql\mysql-connector-java\5.1.44"/>
    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.tangyuan.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.tangyuan.mapper"
    24. targetProject="src/main/resources">
    25. <property name="enableSubPackages" value="false"/>
    26. sqlMapGenerator>
    27. <javaClientGenerator targetPackage="com.tangyuan.mapper"
    28. targetProject="src/main/java" type="XMLMAPPER">
    29. <property name="enableSubPackages" value="false"/>
    30. javaClientGenerator>
    31. context>
    32. generatorConfiguration>

    4.使用注解式开发开发方式完成开发

    问题:若要将mapper类注入到Spring IOC上下文容器中,方式有哪几种?

    方式一:在spring-mybatis.xml文件中添加以下代码:(手动注入)

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

    方式二:运用@Repository注解方式在mapper接口上定义:(自动注入)

           因为在spring-mybatis.xm中开启了注解式开发,所以可以使用注解方式来开发

    •  @Repository:将Mapper类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在Mapper层

    1. package com.tangyuan.mapper;
    2. import com.tangyuan.model.Book;
    3. import org.springframework.stereotype.Repository;
    4. import java.util.List;
    5. //将BookMapper扫描后注入到Spring上下文(IOC)中定义成bean对象
    6. //
    7. @Repository
    8. public interface BookMapper {
    9. int deleteByPrimaryKey(Integer bid);
    10. int insert(Book record);
    11. int insertSelective(Book record);
    12. Book selectByPrimaryKey(Integer bid);
    13. int updateByPrimaryKeySelective(Book record);
    14. int updateByPrimaryKey(Book record);
    15. List queryBookPager(Book book);
    16. }

     

    •   @Service:将实现类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在service的实现类上(非接口)

    1. package com.tangyuan.service.impl;
    2. import com.tangyuan.service.IBookService;
    3. import org.springframework.stereotype.Service;
    4. /**
    5. * @author 唐渊
    6. * @create  2022-07-24 21:46
    7. */
    8. @Service
    9. // @Service:通常作用在业务层 与上面作用一样
    10. // 将BookServiceImpl扫描后注入到Spring上下文(IOC)中定义成bean对象 作用于Service层的实现类上(非接口类)
    11. public class BookServiceImpl implements IBookService {
    12. }

    •     @Controller:将Controller类扫描后注入到Spring上下文(IOC)中定义成bean对象,通常作用在控制层,将在Spring MVC中使用

    1. package com.tangyuan.Controller;
    2. import org.springframework.stereotype.Controller;
    3. /**
    4. * @author 唐渊
    5. * @create  2022-07-27 15:31
    6. */
    7. @Controller
    8. public class IndexController {
    9. }

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

            可以作用于任意一层中,将所指定的接口或类注入到Spring上下文(IOC)中定义成bean对象

            温馨提示:可以将上面四个注解方式看做setter方法,定义方式后,将其扫描后注入到Spring上下文(IOC)中定义成bean对象

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

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

     

     @Resource:

    1. @Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配

    2. 指定了name或者type则根据指定的类型去匹配bean

    3. 指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

            温馨提示:可以将上面两个注解方式看做getter方法,定义方式后,将从Spring IOC上下文容器中获取指定的bean对象,相当于Spring中的DI(依赖注入)

    1. package com.tangyuan.service.impl;
    2. import com.tangyuan.mapper.BookMapper;
    3. import com.tangyuan.service.IBookService;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.stereotype.Service;
    6. import javax.annotation.Resource;
    7. /**
    8. * @author 唐渊
    9. * @create  2022-07-24 21:46
    10. */
    11. @Service
    12. // @Service:通常作用在业务层 与上面作用一样
    13. // 将BookServiceImpl扫描后注入到Spring上下文(IOC)中定义成bean对象 作用于Service层的实现类上(非接口类)
    14. public class BookServiceImpl implements IBookService {
    15. //自动注入
    16. //Spring中的DI(依赖注入)
    17. //@Autowired 根据类型匹配
    18. @Resource //@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配,如果找不到,就报错
    19. private BookMapper bookMapper;
    20. //手动注入
    21. // public BookMapper getBookMapper() {
    22. // return bookMapper;
    23. // }
    24. //
    25. // public void setBookMapper(BookMapper bookMapper) {
    26. // this.bookMapper = bookMapper;
    27. // }
    28. }

    •   @Transactional:在方法调用之前开启事务,在方法调用之后提交事务或者回滚事务,可以添加定任意地方

    1. @Transactional //在方法调用之前开启事务,在方法调用之后提交事务或者回滚事务
    2. @Override
    3. public int insert(Book record) {
    4. //开启
    5. return bookMapper.insert(record);
    6. //提交或者回滚
    7. }

     

      5.Spring Test+Junit完美组合

       ①: 在工程的pom文件中增加spring-test的依赖

    1. <dependency>
    2. <groupId>org.springframeworkgroupId>
    3. <artifactId>spring-testartifactId>
    4. <version>${spring.version}version>
    5. dependency>

    ②:创建BaseTestCase,并在该类上加上两个注解

    1. @RunWith(SpringJUnit4ClassRunner.class)
    2. @ContextConfiguration(locations={"classpath:applicationContext.xml"})
    1. package com.tangyuan.service.impl;
    2. import org.junit.runner.RunWith;
    3. import org.springframework.test.context.ContextConfiguration;
    4. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    5. /**
    6. * @author 唐渊
    7. * @create  2022-07-27 11:32
    8. */
    9. @RunWith(SpringJUnit4ClassRunner.class)
    10. @ContextConfiguration(locations = {"classpath:spring.xml"})
    11. public class BaseTest {
    12. }

    6.   使用AOP编程完成分页

                  以前的分页代码封装繁琐,所以我们现在特地地使用AOP编程中的环绕通知来对以前的分页代码进行简化

             若对以前的分页代码有兴趣的,可以参考以前的博客:

    Mybatis 快速入门之 动态sql和分页_靖康之耻的博客-CSDN博客1)在BookMapper类定义方法(2)在BookMapper.xml文件中进行sql语句的编写/*有参构造方法*/(3)在iBookService类编写代码(4)实现接口所定义的方法@Override}(5)进行junit4单元测试@Test//查询返回结果集适合使用返回值是自定义实体类的情况适合使用返回值的数据类型是非自定义的,即jdk的提供的类型println);}测试结果如下查看sql语句//分页查询@Override}...https://blog.csdn.net/qq_61313896/article/details/125981873?spm=1001.2014.3001.5501      

             特意编写一个类,来存放用环绕通知修改的分页代码:

    1. package com.tangyuan.aspect;
    2. import com.github.pagehelper.PageHelper;
    3. import com.github.pagehelper.PageInfo;
    4. import com.tangyuan.util.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. * @create  2022-07-25 9:46
    13. */
    14. @Component
    15. @Aspect
    16. public class PageAspect {
    17. //环绕通知:前+后
    18. //切入点:* *..*Service.*Pager(..) 代表多个连接点集合
    19. //* 代表方法返回值不限
    20. //*.. 代表包名不限
    21. //*Service 代表以service结尾的类或者是接口
    22. //*Pager 代表以Pager结尾的方法
    23. // (..) 代表方法的参数不限
    24. //适配器:通知+切入点
    25. @Around(value = "execution(* *..*Service.*Pager(..))")
    26. public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable {
    27. //获取目标的执行参数
    28. Object[] params = joinPoint.getArgs();
    29. //定义pagebean对象
    30. PageBean pageBean = null;
    31. //循环参数
    32. for (Object param : params) {
    33. //判断参数的类型是否是pagebean
    34. if (param instanceof PageBean) {
    35. pageBean = (PageBean) param;
    36. break;
    37. }
    38. }
    39. //判断是否分页
    40. if (null != pageBean && pageBean.isPagination())
    41. PageHelper.startPage(pageBean.getPage(), pageBean.getRows());
    42. //执行目标方法
    43. Object returnValue = joinPoint.proceed(params);
    44. if (null != pageBean && pageBean.isPagination()){
    45. if (returnValue instanceof List){
    46. List list = (List) returnValue;
    47. PageInfo pageInfo = new PageInfo(list);
    48. pageBean.setTotal(pageInfo.getTotal()+"");
    49. }
    50. }
    51. return returnValue;
    52. }
    53. }

       

         方法测试:

    1. @Test
    2. public void queryBookPager(){
    3. PageBean pageBean=new PageBean();
    4. List books = bookService.queryBookPager(Book.builder().build(),pageBean);
    5. System.out.println("总记录数:"+pageBean.getTotal());
    6. books.forEach(System.out::println);
    7. }
    8. }

       测试结果:      

     

    查看sql语句:

     

         本人刚涉及此方面,博客可能有些地方不好,欢迎各位大佬前来一起讨论斧正

  • 相关阅读:
    解决 LocalDateTime 的序列化与反序列化问题
    聊聊客户档案模型的设计与管理
    蓄势迎接 Google 谷歌开发者大会:开发者,你准备好了吗?
    用c语言写一个剪刀石头布小游戏
    无线智慧城市业务方案建设
    Window 10下SQL Server的安装配置以及C++使用案例
    使用Java解压和压缩文件
    2流高手速成记(之八):基于Sentinel实现微服务体系下的限流与熔断
    Git学习笔记
    做了8年前端,细说那些曾经让你浴霸不能的后端
  • 原文地址:https://blog.csdn.net/qq_61313896/article/details/126026962