Spring Boot与MyBatis完美融合:整合实战指南

目录

1、梳理整合思路

2、整合实现

2.1 环境搭建

2.2 案例

3、整合mybatis-plus报错

1. 依赖问题

2. 配置问题

3. Mapper接口与XML文件问题

4. 实体类问题

5. 数据库连接问题

6. SQL语句问题

7. Spring容器问题

8. 其他


1、梳理整合思路

  1. 将MyBatis的DataSource交给Spring IoC容器创建并管理,使用第三方数据库连接池(Druid,C3P0等)代替MyBatis内置的数据库连接池
  2. 将MyBatis的SqlSessionFactory交给Spring IoC容器创建并管理,使用spring-mybatis整合jar包中提供的SqlSessionFactoryBean类代替项目中的MyBatisUtil工具类
  3. 将MyBatis的接口代理方式生成的实现类,交给Spring IoC容器创建并管理

mybatis框架开发步骤

定义mapper接口,定义方法
定义mapper.xml映射文件
创建mybatis核心配置文件
创建SqlSession对象,使用该对象生成mapper接口的代理对象执行方法

spring整合mybatis的核心就是把mybatis开发用到的对象交由spring容器ioc来创建,这样就做到了整合的目的。
在开发中,我们一般不使用mybatis自带的数据源,而是使用别的数据源,比如c3p0,dbcp等,本人使用的是阿里的druid数据源。

2、整合实现

2.1 环境搭建

导入相关依赖:


    
    
      junit
      junit
      4.11
      test
    
    
    
      org.springframework
      spring-context
      5.2.5.RELEASE
    
    
      org.springframework
      spring-jdbc
      5.2.5.RELEASE
    
    
    
      org.mybatis
      mybatis
      3.5.1
    
    
    
      org.mybatis
      mybatis-spring
      1.3.1
    
    
    
      mysql
      mysql-connector-java
      5.1.9
    
    
    
      com.alibaba
      druid
      1.1.12
    
  

  
    
    
      
        src/main/java
        
          **/*.properties
          **/*.xml
        
        false
      
    
    
    
      
        maven-compiler-plugin
        3.1
        
          1.8
          1.8
        
      
    
  

重点是注意resources标签的配置,很多人都是在这里出错导致程序运行报错找不到mapper.xml文件

2.2 案例

本案例从student表中查询学生和新增学生功能。

//实体类Student
public class Student {
    private int stuNo;
    private String stuName;
    private int cardID;
    private int classID;
    public Student() {
    }
    public Student(int stuNo, String stuName, int cardID, int classID) {
        this.stuNo = stuNo;
        this.stuName = stuName;
        this.cardID = cardID;
        this.classID = classID;
    }
    public int getStuNo() {
        return stuNo;
    }
    public void setStuNo(int stuNo) {
        this.stuNo = stuNo;
    }
    public String getStuName() {
        return stuName;
    }
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }
    public int getCardID() {
        return cardID;
    }
    public void setCardID(int cardID) {
        this.cardID = cardID;
    }
    public int getClassID() {
        return classID;
    }
    public void setClassID(int classID) {
        this.classID = classID;
    }
    @Override
    public String toString() {
        return "Student{" +
                "stuNo=" + stuNo +
                ", stuName='" + stuName + '\'' +
                ", cardID=" + cardID +
                ", classID=" + classID +
                '}';
    }
}

mapper接口

public interface StudentMapper {
    //查询全部
    List queryAll();
    //新增学生
    void addStudent(Student student);
}

mapper.xml映射文件





    
    

    
    
        insert into student (stuno,stuname,cardid,classid)
        values (#{stuNo},#{stuName},#{cardID},#{classID})
    

service接口

public interface IStudentService {
    List queryAll();
    void addStudent(Student student);
}

service实现类

public class StudentServiceImpl implements IStudentService {
    //mapper属性
    private StudentMapper mapper;
    //set注入给mapper对象赋值
    public void setMapper(StudentMapper mapper) {
        this.mapper = mapper;
    }
    
    @Override
    public List queryAll() {
        return mapper.queryAll();
    }

    @Override
    public void addStudent(Student student) {
        mapper.addStudent(student);
    }
}

mybatis核心配置文件




    
        
        
    
    
    
        
    

在这里由于数据源对象我们是交由spring容器托管了,因此mybatsi核心配置文件中就没有environments标签了。

spring配置文件




    
    
    
    
        

        
        
        
        
    

    
    
        
        
        
        
        
    

    
    
        
        
        
        
    

    
    
        
    

数据库配置文件

url = jdbc:mysql://localhost:3306/Xxx?characterEncoding=utf8&useSSL=true&serverTimezone=UTC
username = Xxx
password = Xxx

测试

    //执行查询全部,不使用service
    @Test
    public void test02() {
        String config = "applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);
        //获取mapper的代理对象
        StudentMapper mapper = (StudentMapper) ac.getBean("studentMapper");
        List students = mapper.queryAll();
        for (Student student : students) {
            System.out.println("student--->"+student);
        }
    }

    //执行增加学生,使用service
    @Test
    public void test03() {
        String config = "applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);
        //获取service对象
        IStudentService service = (IStudentService) ac.getBean("studentServiceImpl");
        Student student = new Student();
        student.setStuName("呵呵");
        student.setStuNo(1111);
        student.setCardID(1115);
        student.setClassID(1);
        service.addStudent(student);

    }

3、整合mybatis-plus报错

1. 依赖问题

  • 依赖未正确添加:确保在pom.xmlbuild.gradle中添加了MyBatis-Plus的依赖。
  • 版本不兼容:使用的MyBatis-Plus版本与Spring Boot版本不兼容。请检查并更新为兼容的版本。

2. 配置问题

  • 配置文件缺失或错误:确保application.propertiesapplication.yml中有正确的MyBatis-Plus配置。
  • Mapper扫描路径错误@MapperScan注解指定的路径与Mapper接口所在包不一致。

3. Mapper接口与XML文件问题

  • Mapper接口未标注:Mapper接口未使用@Mapper@Repository注解标注。
  • XML文件位置错误:XML文件位置与配置文件中指定的位置不一致。
  • XML文件命名空间错误:XML文件中的namespace与Mapper接口的全路径不一致。

4. 实体类问题

  • 实体类注解缺失或错误:如@TableName@TableId等注解未使用或使用错误。
  • 字段类型不匹配:数据库字段类型与实体类字段类型不匹配。

5. 数据库连接问题

  • 数据库URL错误:数据库URL、用户名、密码等配置错误。
  • 驱动未添加:未添加数据库驱动依赖。

6. SQL语句问题

  • SQL语句错误:XML文件中的SQL语句语法错误或逻辑错误。
  • 占位符错误:在SQL语句中使用了错误的占位符。

7. Spring容器问题

  • Bean创建失败:由于配置错误或依赖问题,Spring容器无法创建所需的Bean。
  • 循环依赖:Bean之间存在循环依赖,导致Spring容器无法初始化。

8. 其他

  • IDE或构建工具问题:IDE或构建工具缓存导致的问题,可以尝试清理缓存并重新构建项目。
  • 代码错误:代码中存在逻辑错误或语法错误。

你可能感兴趣的:(Spring Boot与MyBatis完美融合:整合实战指南)