将 MyBatis 与 Spring 进行整合,主要解决的问题就是将 SqlSessionFactory 对象交由 Spring 来管理。所以该整合,只需要将 SqlSessionFactory 的对象生成器SqlSessionFactoryBean 注册在 Spring 容器中,再将其注入给 Dao 的实现类即可完成整合。
实现 Spring 与 MyBatis 的整合常用的方式:扫描的 Mapper 动态代理
Spring 像插线板一样,mybatis 框架是插头,可以容易的组合到一起。
插线板 spring 插上 mybatis,两个框架就是一个整体。
junit
junit
4.12
test
org.springframework
spring-context
5.3.26
org.springframework
spring-tx
5.3.26
org.springframework
spring-jdbc
5.3.26
org.mybatis
mybatis
3.5.11
org.mybatis
mybatis-spring
2.1.0
mysql
mysql-connector-java
8.0.29
com.alibaba
druid
1.2.8
src/main/java
**/*.properties
**/*.xml
false
org.apache.maven.plugins
maven-compiler-plugin
3.11.0
1.8
代码如下:
package com.ambow.pojo;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
private int age;
}
代码如下:
package com.ambow.dao;
import com.ambow.pojo.Student;
import java.util.List;
public interface StudentDao {
int insertStudent(Student student);
int updateStudent(Student student);
int deleteStudent(int id);
Student selectStudentById(int id);
List selectAllStudents();
}
在 Dao 接口的包中创建 MyBatis 的映射文件 mapper,命名与接口名相同,本例为 StudentDao.xml
mapper 中的 namespace 取值也为 Dao 接口 的全限定性名。
代码如下:
insert into student2 values(null,#{name},#{age})
update student2 set name = #{name},age = #{age} where id = #{id}
delete from student2 where id = #{id}
接口定义:
代码如下:
package com.ambow.service;
import com.ambow.pojo.Student;
import java.util.List;
public interface StudentService {
int addStudent(Student student);
int modifyStudent(Student student);
int removeStudent(int id);
Student findStudentById(int id);
List findAllStudents();
}
实现类定义:
代码如下:
package com.ambow.service.impl;
import com.ambow.dao.StudentDao;
import com.ambow.pojo.Student;
import com.ambow.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("studentService")
public class StudentServiceImpl implements StudentService {
//引入StudentDao的对象
@Autowired
private StudentDao studentDao;
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
}
@Override
public int addStudent(Student student) {
return studentDao.insertStudent(student);
}
@Override
public int modifyStudent(Student student) {
return studentDao.updateStudent(student);
}
@Override
public int removeStudent(int id) {
return studentDao.deleteStudent(id);
}
@Override
public Student findStudentById(int id) {
return studentDao.selectStudentById(id);
}
@Override
public List findAllStudents() {
return studentDao.selectAllStudents();
}
}
在 src 下定义 MyBatis 的主配置文件,命名为 mybatis.xml
这里有两点需要注意:
(1)主配置文件中不再需要数据源的配置了。因为数据源要交给 Spring 容器 来管理了。
(2)这里对 mapper 映射文件的注册,使用标签,即只需给出 mapper 映射文件所在的包即可。因为 mapper 的名称与 Dao 接口名相同, 可以使用这种简单注册方式。
这种方式的好处是:若有多个映射文件,这里的 配置也是不用改变的。当然,也可使用原来的标签方式。
(1) 数据源的配置(掌握)
使用 JDBC 模板,首先需要配置好数据源,数据源直接以 Bean 的形式配置 在 Spring 配置文件中。根据数据源的不同,其配置方式不同:
Druid 数据源 DruidDataSource Druid 是阿里的开源数据库连接池。是 Java 语言中最好的数据库连接 池。Druid 能够提供强大的监控和扩展功能。Druid 与其他数据库连接池的 最大区别是提供数据库的
官网:GitHub - alibaba/druid: 阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池 - GitHub - alibaba/druid: 阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池https://github.com/alibaba/druid
使用地址:Home · alibaba/druid Wiki · GitHub阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池 - Home · alibaba/druid Wikihttps://github.com/alibaba/druid/wiki/
常见问题
配置连接池:
Spring 配置文件:
代码如下:
(2) 从属性文件读取数据库连接信息
为了便于维护,可以将数据库连接信息写入到属性文件中,使 Spring 配置 文件从中读取数据。
属性文件名称自定义,但一般都是放在 src 下。
代码如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.2.111:3306/db1
jdbc.username=root
jdbc.password=Mysql666!
Spring 配置文件从属性文件中读取数据时,需要在的 value 属性中使用${ },将在属性文件中定义的 key 括起来,以引用指定属性的值。
该属性文件若要被 Spring 配置文件读取,其必须在配置文件中进行注册。 使用
该方式要求在 Spring 配置文件头部加入 spring-context.xsd 约束文件
(3) 注册 SqlSessionFactoryBean
代码如下:
(4) 定义 Mapper 扫描配置器 MapperScannerConfigurer
Mapper 扫描配置器 MapperScannerConfigurer 会自动生成指定的基本 包中 mapper 的代理对象。该 Bean 无需设置 id 属性。basePackage 使用分 号或逗号设置多个包。
代码如下:
向 Service 注入 Mapper 代理对象时需要注意,由于通过 Mapper 扫描配置器 MapperScannerConfigurer 生成的 Mapper 代理对象没有名称,所以在 向 Service 注入 Mapper 代理时,无法通过名称注入。但可通过接口的简单类名注入,因为生成的是这个 Dao 接口的对象。
代码如下:
代码如下:
项目整体结构如下图:
运行测试类test02:
运行测试类test03: