spring整合mybatis教程(详细易懂)

一、引言

1、Spring整合MyBatis的目的是?

将两个框架结合起来,以实现更好的开发体验和效果。Spring提供了一种轻量级的容器和依赖注入的机制,可以简化应用程序的配置和管理。而MyBatis是一个优秀的持久层框架,可以方便地进行数据库操作。通过整合Spring和MyBatis,可以充分发挥它们各自的优势,提高开发效率和代码质量。

二、Spring与MyBatis集成

注意!!!】整合的时候我们要导入我们的依赖、配置文件及测试是否整合成功

  1. pom依赖:spring、mybatis、logger、mysql、mybatis-spring、.....、junit、spring-test
  2. 配置文件:spring-context.xml、spring-mybatis.xml、jdbc.properties、generateConfig.xml、log4j.xml
  3. 测试:
    1. 根据表生成对应的实体类、mapper接口、mapper文件。
    2. 测试类标记为spring测试类,会用注解标记,就代表每一个测试方法,都会加载spring的上下文

1、导入pom依赖及插件

1.1、导入依赖


    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
    


①数据库连接池是什么?

        会初始化N个数据库链接对象,一般在10个,当需要用户请求操作数据库时候,那么就会直接在数据库连接池中获取链接,用完放回连接池中。

常见的数据库连接池有:dbcp2druidc3p0.

②lombok是什么?

        可以更加便捷的使用实体类


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

 1.2、导入插件


            
                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、配置文件

generatorConfig.xml




    
    

    
    

    
    
        
        
            
             
        

        
        

        
        
            
            
        

        
        
        
        
            
            
            
            
            
            
            
            
        

        
        
            
            
        

        
        
        
        
        
            
            
        

        
        
        
        
        
        
        
        
        
        
        
        
        

        

这里是自己本地路径的MySQL的jar包,是需要更改的,路径赋值后也需要再加上\

    
    

jdbc.properties

数据库的连接对象

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456

spring整合mybatis教程(详细易懂)_第1张图片

log4j2.xml





    
        
        /root/workspace/lucenedemo/logs
        /root/workspace/lucenedemo/logs/error
        /root/workspace/lucenedemo/logs/warn
        %d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n
    

    
        
        
            
            
            
            
            
        

        
        
        
            
        
        
        
            
            
            
            
                
                
                
                
                
                
            
        

        
            
            
            
                
                
            
            
            
        

        
            
            
            
                
                
                
            
        

    

    
    
        
        
        

        
        
        
        
        
        


        
        
            
            
            
            
        

    

spring-mybatis.xml

  1. 扫描所有JavaBean,将对应的组件加载到spring的上下文
  2. 配置session连接工厂
  3. 配置mapper扫描接口
  4. 配置事务管理器
  5. 配置aop自动代理


    
    
    
    
    

    

    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    

    
    
    
        
        
        
        
        
        
        
        
            
                
                    
                        
                            helperDialect=mysql
                        
                    
                
            
        
    

    
    
    
        
        
        
        
    

    
        
    
    
    


注意自己的包名路径,如果不更改后面测试会报错
spring整合mybatis教程(详细易懂)_第2张图片

spring整合mybatis教程(详细易懂)_第3张图片

 

spring-context.xml





    
    



生成model、mapper

选中对应的项目,依次选中生成

spring整合mybatis教程(详细易懂)_第4张图片

 

spring整合mybatis教程(详细易懂)_第5张图片

 

我们在生成的实体类上面添加@Repository@Repository就相当于

spring整合mybatis教程(详细易懂)_第6张图片

3、整合测试

1、建立BookbizBookBizImpl

一个接口和一个接口实现类 

spring整合mybatis教程(详细易懂)_第7张图片

把我们的生成的BookMapper里面的方法复制到我们新建的BookBiz里面

spring整合mybatis教程(详细易懂)_第8张图片

spring整合mybatis教程(详细易懂)_第9张图片 

package com.tgq.biz;

import com.tgq.model.Book;

/**
 * @软件包名 com.tgq.biz
 * @用户 tgq
 * @create 2023-08-25 下午4:46
 * @注释说明:
 */
public interface BookBiz {
    int deleteByPrimaryKey(Integer bid);

    int insert(Book record);

    int insertSelective(Book record);

    Book selectByPrimaryKey(Integer bid);

    int updateByPrimaryKeySelective(Book record);

    int updateByPrimaryKey(Book record);
}
package com.tgq.biz.impl;

import com.tgq.biz.BookBiz;
import com.tgq.mapper.BookMapper;
import com.tgq.model.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @软件包名 com.tgq.biz.impl
 * @用户 tgq
 * @create 2023-08-25 下午4:49
 * @注释说明:
 */
@Service//仓库的意思
public class BookBizImpl implements BookBiz {

    @Autowired//相当于get、set
    private BookMapper bookBiz;

    @Override
    public int deleteByPrimaryKey(Integer bid) {
        return bookBiz.deleteByPrimaryKey(bid);
    }

    @Override
    public int insert(Book record) {
        return bookBiz.insert(record);
    }

    @Override
    public int insertSelective(Book record) {
        return bookBiz.insertSelective(record);
    }

    @Override
    public Book selectByPrimaryKey(Integer bid) {
        return bookBiz.selectByPrimaryKey(bid);
    }

    @Override
    public int updateByPrimaryKeySelective(Book record) {
        return bookBiz.updateByPrimaryKeySelective(record);
    }

    @Override
    public int updateByPrimaryKey(Book record) {
        return bookBiz.updateByPrimaryKey(record);
    }
}

 

2、创建测试类

创建BookBizImpl测试类

spring整合mybatis教程(详细易懂)_第10张图片

 

我们调用一个测试方法进行测试

package com.tgq.biz.impl;

import com.tgq.biz.BookBiz;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

/**
 * @软件包名 com.tgq.biz.impl
 * @用户 tgq
 * @create 2023-08-25 下午4:56
 * @注释说明:
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-context.xml"})
public class BookBizImplTest {

    @Autowired//相当于get、set
    private BookBiz bookBiz;

    @Before
    public void setUp() throws Exception {
    }

    @After
    public void tearDown() throws Exception {
    }

    @Test
    public void deleteByPrimaryKey() {
    }

    @Test
    public void insert() {
    }

    @Test
    public void insertSelective() {
    }

    @Test
    public void selectByPrimaryKey() {
        System.out.println(this.bookBiz.selectByPrimaryKey(60));
    }

    @Test
    public void updateByPrimaryKeySelective() {
    }

    @Test
    public void updateByPrimaryKey() {
    }
}

测试结果spring整合mybatis教程(详细易懂)_第11张图片


 

3、实体类的更改

我们的实体类创建属性的时候我写get、set等方法,过于麻烦,但是我们有一个lombok,可以节约掉这些。

1、没有lombok的实体类 

package com.tgq.model;

public class Book {
    private Integer bid;

    private String bname;

    private Float price;

    public Book(Integer bid, String bname, Float price) {
        this.bid = bid;
        this.bname = bname;
        this.price = price;
    }

    public Book() {
        super();
    }

    public Integer getBid() {
        return bid;
    }

    public void setBid(Integer bid) {
        this.bid = bid;
    }

    public String getBname() {
        return bname;
    }

    public void setBname(String bname) {
        this.bname = bname;
    }

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }
}

2、有lombok的实体类 

package com.tgq.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//get、set、tostring
@Data
//有参构造器
@AllArgsConstructor
//无参构造器
@NoArgsConstructor
public class Book {
    private Integer bid;

    private String bname;

    private Float price;

}

这样看过去就节约了很多的代码

当然使用方法是一样的
 

三、Spring Aop集成PageHelper插件

1、回顾之前

回顾之前我们用的是插件,或者插件和自己写的分页类。

例如:

  1. 配置xml和生成的接口方法
        
    
    List selectPager(Book book);

  2. 实现接口和接口实现类

        List selectPager(Book book, PageBean pageBean);
        @Override
        public List selectPager(Book book, PageBean pageBean) {
            if (pageBean != null && pageBean.isPagination())
                PageHelper.startPage(pageBean.getPage(), pageBean.getRows());
            List books = bookBiz.selectPager(book);
            if (pageBean != null && pageBean.isPagination()) {
                PageInfo info = new PageInfo<>(books);
                pageBean.setTotal((int) info.getTotal());
            }
            return books;
        }

  3. 生成测试方法并进行测试

        @Test
        public void selectPager() {
            Book book = new Book();
            PageBean pageBean = new PageBean();
            pageBean.setPage(2);
            pageBean.setRows(30);
            book.setBname("圣墟");
            this.bookBiz.selectPager(book, pageBean);
        }

    测试结果spring整合mybatis教程(详细易懂)_第12张图片

     

2、优化

如何优化我们前面写的代码呢?

//        if (pageBean != null && pageBean.isPagination())
//            PageHelper.startPage(pageBean.getPage(), pageBean.getRows());
//        List books = bookBiz.selectPager(book);
//        if (pageBean != null && pageBean.isPagination()) {
//            PageInfo info = new PageInfo<>(books);
//            pageBean.setTotal((int) info.getTotal());
//        }
//        return books;

需要用到环绕通知,编写切面类。

所以我们编写一个切面包和PagerAspect

  1.  在前面写的接口实现类selectPager方法进行修改
    package com.tgq.biz.impl;
    
    import com.tgq.biz.BookBiz;
    import com.tgq.mapper.BookMapper;
    import com.tgq.model.Book;
    import com.tgq.utils.PageBean;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    
    /**
     * @软件包名 com.tgq.biz.impl
     * @用户 tgq
     * @create 2023-08-25 下午4:49
     * @注释说明:
     */
    @Service//仓库的意思
    public class BookBizImpl implements BookBiz {
    
        @Autowired//相当于get、set
        private BookMapper bookBiz;
    
    
        @Override
        public List selectPager(Book book, PageBean pageBean) {
    
            return bookBiz.selectPager(book);
        }
    }
    

  2. 在切面类PagerAspect里面编写方法,该有的注释也在里面,我这里就不一一的解释了。

    package com.tgq.aspect;
    
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    import com.tgq.utils.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;
    
    /**
     * @软件包名 com.tgq.aspect
     * @用户 tgq
     * @create 2023-08-25 下午9:26
     * @注释说明:
     */
    @Aspect //代表当前类为切面类
    @Component //代表该类交给spring进行管理
    public class PagerAspect {
        /**
         * * *..*biz.*Pager(..)
         * * : 任意返回值
         * *..: 任意版本 不限层级
         * *biz :以biz结尾的接口/类
         * *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((int) pageInfo.getTotal()); } return list; } }

  3. 还是运行上面一样的测试类的方法

        @Test
        public void selectPager() {
            Book book = new Book();
            PageBean pageBean = new PageBean();
            pageBean.setPage(2);
            pageBean.setRows(30);
            book.setBname("圣墟");
            this.bookBiz.selectPager(book, pageBean);
        }

    测试结果spring整合mybatis教程(详细易懂)_第13张图片

     

感谢支持!!!

你可能感兴趣的:(spring,mybatis,java)