• Mybatis与Spring的集成


    目录

    一、Mybatis与Spring的整合

    二、AOP整合pagehelper插件


    一、Mybatis与Spring的整合

            1. 导入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>mavenTextartifactId>
    6. <version>1.0-SNAPSHOTversion>
    7. <packaging>warpackaging>
    8. <name>mavenText 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>mavenTextfinalName>
    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. <groupId>org.mybatis.generatorgroupId>
    168. <artifactId>mybatis-generator-maven-pluginartifactId>
    169. <version>1.3.2version>
    170. <dependencies>
    171. <dependency>
    172. <groupId>mysqlgroupId>
    173. <artifactId>mysql-connector-javaartifactId>
    174. <version>5.1.44version>
    175. dependency>
    176. dependencies>
    177. <configuration>
    178. <overwrite>trueoverwrite>
    179. configuration>
    180. plugin>
    181. <plugin>
    182. <artifactId>maven-clean-pluginartifactId>
    183. <version>3.1.0version>
    184. plugin>
    185. <plugin>
    186. <artifactId>maven-resources-pluginartifactId>
    187. <version>3.0.2version>
    188. plugin>
    189. <plugin>
    190. <artifactId>maven-compiler-pluginartifactId>
    191. <version>3.8.0version>
    192. plugin>
    193. <plugin>
    194. <artifactId>maven-surefire-pluginartifactId>
    195. <version>2.22.1version>
    196. plugin>
    197. <plugin>
    198. <artifactId>maven-war-pluginartifactId>
    199. <version>3.2.2version>
    200. plugin>
    201. <plugin>
    202. <artifactId>maven-install-pluginartifactId>
    203. <version>2.5.2version>
    204. plugin>
    205. <plugin>
    206. <artifactId>maven-deploy-pluginartifactId>
    207. <version>2.8.2version>
    208. plugin>
    209. plugins>
    210. pluginManagement>
    211. build>
    212. project>

            2.编写配置文件: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.zq.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/javaxl/ssm/**/mapper/*.xml"/>
    24. <property name="typeAliasesPackage" value="com/javaxl/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/javaxl/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>

            3.使用注解开发

    @Repository:将DAO类声明为Bean

    @Service:通常作用在业务层

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

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

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

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

            4. 测试

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

    1. package com.zq.biz.impl;
    2. import com.zq.biz.BookBiz;
    3. import com.zq.mapper.BookMapper;
    4. import com.zq.model.Book;
    5. import com.zq.model.BookVo;
    6. import org.apache.ibatis.annotations.Param;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.stereotype.Service;
    9. import java.util.List;
    10. import java.util.Map;
    11. @Service
    12. public class BookBizImpl implements BookBiz {
    13. @Autowired
    14. private BookMapper bookMapper;
    15. //Alt+Enter 快速构建实现类,填充代码的前半部分 Ctrl+1
    16. //Alt+Insert 快速提供set/get/toString/构造方法
    17. /*public BookMapper getBookMapper() {
    18. return bookMapper;
    19. }
    20. public void setBookMapper(BookMapper bookMapper) {
    21. this.bookMapper = bookMapper;
    22. }*/
    23. @Override
    24. public int deleteByPrimaryKey(Integer bid) {
    25. return bookMapper.deleteByPrimaryKey(bid);
    26. }
    27. @Override
    28. public Book selectByPrimaryKey(Integer bid) {
    29. return bookMapper.selectByPrimaryKey(bid);
    30. }
    31. @Override
    32. public List selectByIn(List bookIds) {
    33. return bookMapper.selectByIn(bookIds);
    34. }
    35. public List selectBooksLike1(String bname){
    36. return bookMapper.selectBooksLike1(bname);
    37. }
    38. public List selectBooksLike2(String bname){
    39. return bookMapper.
    40. selectBooksLike2(bname);
    41. }
    42. public List selectBooksLike3(String bname){
    43. return bookMapper.selectBooksLike3(bname);
    44. }
    45. @Override
    46. public List list1() {
    47. return bookMapper.list1();
    48. }
    49. @Override
    50. public List list2() {
    51. return bookMapper.list2();
    52. }
    53. @Override
    54. public List list3(BookVo vo) {
    55. return bookMapper.list3(vo);
    56. }
    57. @Override
    58. public List list4() {
    59. return bookMapper.list4();
    60. }
    61. @Override
    62. public Map list5(Map map) {
    63. return bookMapper.list5(map);
    64. }
    65. @Override
    66. public List list6(BookVo bookVo) {
    67. return bookMapper.list6(bookVo);
    68. }
    69. @Override
    70. public List list7(BookVo bookVo) {
    71. return list7(bookVo);
    72. }
    73. }

    5. 管理数据源 -> 管理sqlsession

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

     

     然后在测试类里面添加:
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations={“classpath:applicationContext-mybatis.xml”})

    1. package com.zq.biz.impl;
    2. import com.zq.biz.BookBiz;
    3. import com.zq.mapper.BookMapper;
    4. import com.zq.model.BookVo;
    5. import com.zq.util.SessionUtil;
    6. import com.zq.biz.impl.BookBizImpl;
    7. import org.apache.ibatis.session.SqlSession;
    8. import org.junit.After;
    9. import org.junit.Before;
    10. import org.junit.Test;
    11. import org.junit.runner.RunWith;
    12. import org.springframework.test.context.ContextConfiguration;
    13. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    14. import java.util.Arrays;
    15. import java.util.HashMap;
    16. import java.util.List;
    17. import java.util.Map;
    18. import static org.junit.Assert.*;
    19. @RunWith(SpringJUnit4ClassRunner.class)
    20. @ContextConfiguration(locations={"classpath:applicationContext-mybatis.xml"})
    21. public class BookBizImplTest {
    22. private BookBiz bookBiz;
    23. private SqlSession sqlSession;
    24. @Before
    25. public void setUp() throws Exception {
    26. System.out.println("初始化方法...");
    27. BookBizImpl bookBiz = new BookBizImpl();
    28. //工具类中获取session对象
    29. sqlSession = SessionUtil.openSession();
    30. System.out.println(sqlSession+"初始化方法");
    31. //从session对象中获取mapper对象
    32. BookMapper mapper = sqlSession.getMapper(BookMapper.class);
    33. bookBiz.setBookMapper(mapper);
    34. this.bookBiz = bookBiz;
    35. }
    36. @After
    37. public void tearDown() throws Exception {
    38. System.out.println("方法测试结束...");
    39. System.out.println(sqlSession);
    40. sqlSession.commit();
    41. sqlSession.close();
    42. }
    43. @Test
    44. public void deleteByPrimaryKey() {
    45. bookBiz.deleteByPrimaryKey(44);
    46. sqlSession.commit();
    47. sqlSession.close();
    48. }
    49. @Test
    50. public void selectByPrimaryKey() {
    51. System.out.println("测试的业务方法...");
    52. System.out.println(bookBiz.selectByPrimaryKey(44));
    53. }
    54. @Test
    55. public void text3() {
    56. int[] ints = {1,2,3,4};
    57. //将数组变为字符串
    58. StringBuffer sb = new StringBuffer();
    59. for (int i : ints){
    60. sb.append(",").append(i);
    61. }
    62. String s = sb.toString();
    63. System.out.println(s.substring(1));
    64. }
    65. @Test
    66. public void selectByIn() {
    67. List integers = Arrays.asList(new Integer[] {33,34,32});
    68. bookBiz.selectByIn(integers).forEach(System.out::println);
    69. }
    70. @Test
    71. public void selectBooksLike1() {
    72. bookBiz.selectBooksLike1("%圣嘘%").forEach(System.out::println);
    73. }
    74. @Test
    75. public void selectBooksLike2() {
    76. bookBiz.selectBooksLike2("%圣嘘%").forEach(System.out::println);
    77. }
    78. @Test
    79. public void selectBooksLike3() {
    80. bookBiz.selectBooksLike3("圣嘘").forEach(System.out::println);
    81. }
    82. @Test
    83. public void list1() {
    84. bookBiz.list1().forEach(System.out::println);
    85. }
    86. @Test
    87. public void list2() {
    88. bookBiz.list2().forEach(System.out::println);
    89. }
    90. @Test
    91. public void list3() {
    92. BookVo vo = new BookVo();
    93. vo.setBooKIds(Arrays.asList(new Integer[]{31,32,33,34}));
    94. bookBiz.list3(vo).forEach(System.out::println);
    95. }
    96. @Test
    97. public void list4() {
    98. bookBiz.list4().forEach(System.out::println);
    99. }
    100. @Test
    101. public void list5() {
    102. Map map = new HashMap();
    103. map.put("bid",32);
    104. System.out.println(bookBiz.list5(map));
    105. }
    106. @Test
    107. public void list6() {
    108. BookVo vo = new BookVo();
    109. vo.setMax(45);
    110. vo.setMin(35);
    111. bookBiz.list6(vo).forEach(System.out::println);
    112. }
    113. @Test
    114. public void list7() {
    115. BookVo vo = new BookVo();
    116. vo.setMax(45);
    117. vo.setMin(35);
    118. bookBiz.list7(vo).forEach(System.out::println);
    119. }
    120. }

    二、AOP整合pagehelper插件

            待解决问题:

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

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

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

    2、写通知

        2.1 目标对象该方法一定携带了PageBean对象
    注解:@aspect:相当于配置了环绕通知

           @component:交给Spring进行管理

           @excution

    3、建立一个切面类:PageAspect
     

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

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

  • 相关阅读:
    使用 Data Assistant 快速创建测试数据集
    线程本地存储 ThreadLocal
    原生js+css制作--可以弹奏的吉他
    《位图BitMap - 基于java实现》
    模型部署踩坑(持续更新ing)
    分布式中的常见问题
    LOCK接口
    python算法
    开启潮玩文化新篇章,泡泡玛特首届海外PTS潮玩成功落地新加坡
    GDP-海藻糖,5‘-鸟苷二磷酸岩藻糖,GDP-fucose ,CAS:15839-70-0
  • 原文地址:https://blog.csdn.net/weixin_66110079/article/details/126344288