• MyBatis集成Spring


    前言

    上一篇文章讲了mybatis的动态SQL以及分页。今天将要分享的内容是MyBatis与Spring进行整合。


    一、Spring与Mybatis整合

            1、导入pom依赖

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

                           spring-core

                           spring-beans

                           spring-context

                           spring-orm

                           spring-tx

                           spring-aspects

                           spring-web

                    1.2 添加mybatis相关依赖

                           mybatis核心:mybatis(3.4.5)

                           Mybatis分页:pagehelper(5.1.2)

                    1.3 spring整合mybatis(1.3.1)

                           mybatis-spring

                    1.4 添加dbcp2连接池

                           commons-dbcp2(2.1.1)

                           commons-pool2(2.4.3)

                   1.5 添加日志配置(2.9.1)

           l                og4j-core

                           log4j-api

                           log4j-web

                    1.6 其他

                           junit(4.12)

                           javax.servlet-api(4.0.0)

                           lombok(1.18.2)

       注:使用mybatis-generator插件,pom文件添加支持  

    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>org.examplegroupId>
    5. <artifactId>pro_maven_02artifactId>
    6. <version>1.0-SNAPSHOTversion>
    7. <packaging>warpackaging>
    8. <name>pro_maven_02 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. <maven.compiler.plugin.version>3.7.0maven.compiler.plugin.version>
    15. <spring.version>5.0.2.RELEASEspring.version>
    16. <mybatis.version>3.4.5mybatis.version>
    17. <mysql.version>5.1.44mysql.version>
    18. <pagehelper.version>5.1.2pagehelper.version>
    19. <mybatis.spring.version>1.3.1mybatis.spring.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. <junit.version>4.12junit.version>
    24. <servlet.version>4.0.0servlet.version>
    25. <lombok.version>1.18.2lombok.version>
    26. properties>
    27. <dependencies>
    28. <dependency>
    29. <groupId>org.springframeworkgroupId>
    30. <artifactId>spring-contextartifactId>
    31. <version>${spring.version}version>
    32. dependency>
    33. <dependency>
    34. <groupId>org.springframeworkgroupId>
    35. <artifactId>spring-ormartifactId>
    36. <version>${spring.version}version>
    37. dependency>
    38. <dependency>
    39. <groupId>org.springframeworkgroupId>
    40. <artifactId>spring-txartifactId>
    41. <version>${spring.version}version>
    42. dependency>
    43. <dependency>
    44. <groupId>org.springframeworkgroupId>
    45. <artifactId>spring-aspectsartifactId>
    46. <version>${spring.version}version>
    47. dependency>
    48. <dependency>
    49. <groupId>org.springframeworkgroupId>
    50. <artifactId>spring-webartifactId>
    51. <version>${spring.version}version>
    52. dependency>
    53. <dependency>
    54. <groupId>org.springframeworkgroupId>
    55. <artifactId>spring-testartifactId>
    56. <version>${spring.version}version>
    57. dependency>
    58. <dependency>
    59. <groupId>org.mybatisgroupId>
    60. <artifactId>mybatisartifactId>
    61. <version>${mybatis.version}version>
    62. dependency>
    63. <dependency>
    64. <groupId>mysqlgroupId>
    65. <artifactId>mysql-connector-javaartifactId>
    66. <version>${mysql.version}version>
    67. dependency>
    68. <dependency>
    69. <groupId>com.github.pagehelpergroupId>
    70. <artifactId>pagehelperartifactId>
    71. <version>${pagehelper.version}version>
    72. dependency>
    73. <dependency>
    74. <groupId>org.mybatisgroupId>
    75. <artifactId>mybatis-springartifactId>
    76. <version>${mybatis.spring.version}version>
    77. dependency>
    78. <dependency>
    79. <groupId>org.apache.commonsgroupId>
    80. <artifactId>commons-dbcp2artifactId>
    81. <version>${commons.dbcp2.version}version>
    82. dependency>
    83. <dependency>
    84. <groupId>org.apache.commonsgroupId>
    85. <artifactId>commons-pool2artifactId>
    86. <version>${commons.pool2.version}version>
    87. dependency>
    88. <dependency>
    89. <groupId>org.apache.logging.log4jgroupId>
    90. <artifactId>log4j-coreartifactId>
    91. <version>${log4j2.version}version>
    92. dependency>
    93. <dependency>
    94. <groupId>org.apache.logging.log4jgroupId>
    95. <artifactId>log4j-apiartifactId>
    96. <version>${log4j2.version}version>
    97. dependency>
    98. <dependency>
    99. <groupId>org.apache.logging.log4jgroupId>
    100. <artifactId>log4j-webartifactId>
    101. <version>${log4j2.version}version>
    102. dependency>
    103. <dependency>
    104. <groupId>junitgroupId>
    105. <artifactId>junitartifactId>
    106. <version>${junit.version}version>
    107. <scope>testscope>
    108. dependency>
    109. <dependency>
    110. <groupId>javax.servletgroupId>
    111. <artifactId>javax.servlet-apiartifactId>
    112. <version>${servlet.version}version>
    113. <scope>providedscope>
    114. dependency>
    115. <dependency>
    116. <groupId>org.projectlombokgroupId>
    117. <artifactId>lombokartifactId>
    118. <version>${lombok.version}version>
    119. <scope>providedscope>
    120. dependency>
    121. dependencies>
    122. <build>
    123. <finalName>pro_maven_02finalName>
    124. <resources>
    125. <resource>
    126. <directory>src/main/javadirectory>
    127. <includes>
    128. <include>**/*.xmlinclude>
    129. includes>
    130. resource>
    131. <resource>
    132. <directory>src/main/resourcesdirectory>
    133. <includes>
    134. <include>jdbc.propertiesinclude>
    135. <include>*.xmlinclude>
    136. includes>
    137. resource>
    138. resources>
    139. <pluginManagement>
    140. <plugins>
    141. <plugin>
    142. <groupId>org.apache.maven.pluginsgroupId>
    143. <artifactId>maven-compiler-pluginartifactId>
    144. <version>${maven.compiler.plugin.version}version>
    145. <configuration>
    146. <source>${maven.compiler.source}source>
    147. <target>${maven.compiler.target}target>
    148. <encoding>${project.build.sourceEncoding}encoding>
    149. configuration>
    150. plugin>
    151. <plugin>
    152. <groupId>org.mybatis.generatorgroupId>
    153. <artifactId>mybatis-generator-maven-pluginartifactId>
    154. <version>1.3.2version>
    155. <dependencies>
    156. <dependency>
    157. <groupId>mysqlgroupId>
    158. <artifactId>mysql-connector-javaartifactId>
    159. <version>${mysql.version}version>
    160. dependency>
    161. dependencies>
    162. <configuration>
    163. <overwrite>trueoverwrite>
    164. configuration>
    165. plugin>
    166. <plugin>
    167. <artifactId>maven-clean-pluginartifactId>
    168. <version>3.1.0version>
    169. plugin>
    170. <plugin>
    171. <artifactId>maven-resources-pluginartifactId>
    172. <version>3.0.2version>
    173. plugin>
    174. <plugin>
    175. <artifactId>maven-compiler-pluginartifactId>
    176. <version>3.8.0version>
    177. plugin>
    178. <plugin>
    179. <artifactId>maven-surefire-pluginartifactId>
    180. <version>2.22.1version>
    181. plugin>
    182. <plugin>
    183. <artifactId>maven-war-pluginartifactId>
    184. <version>3.2.2version>
    185. plugin>
    186. <plugin>
    187. <artifactId>maven-install-pluginartifactId>
    188. <version>2.5.2version>
    189. plugin>
    190. <plugin>
    191. <artifactId>maven-deploy-pluginartifactId>
    192. <version>2.8.2version>
    193. plugin>
    194. plugins>
    195. pluginManagement>
    196. build>
    197. project>

    2.用mybatis逆向工程生成模型层层代码

            代码在上一篇博客中有,就不再展示啦。

            

     3.写配置文件applicationContext-mybatis.xml

            3.1 注解式开发

       开启注解

       

       

       

       

       

       3.2 引入外部jdbc配置文件

       

       3.3 配置dbcp2数据库连接池

       3.4 spring和mybatis整合

      

       3.5 注解式事物配置

        

       

            

        

        

       3.6 开启动态代理

       

    3.7 注解式开发

       @Repository:将DAO类声明为Bean

       @Service:通常作用在业务层

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

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

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

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

       @Resource:

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

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

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

       问题:@Autowired和@Resource两个注解的区别:

       1)@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配

       2)@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了

       Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。

    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.zhw"/>
    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/zhw/**/mapper/*.xml"/>
    24. <property name="typeAliasesPackage" value="com/zhw/**/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/zhw/**/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>

    4.Spring Test+junit 组合

    bookbizImpl

    1. package com.zhw.biz;
    2. import com.zhw.mapper.BookMapper;
    3. import com.zhw.model.Book;
    4. import com.zhw.util.PageBean;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Service;
    7. import java.util.List;
    8. import java.util.Map;
    9. /**
    10. * @author louis
    11. * @create  2022-08-14 21:03
    12. */
    13. @Service
    14. public class BookBizImpl implements BookBiz {
    15. @Autowired
    16. private BookMapper bookMapper;
    17. // public BookMapper getBookMapper() {
    18. // return bookMapper;
    19. // }
    20. //
    21. // public void setBookMapper(BookMapper bookMapper) {
    22. // this.bookMapper = bookMapper;
    23. // }
    24. @Override
    25. public int deleteByPrimaryKey(Integer bid) {
    26. return 0;
    27. }
    28. @Override
    29. public Book selectByPrimaryKey(Integer bid) {
    30. return null;
    31. }
    32. @Override
    33. public List selectByIn(List bookIds) {
    34. return null;
    35. }
    36. @Override
    37. public List selectBooksLike1(String bname) {
    38. return null;
    39. }
    40. @Override
    41. public List selectBooksLike2(String bname) {
    42. return null;
    43. }
    44. @Override
    45. public List selectBooksLike3(String bname) {
    46. return null;
    47. }
    48. @Override
    49. public List list4() {
    50. return null;
    51. }
    52. @Override
    53. public Map list5(Map map) {
    54. return null;
    55. }
    56. @Override
    57. public List listPager(Map map, PageBean pageBean) {
    58. return null;
    59. }
    60. }

    bookmapper

    1. package com.zhw.mapper;
    2. import com.zhw.model.Book;
    3. import org.springframework.stereotype.Repository;
    4. @Repository
    5. public interface BookMapper {
    6. int deleteByPrimaryKey(Integer bid);
    7. int insert(Book record);
    8. int insertSelective(Book record);
    9. Book selectByPrimaryKey(Integer bid);
    10. int updateByPrimaryKeySelective(Book record);
    11. int updateByPrimaryKey(Book record);
    12. }

    bookbizimpltest

    1. package com.zhw.service.impl;
    2. import com.zhw.biz.BookBiz;
    3. import com.zhw.model.Book;
    4. import org.junit.After;
    5. import org.junit.Before;
    6. import org.junit.Test;
    7. import org.junit.runner.RunWith;
    8. import org.springframework.beans.factory.annotation.Autowired;
    9. import org.springframework.test.context.ContextConfiguration;
    10. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    11. /**
    12. * @author louis
    13. * @create  2022-08-10 23:27
    14. */
    15. @RunWith(SpringJUnit4ClassRunner.class)
    16. @ContextConfiguration(locations={"classspath:applicationContext-mybatis.xml"})
    17. public class BookBizImplTest {
    18. @Autowired
    19. private BookBiz bookBiz;
    20. // private SqlSession sqlSession;
    21. @Before
    22. public void setUp() throws Exception {
    23. System.out.println("初始化");
    24. // BookBizImpl bookBiz = new BookBizImpl();
    25. // sqlSession = SessionUtil.openSession();
    26. // BookMapper mapper = sqlSession.getMapper(BookMapper.class);
    27. // bookBiz.setBookMapper(mapper);
    28. // this.bookBiz = bookBiz;
    29. }
    30. @After
    31. public void tearDown() throws Exception {
    32. System.out.println("结束");
    33. }
    34. @Test
    35. public void deleteByPrimaryKey() {
    36. }
    37. @Test
    38. public void selectByPrimaryKey() {
    39. System.out.println("测试");
    40. // System.out.println(bookBiz.getBookMapper());
    41. Book book = bookBiz.selectByPrimaryKey(44);
    42. System.out.println(book);
    43. }
    44. }

    二、Aop整合pagehelper插件

            PageAspect

    1. package com.zhw.aspect;
    2. import com.github.pagehelper.PageHelper;
    3. import com.github.pagehelper.PageInfo;
    4. import com.zhw.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. @Component
    11. @Aspect
    12. public class PageAspect {
    13. /**
    14. * *:返回值类型
    15. * *:无限包
    16. * *Service:以Service结尾接口名
    17. * *Pager:以Pager方法
    18. * 只要同时匹配上诉四个条件,就会被列为目标对象
    19. * 上诉配置要生效,代理注解 不能少
    20. *
    21. * @param args
    22. * @return
    23. * @throws Throwable
    24. */
    25. @Around("execution(* *..*Biz.*Pager(..))")
    26. public Object invoke(ProceedingJoinPoint args) throws Throwable {
    27. Object[] params = args.getArgs();
    28. PageBean pageBean = null;
    29. for (Object param : params) {
    30. if(param instanceof PageBean){
    31. pageBean = (PageBean)param;
    32. break;
    33. }
    34. }
    35. if(pageBean != null && pageBean.isPagination())
    36. PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
    37. // 执行目标方法
    38. Object list = args.proceed(params);
    39. if(null != pageBean && pageBean.isPagination()){
    40. PageInfo pageInfo = new PageInfo((List) list);
    41. pageBean.setTotal(pageInfo.getTotal()+"");
    42. }
    43. return list;
    44. }
    45. }

    BookBizImpl

    1. package com.zhw.biz.impl;
    2. import com.github.pagehelper.PageHelper;
    3. import com.github.pagehelper.PageInfo;
    4. import com.zhw.biz.BookBiz;
    5. import com.zhw.mapper.BookMapper;
    6. import com.zhw.model.Book;
    7. import com.zhw.model.BookVo;
    8. import com.zhw.util.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. @Service
    14. public class BookBizImpl implements BookBiz {
    15. @Autowired
    16. private BookMapper bookMapper;
    17. // alt+insert 快速提供set/get/tostring/构造方法
    18. // alt+enter 快速构建实现类,填充代码的前半部分 ctrl+1
    19. // public BookMapper getBookMapper() {
    20. // return bookMapper;
    21. // }
    22. // public void setBookMapper(BookMapper bookMapper) {
    23. // this.bookMapper = bookMapper;
    24. // }
    25. @Override
    26. public int deleteByPrimaryKey(Integer bid) {
    27. return bookMapper.deleteByPrimaryKey(bid);
    28. }
    29. @Override
    30. public Book selectByPrimaryKey(Integer bid) {
    31. return bookMapper.selectByPrimaryKey(bid);
    32. }
    33. @Override
    34. public List selectByIn(List bookIds) {
    35. return bookMapper.selectByIn(bookIds);
    36. }
    37. @Override
    38. public List selectBooksLike1(String bname) {
    39. return bookMapper.selectBooksLike1(bname);
    40. }
    41. @Override
    42. public List selectBooksLike2(String bname) {
    43. return bookMapper.selectBooksLike2(bname);
    44. }
    45. @Override
    46. public List selectBooksLike3(String bname) {
    47. return bookMapper.selectBooksLike3(bname);
    48. }
    49. @Override
    50. public List list1() {
    51. return bookMapper.list1();
    52. }
    53. @Override
    54. public List list2() {
    55. return bookMapper.list2();
    56. }
    57. @Override
    58. public List list3(BookVo vo) {
    59. return bookMapper.list3(vo);
    60. }
    61. @Override
    62. public List list4() {
    63. return bookMapper.list4();
    64. }
    65. @Override
    66. public Map list5(Map map) {
    67. return bookMapper.list5(map);
    68. }
    69. @Override
    70. public List listPager(Map map, PageBean pageBean){
    71. return bookMapper.listPager(map);
    72. }
    73. // public List listPager(Map map, PageBean pageBean) {
    74. pageHelper分页插件相关的代码
    75. // if(pageBean!=null&&pageBean.isPagination()){
    76. // PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
    77. // }
    78. // List maps = bookMapper.listPager(map);
    79. // if(pageBean!=null&&pageBean.isPagination()){
    80. 处理查询结果的前提是需要分页,是需要分页的
    81. // PageInfo info = new PageInfo(maps);
    82. // pageBean.setTotal(info.getTotal()+"");
    83. // }
    84. // return maps;
    85. // }
    86. @Override
    87. public List list6(BookVo bookVo) {
    88. return bookMapper.list6(bookVo);
    89. }
    90. @Override
    91. public List list7(BookVo bookVo) {
    92. return bookMapper.list7(bookVo);
    93. }
    94. }

    总结

    本次分享了Spring 和 Mybatis的集成以及aop整合pagehelper插件。过程中简单的分享了几个注解,以及其中两个注解的区别。

    今天的分享就到此为止啦。如有错误还望指正,谢谢啦。

  • 相关阅读:
    PlantUML入门教程:画时序图
    Docker安装并使用Mysql(可用详细)
    OFDM 十六讲 4 -What is a Cyclic Prefix in OFDM
    代码随想录算法训练营第13天|● 239. 滑动窗口最大值 ● 347.前 K 个高频元素 ● 总结
    【Vue3 源码解析】computed
    10.4 认识Capstone反汇编引擎
    《实现领域驱动设计》- 领域服务
    Powercli批量修改分布式交换机端口组
    以命令行形式执行Postman脚本(使用Newman)
    深度解析 | 支付和分账系统的前世今生
  • 原文地址:https://blog.csdn.net/qq_62331938/article/details/126339251