• mybatis与spring集成


    目录

    一、SSM整合

    二、AOP整合分页插件


     

    一、SSM整合

    1.添加相关依赖

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

            spring:spring-context.xml

            mybatis:mybatis.cfg.xml

            spring-mybatis.xml

                    (1)扫描注解驱动

                    (2)添加并管理数据源——>管理sqlsession

                    (3)扫描所有的Mapper接口

                    (4)添加事务管理器

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

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

    要注意更改路径:

     

    javabean交给Spring进行管理?

    @service

    在BookBizImpl上方添加@service注解

    @autowised

    在属性上方添加@autowised

    @Respository

    标记Mapper接口被Spring所接管

     
    

     测试:

    1. @Test
    2. public void selectByPrimaryKey() {
    3. System.out.println("测试的业务方法...");
    4. // System.out.println(bookBiz.getBookMapper());
    5. System.out.println(bookBiz.selectByPrimaryKey(43));
    6. }

    运行效果:

    ssm整合成功!

    二、AOP整合分页插件

    注意:记得开动态代理

     解决的问题:

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

    根据Spring aop所学,共性的非核心的业务代码利用通知来解决,核心业务代码前后都需要添加共性的非核心业务代码,利用环绕通知来解决。

    分析:

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

    2、写通知

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

    2.2、执行

    if(pageBean != null && pageBean.isPagination()){
            PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        }

    代码

    2.3、执行目标方法

    2.4、 if(pageBean != null && pageBean.isPagination()){
    //            处理查询结果的前提,是需要分页的
                PageInfo info=new PageInfo(maps);
                pageBean.setTotal(info.getTotal()+"");
            }

    @aspect——>代表了通知/切面

    @component——>交给Spring进行管理

    @Around 代表环绕通知

    BookBizImpl :

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

    PagerAspect : 

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

    BookBizImplTest2 :

    1. package com.zking.ssm;
    2. import com.zking.mapper.biz.BookBiz;
    3. import com.zking.mapper.util.PageBean;
    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. import java.util.Arrays;
    12. import java.util.HashMap;
    13. import java.util.List;
    14. import java.util.Map;
    15. /**
    16. * @author 杨总
    17. * @create 2022-08-10 23:21
    18. */
    19. @RunWith(SpringJUnit4ClassRunner.class)
    20. @ContextConfiguration(locations={"classpath:applicationContext-mybatis.xml"})
    21. public class BookBizImplTest2 {
    22. @Autowired
    23. private BookBiz bookBiz;
    24. // private SqlSession sqlSession;
    25. @Before
    26. public void setUp() throws Exception {
    27. System.out.println("初始化方法...");
    28. }
    29. @After
    30. public void tearDown() throws Exception {
    31. System.out.println("方法测试结束...");
    32. }
    33. @Test
    34. public void deleteByPrimaryKey() {
    35. bookBiz.deleteByPrimaryKey(43);
    36. }
    37. @Test
    38. public void selectByPrimaryKey() {
    39. System.out.println("测试的业务方法...");
    40. // System.out.println(bookBiz.getBookMapper());
    41. System.out.println(bookBiz.selectByPrimaryKey(43));
    42. }
    43. @Test
    44. public void test3() {
    45. int[] ints={1,2,3,4,5,6};
    46. // 将数据编程字符串 1,2,3,4,5,6
    47. StringBuffer sb=new StringBuffer();
    48. for (int i:ints){
    49. sb.append(",").append(i);
    50. }
    51. String s=sb.toString();
    52. System.out.println(s.substring(1));
    53. }
    54. @Test
    55. public void selectByIn(){
    56. List<Integer> bookIds = Arrays.asList(new Integer[]{31, 32, 33, 34});
    57. bookBiz.selectByIn(bookIds).forEach(System.out::println);
    58. }
    59. @Test
    60. public void getBookMapper() {
    61. }
    62. @Test
    63. public void setBookMapper() {
    64. }
    65. @Test
    66. public void testlistPager(){
    67. Map map=new HashMap();
    68. map.put("bname","圣墟");
    69. PageBean pageBean=new PageBean();
    70. pageBean.setPage(2);
    71. pageBean.setPage(20);
    72. bookBiz.listPager(map,pageBean).forEach(System.out::println);
    73. }
    74. }

    分页运行效果:

    今日分享就此结束,再见~

  • 相关阅读:
    Windows环境VSCode配置OpenCV-环境搭建(一)
    记一次springboot项目结合arthas排查ClassNotFoundException问题
    【LeetCode】双指针求解和为s的两个数字
    在使用高防IP的时候易出现什么问题,该如何解决呢?
    手写堆与堆的常见操作
    GTX314L国产替代SI314—低功耗14通道电容触摸传感器芯片
    小程序开发——小程序的事件
    多线程难点
    基于flowable的upp(统一流程平台)运行性能优化(2)
    蓝桥杯-星期一
  • 原文地址:https://blog.csdn.net/weixin_65808248/article/details/126318556