MyBatis集成Spring流程详解

一、Mybatis与spring集成

1. 导入pom依赖


    UTF-8
    1.8
    1.8
    3.7.0
    
    
    5.0.2.RELEASE
    
    3.4.5
    
    5.1.44
    
    5.1.2
    
    1.3.1
    
    2.1.1
    2.4.3
    
    2.9.1
    
    4.12
    4.0.0
    1.18.2


    
    
        org.springframework
        spring-context
        ${spring.version}
    
    
        org.springframework
        spring-orm
        ${spring.version}
    
    
        org.springframework
        spring-tx
        ${spring.version}
    
    
        org.springframework
        spring-aspects
        ${spring.version}
    
    
        org.springframework
        spring-web
        ${spring.version}
    
    
        org.springframework
        spring-test
        ${spring.version}
    
    
    
        org.mybatis
        mybatis
        ${mybatis.version}
    
    
    
        mysql
        mysql-connector-java
        ${mysql.version}
    
    
    
        com.github.pagehelper
        pagehelper
        ${pagehelper.version}
    
    
    
        org.mybatis
        mybatis-spring
        ${mybatis.spring.version}
    
    
    
        org.apache.commons
        commons-dbcp2
        ${commons.dbcp2.version}
    
    
        org.apache.commons
        commons-pool2
        ${commons.pool2.version}
    
    
    
    
        org.apache.logging.log4j
        log4j-core
        ${log4j2.version}
    
    
        org.apache.logging.log4j
        log4j-api
        ${log4j2.version}
    
    
    
        org.apache.logging.log4j
        log4j-web
        ${log4j2.version}
    
    
    
        junit
        junit
        ${junit.version}
        test
    
    
        javax.servlet
        javax.servlet-api
        ${servlet.version}
        provided
    
    
        org.projectlombok
        lombok
        ${lombok.version}
        provided
    


    
    
        src/main/java
        
            **/*.xml
        
    
    
    
        src/main/resources
        
            jdbc.properties
            *.xml
        
    


    org.apache.maven.plugins
    maven-compiler-plugin
    ${maven.compiler.plugin.version}
    
        ${maven.compiler.source}
        ${maven.compiler.target}
        ${project.build.sourceEncoding}
    


    org.mybatis.generator
    mybatis-generator-maven-plugin
    1.3.2
    
        
        
            mysql
            mysql-connector-java
            ${mysql.version}
        
    
    
        true
    

2. 编写配置文件

applicationContext-mybatis.xml



    
    
    
    
    
    
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    
    
    
    
        
        
        
        
        
        
        
        
            
                
                    
                        
                            helperDialect=mysql
                        
                    
                
            
        
    
    
    
    
        
        
        
        
    
    
        
    
    
    

3. 使用注解开发

@Repository:将DAO类声明为Bean

@Service:通常作用在业务层

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

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

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

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

4. 测试

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

package com.xlb.biz.impl;
import com.xlb.biz.BookBiz;
import com.xlb.mapper.BookMapper;
import com.xlb.model.Book;
import com.xlb.model.BookVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class BookBizImpl implements BookBiz {
    @Autowired
    private BookMapper bookMapper;
    //Alt+Enter 快速构建实现类,填充代码的前半部分 Ctrl+1
    //Alt+Insert 快速提供set/get/toString/构造方法

    /*public BookMapper getBookMapper() {
        return bookMapper;
    }
    public void setBookMapper(BookMapper bookMapper) {
        this.bookMapper = bookMapper;
    }*/
    @Override
    public int deleteByPrimaryKey(Integer bid) {
        return bookMapper.deleteByPrimaryKey(bid);
    }
    @Override
    public Book selectByPrimaryKey(Integer bid) {
        return bookMapper.selectByPrimaryKey(bid);
    }
    @Override
    public List selectByIn(List bookIds) {
        return bookMapper.selectByIn(bookIds);
    }
    public List selectBooksLike1(String bname){
        return  bookMapper.selectBooksLike1(bname);
    }
    public List selectBooksLike2(String bname){
        return  bookMapper.
    selectBooksLike2(bname);
}
    public List selectBooksLike3(String bname){
        return  bookMapper.selectBooksLike3(bname);
    }
    @Override
    public List list1() {
        return bookMapper.list1();
    }
    @Override
    public List list2() {
        return bookMapper.list2();
    }
    @Override
    public List list3(BookVo vo) {
        return bookMapper.list3(vo);
    }
    @Override
    public List list4() {
        return bookMapper.list4();
    }
    @Override
    public Map list5(Map map) {
        return bookMapper.list5(map);
    }
    @Override
    public List list6(BookVo bookVo) {
        return bookMapper.list6(bookVo);
    }
    @Override
    public List list7(BookVo bookVo) {
        return list7(bookVo);
    }
}

5. 管理数据源

管理sqlsession

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

MyBatis集成Spring流程详解_第1张图片

然后在测试类里面添加:

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations={“classpath:applicationContext-mybatis.xml”})

package com.xlb.biz.impl;
import com.xlb.biz.BookBiz;
import com.xlb.mapper.BookMapper;
import com.xlb.model.BookVo;
import com.xlb.util.SessionUtil;
import com.xlb.biz.impl.BookBizImpl;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext-mybatis.xml"})
public class BookBizImplTest {
    private BookBiz bookBiz;
    private SqlSession sqlSession;
    @Before
    public void setUp() throws Exception {
        System.out.println("初始化方法...");
        BookBizImpl bookBiz = new BookBizImpl();
        //工具类中获取session对象
        sqlSession = SessionUtil.openSession();
        System.out.println(sqlSession+"初始化方法");
        //从session对象中获取mapper对象
        BookMapper mapper = sqlSession.getMapper(BookMapper.class);
        bookBiz.setBookMapper(mapper);
        this.bookBiz = bookBiz;
    }
    @After
    public void tearDown() throws Exception {
        System.out.println("方法测试结束...");
        System.out.println(sqlSession);
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void deleteByPrimaryKey() {
        bookBiz.deleteByPrimaryKey(44);
        sqlSession.commit();
        sqlSession.close();
    }
    @Test
    public void selectByPrimaryKey() {
        System.out.println("测试的业务方法...");
        System.out.println(bookBiz.selectByPrimaryKey(44));
    }
    @Test
    public void text3() {
       int[] ints = {1,2,3,4};
       //将数组变为字符串
        StringBuffer sb = new StringBuffer();
        for (int i : ints){
            sb.append(",").append(i);
        }
        String s = sb.toString();
        System.out.println(s.substring(1));
    }
    @Test
    public void selectByIn() {
        List integers = Arrays.asList(new Integer[] {33,34,32});
        bookBiz.selectByIn(integers).forEach(System.out::println);
    }
    @Test
    public void selectBooksLike1() {
        bookBiz.selectBooksLike1("%圣嘘%").forEach(System.out::println);
    }
    @Test
    public void selectBooksLike2() {
        bookBiz.selectBooksLike2("%圣嘘%").forEach(System.out::println);
    }
    @Test
    public void selectBooksLike3() {
        bookBiz.selectBooksLike3("圣嘘").forEach(System.out::println);
    }
    @Test
    public void list1() {
        bookBiz.list1().forEach(System.out::println);
    }
    @Test
    public void list2() {
        bookBiz.list2().forEach(System.out::println);
    }
    @Test
    public void list3() {
        BookVo vo = new BookVo();
        vo.setBooKIds(Arrays.asList(new Integer[]{31,32,33,34}));
        bookBiz.list3(vo).forEach(System.out::println);
    }
    @Test
    public void list4() {
        bookBiz.list4().forEach(System.out::println);
    }
    @Test
    public void list5() {
        Map map = new HashMap();
        map.put("bid",32);
        System.out.println(bookBiz.list5(map));
    }
    @Test
    public void list6() {
        BookVo vo = new BookVo();
        vo.setMax(45);
        vo.setMin(35);
        bookBiz.list6(vo).forEach(System.out::println);
    }
    @Test
    public void list7() {
        BookVo vo = new BookVo();
        vo.setMax(45);
        vo.setMin(35);
        bookBiz.list7(vo).forEach(System.out::println);
    }
}

结果

MyBatis集成Spring流程详解_第2张图片

二、Aop整合pagehelper插件

要解决的问题

  @Override
    public List listPager(Map map, PageBean pageBean) {
        //pageHelper分页插件相关代码
        if(pageBean != null && pageBean.isPagination()){
            PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        }
        List maps=bookMapper.listPager(map,pageBean);
        if(pageBean != null && pageBean.isPagination()){
            //处理查询结果的前提,是需要分页的
            PageInfo info=new PageInfo(maps);
            pageBean.setTotal(info.getTotal()+"");
        }
        return maps;
    }

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

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

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

2、写通知

目标对象该方法一定携带了PageBean对象

注解:@aspect:相当于配置了环绕通知

       @component:交给Spring进行管理

       @excution

建立一个切面类:PageAspect

package com.xlb.ssm.aspect;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xlb.ssm.entity.PageBean;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Aspect
public class PageAspect {
    /**
     * *:返回值
     * *..:无限包
     * *Service:以Service结尾的接口名
     * .Pager:以Pager方法
     * 只要同时匹配上诉四个条件,就会被列为目标对象
     * 上诉配置要生效,代理注释一定要打开:
     * @param args
     * @return
     * @throws Throwable
     */
    @Around("execution(* *..*Biz.*Pager(..))")
    public Object invoke(ProceedingJoinPoint args) throws Throwable {
        Object[] params = args.getArgs();
        PageBean pageBean = null;
        for (Object param : params) {
            if(param instanceof PageBean){
                pageBean = (PageBean)param;
                break;
            }
        }
        if(pageBean != null && pageBean.isPagination())
            PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        Object list = args.proceed(params);
        if(null != pageBean && pageBean.isPagination()){
            PageInfo pageInfo = new PageInfo((List) list);
            pageBean.setTotal(pageInfo.getTotal()+"");
        }
        return list;
    }
}

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

测试一下

    @Test
    public void listPager() {
        Map map=new HashMap();
        map.put("bname","圣墟");
        //查询出第二页的20条数据
        PageBean pageBean=new PageBean();
        pageBean.setPage(2);
        pageBean.setRows(20);
        bookBiz.listPager(map,pageBean).forEach(System.out::println);
    }

结果:

MyBatis集成Spring流程详解_第3张图片

到此这篇关于MyBatis集成Spring流程详解的文章就介绍到这了,更多相关MyBatis集成Spring内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(MyBatis集成Spring流程详解)