• Mybatis与Spring的集成


    铁子们今天分享Mybatis与Spring的集成先看目录

    目录

    一,Mybatis与Spring框架的集成

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

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

    4.Spring Test+junit完美组合

    二,Aop整合pagehelper插件


    一,Mybatis与Spring框架的集成


    提示:在新建一个项目时,项目建成功后,会自动下载一些命令,如果项目没有这些命令,说明建项目是就出现错误

    常用的插件有

    Maven-test命令作用:

    (1)用来检查当前项目所有相关pom依赖是否下载成功

    (2)用来检测当前所有的pom依赖是否有版本冲突

    maven-clean:

            清除本地的(idea)的pom依赖

    当两个框架需要连接,中间就需要一个桥梁,所以的就用到dbcb2

    dbcb2就是个连接池,也要整合到Spring里面去,保持连接 
     

     

    补充:idea跟eclipse不同之处:有的程序员用习惯了eclipse在用idea的时候也会不自觉的点以下按钮直接运行代码,但当你点击时不管你有没有以下方法都会生成。项目量小还好,当项目量大的时候找都不知上哪找

     

    ssm整合
    1.添加所有的pom依赖

    2.添加并配置整合的配置文件

            Spring:Spring-context。xml

            mybatis-:mybatis。cfg.xml

            Spring:mybatis.xml

                    1.扫描注解驱动

                    2.添加并管理数据源->管理sqlsession

                    3.扫描所有的Mapper接口

                    4.添加事务管理器

                    

            Spring-shiro.xml

            ......

    步骤:

    1,导入jar包依赖
            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)

                   log4j-core

                   log4j-api

                  log4j-web

               1.6 其他

                   junit(4.12)

                   javax.servlet-api(4.0.0)

                   lombok(1.18.2)

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

    1. "1.0" encoding="UTF-8"?>
    2. "http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. 4.0.0
    5. org.example
    6. ssm
    7. 1.0-SNAPSHOT
    8. war
    9. ssm Maven Webapp
    10. http://www.example.com
    11. UTF-8
    12. 1.8
    13. 1.8
    14. 3.7.0
    15. 5.0.2.RELEASE
    16. 3.4.5
    17. 5.1.44
    18. 5.1.2
    19. 1.3.1
    20. 2.1.1
    21. 2.4.3
    22. 2.9.1
    23. 4.12
    24. 4.0.0
    25. 1.18.2
    26. org.springframework
    27. spring-context
    28. ${spring.version}
    29. org.springframework
    30. spring-orm
    31. ${spring.version}
    32. org.springframework
    33. spring-tx
    34. ${spring.version}
    35. org.springframework
    36. spring-aspects
    37. ${spring.version}
    38. org.springframework
    39. spring-web
    40. ${spring.version}
    41. org.springframework
    42. spring-test
    43. ${spring.version}
    44. org.mybatis
    45. mybatis
    46. ${mybatis.version}
    47. mysql
    48. mysql-connector-java
    49. ${mysql.version}
    50. com.github.pagehelper
    51. pagehelper
    52. ${pagehelper.version}
    53. org.mybatis
    54. mybatis-spring
    55. ${mybatis.spring.version}
    56. org.apache.commons
    57. commons-dbcp2
    58. ${commons.dbcp2.version}
    59. org.apache.commons
    60. commons-pool2
    61. ${commons.pool2.version}
    62. org.apache.logging.log4j
    63. log4j-core
    64. ${log4j2.version}
    65. org.apache.logging.log4j
    66. log4j-api
    67. ${log4j2.version}
    68. org.apache.logging.log4j
    69. log4j-web
    70. ${log4j2.version}
    71. junit
    72. junit
    73. ${junit.version}
    74. test
    75. javax.servlet
    76. javax.servlet-api
    77. ${servlet.version}
    78. provided
    79. org.projectlombok
    80. lombok
    81. ${lombok.version}
    82. provided
    83. ssm
    84. src/main/java
    85. **/*.xml
    86. src/main/resources
    87. jdbc.properties
    88. *.xml
    89. org.apache.maven.plugins
    90. maven-compiler-plugin
    91. ${maven.compiler.plugin.version}
    92. ${maven.compiler.source}
    93. ${maven.compiler.target}
    94. ${project.build.sourceEncoding}
    95. org.mybatis.generator
    96. mybatis-generator-maven-plugin
    97. 1.3.2
    98. mysql
    99. mysql-connector-java
    100. ${mysql.version}
    101. true
    102. maven-clean-plugin
    103. 3.1.0
    104. maven-resources-plugin
    105. 3.0.2
    106. maven-compiler-plugin
    107. 3.8.0
    108. maven-surefire-plugin
    109. 2.22.1
    110. maven-war-plugin
    111. 3.2.2
    112. maven-install-plugin
    113. 2.5.2
    114. maven-deploy-plugin
    115. 2.8.2

     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之间的耦合。

       @Transactional
     

    1. "1.0" encoding="UTF-8"?>
    2. "http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    5. xmlns:aop="http://www.springframework.org/schema/aop"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    7. package="com.javaxl.ssm"/>
    8. "classpath:jdbc.properties"/>
    9. "dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    10. destroy-method="close">
    11. "driverClassName" value="${jdbc.driver}"/>
    12. "url" value="${jdbc.url}"/>
    13. "username" value="${jdbc.username}"/>
    14. "password" value="${jdbc.password}"/>
    15. "initialSize" value="10"/>
    16. "maxTotal" value="100"/>
    17. "maxIdle" value="50"/>
    18. "minIdle" value="10"/>
    19. "maxWaitMillis" value="-1"/>
    20. "sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    21. "dataSource" ref="dataSource"/>
    22. "mapperLocations" value="classpath*:com/javaxl/ssm/**/mapper/*.xml"/>
    23. "typeAliasesPackage" value="com/javaxl/ssm/**/model"/>
    24. "plugins">
    25. "com.github.pagehelper.PageInterceptor">
    26. "properties">
    27. helperDialect=mysql
    28. "/>
    29. " value="sqlSessionFactory"/>
    30. " class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    31. " ref="dataSource" />
    32. " />

    javabean交给Spring进行管理?

     在实现类上面加上@Service注解

    @autowired:在属性上方添加@autowired

    1. package="com.tsq.ssm"/>

     @Repository:标记Mapper接口 

     这里的Spring-context是专门运行Spring代码的

     

    4.Spring Test+junit完美组合

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

    1. org.springframework
    2. spring-test
    3. ${spring.version}

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

       @RunWith(SpringJUnit4ClassRunner.class)

       @ContextConfiguration(locations={"classpath:applicationContext.xml"})

    相关代码
     

    1. package com.tsq.ssm.mapper;
    2. import com.tsq.ssm.model.Book;
    3. import com.tsq.ssm.model.BookVo;
    4. import org.apache.ibatis.annotations.Param;
    5. import java.util.List;
    6. import java.util.Map;
    7. public interface BookMapper {
    8. int deleteByPrimaryKey(Integer bid);
    9. int insert(Book record);
    10. int insertSelective(Book record);
    11. Book selectByPrimaryKey(Integer bid);
    12. int updateByPrimaryKeySelective(Book record);
    13. int updateByPrimaryKey(Book record);
    14. ]

    接口实现类

    1. package com.tsq.ssm.Biz.impl;
    2. import com.tsq.ssm.Biz.BookBiz;
    3. import com.tsq.ssm.mapper.BookMapper;
    4. import com.tsq.ssm.model.Book;
    5. import com.tsq.ssm.model.BookVo;
    6. import com.tsq.ssm.util.PageBean;
    7. import com.github.pagehelper.PageHelper;
    8. import com.github.pagehelper.PageInfo;
    9. import java.util.List;
    10. import java.util.Map;
    11. /**
    12. * @author tsq
    13. * @site www.javadxy.com
    14. * @company ds公司
    15. * @create 2022-08-11 20:07
    16. */
    17. public class BookBizImpl implements BookBiz {
    18. @Autowired
    19. private BookMapper bookMapper;
    20. @Override
    21. public int deleteByPrimaryKey(Integer bid) {
    22. return bookMapper.deleteByPrimaryKey(bid);
    23. }
    24. @Override
    25. public int insert(Book record) {
    26. return bookMapper.insert(record);
    27. }
    28. @Override
    29. public int insertSelective(Book record) {
    30. return bookMapper.insertSelective(record);
    31. }
    32. @Override
    33. public Book selectByPrimaryKey(Integer bid) {
    34. return bookMapper.selectByPrimaryKey(bid);
    35. }
    36. @Override
    37. public int updateByPrimaryKeySelective(Book record) {
    38. return bookMapper.updateByPrimaryKeySelective(record);
    39. }
    40. @Override
    41. public int updateByPrimaryKey(Book record) {
    42. return bookMapper.updateByPrimaryKey(record);
    43. }
    44. }

    测试类

    1. package com.tsq.ssm.ssm;
    2. import com.tsq.ssm.Biz.impl.BookBizImpl;
    3. import com.tsq.ssm.mapper.BookMapper;
    4. import com.tsq.ssm.model.BookVo;
    5. import com.tsq.ssm.util.PageBean;
    6. import com.tsq.ssm.util.SessionUtil;
    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.beans.factory.annotation.Autowired;
    13. import org.springframework.test.context.ContextConfiguration;
    14. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    15. import java.util.Arrays;
    16. import java.util.HashMap;
    17. import java.util.List;
    18. import java.util.Map;
    19. /**
    20. * @author tsq
    21. * @site www.javadxy.com
    22. * @company ds公司
    23. * @create 2022-08-11 20:15
    24. */
    25. @RunWith(SpringJUnit4ClassRunner.class)
    26. @ContextConfiguration(locations={"classpath:applicationContext-mybatis.xml"})
    27. public class BookBizImplTest2 {
    28. @Test
    29. public void testlistPage() {
    30. Map map = new HashMap();
    31. map.put("bname","圣墟");
    32. PageBean pageBean = new PageBean();
    33. pageBean.setPage(2);
    34. pageBean.setRows(10);
    35. bookBiz.listPager(map,pageBean).forEach(System.out::println);
    36. }
    37. @Test
    38. public void selectByPrimaryKey() {
    39. System.out.println(bookService.selectByPrimaryKey(10006));
    40. }
    41. }

    二,Aop整合pagehelper插件


    备注:

    需要解决的问题:

            利用pageHelper分页,pageHelper.start与后续结果处理即pageInfo处理代码是完全重复的

    根据Spring aop所学

    共性的非核心代码利用通知来解决

    核心业务代码,前后面都需要添加,共性的非核心业务

           

    思路:

    1.找到目标对象

    2.写通知

            2.1目标对象的方法中一定携带着目标对象

            2.2执行目标方法

             

    注意:记得开动态代理  

    使用AOP编程解决分页代码重复的问题

       @Around("execution(* *..*Service.*pager(..))")

       public Object invoke(ProceedingJoinPoint args)

    语法结构:execution(方法修饰符  方法返回值  方法所属类 匹配方法名 (  方法中的形参表 )  方法申明抛出的异常  )

    "*"  :代表一个任意类型的参数;

    “..”:代表零个或多个任意类型的参数。

     
     

    《代码演示》

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

    Mapper(配置文件)

    ‘接口类

    1. //利用第三方插件进行分页
    2. List listPager(Map map);

    测试类

    1. @Test
    2. public void listPager() {
    3. Map map = new HashMap();
    4. map.put("bname","圣墟");
    5. // pageBean.setPagination(false);
    6. pageBean.setPage(6);
    7. List books = this.bookService.listPager(map, pageBean);
    8. for (Map b : books) {
    9. System.out.println(b);
    10. }
    11. }

     好了本次分享结束我们下次见

  • 相关阅读:
    2022.11.15-二分图专练
    Lombok的常用注解
    手撕无头单链表
    Android音视频开发-AudioTrack
    英语——分享篇——每日200词——2801-3000
    HTML+CSS网页设计期末课程大作业 【茶叶文化网站设计题材】web前端开发技术 web课程设计 网页规划与设计
    c#利用Chart 画图
    Encrypt 加密/解密
    高性能计算与多模态处理的探索之旅:英伟达GH200性能优化与GPT-4V的算力加速未来
    【机器学习基础】——另一个视角解释SVM
  • 原文地址:https://blog.csdn.net/weixin_65565181/article/details/126344452