龙空技术网

Java开发:Mybatis中Mapper接口与映射文件的绑定

尚硅谷教育 354

前言:

此刻朋友们对“java映射文件”可能比较关怀,我们都需要学习一些“java映射文件”的相关内容。那么小编也在网络上网罗了一些关于“java映射文件””的相关知识,希望各位老铁们能喜欢,姐妹们一起来了解一下吧!

MyBatis 是一款优秀的半自动化ORM持久层框架,它支持自定义 SQL、存储过程以及高级映射。它大量地简化了我们的操作。我们在使用Mybatis进行开发时,通常会选择xml文件来写对应的SQL,然后将Mapper接口与SQL的xml文件绑定,最后在项目中调用Mapper接口就可以执行对应的SQL。那么如何将Mapper接口与SQL绑定呢?接下来我们就来探讨一下。

一、环境搭建

首先我们进行一下Mybatis环境的搭建。我们使用Maven+SpringBoot的环境进行搭建。数据库我们采用MySQL的8.0.16版本。

1.1数据库准备

首先我们先把数据库需要的表创建出来:

SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------

-- Table structure for tbl_employee

-- ----------------------------

DROP TABLE IF EXISTS `tbl_employee`;

CREATE TABLE `tbl_employee` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`last_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

`email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,

`salary` double(10, 2) NULL DEFAULT NULL,

`dept_id` int(11) NULL DEFAULT NULL,

PRIMARY KEY (`id`) USING BTREE

) ENGINE = InnoDB AUTO_INCREMENT = 22 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

SET FOREIGN_KEY_CHECKS = 1;

1.2环境的准备

由于我们是Maven的项目,需要准备好相关依赖,pom依赖文件如下:

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.3.4.RELEASE</version>

</parent>

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency>

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

<artifactId>mybatis-spring-boot-starter</artifactId>

<version>2.2.0</version>

</dependency>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

</dependency>

</dependencies>

创建SpringBoot的启动类,这块需要注意下第二行,我们要进行一下Mapper路径的扫描,使我们的Mapper接口可以成功被扫描到:

@SpringBootApplication

@MapperScan("com.atguigu.sun.mapper")

public class MainApplication {

public static void main(String[] args) {

SpringApplication.run(MainApplication.class, args);

}

}

我们在application.properties中配置连接MySQL的相关参数:

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/could2021?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8

spring.datasource.username=root

spring.datasource.password=123456

创建tbl_employee表对应的实体类Employee:

public class Employee implements Serializable {

private static final long serialVersionUID = 1917969510394772466L;

private Integer id;

private String lastName;

private String email;

private Double salary;

//员工所属部门信息

@Override

public String toString() {

return "Employee{" +

"id=" + id +

", lastName='" + lastName + '\'' +

", email='" + email + '\'' +

", salary=" + salary +

'}';

}

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getLastName() {

return lastName;

}

public void setLastName(String lastName) {

this.lastName = lastName;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

public Double getSalary() {

return salary;

}

public void setSalary(Double salary) {

this.salary = salary;

}

public Employee() {

}

public Employee(Integer id, String lastName, String email, Double salary) {

this.id = id;

this.lastName = lastName;

this.email = email;

this.salary = salary;

}

}

创建对应的Mapper接口,EmployeeMapper接口类:

package com.atguigu.sun.mapper;

@Repository

public interface EmployeeMapper {

public List<Employee> selectEmpByEmp(Employee employee);

}

对应的映射文件EmployeeMapper.xml的准备,由于本篇文章重点研究接口与映射文件的绑定情况,因此我们的映射文件内容操作均为同一个,根据条件查询表数据,具体如下:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

";>

<mapper namespace="com.atguigu.sun.mapper.EmployeeMapper">

<sql id="select_employee">

SELECT

id,

last_name,

email,

salary,

dept_id

FROM

tbl_employee

</sql>

<select id="selectEmpByEmp" resultType="com.atguigu.sun.bean.Employee">

<include refid="select_employee"></include>

<where>

<if test="id != null">

<!-- id = #{id} -->

id = #{id}

</if>

<if test="lastName != null">

AND last_name = #{lastName}

</if>

<if test="email != null">

AND email = #{email}

</if>

<if test="salary != null">

AND salary = #{salary}

</if>

</where>

</select>

</mapper>

最后就是测试类的准备,用来测试我们的用例:

@SpringBootTest

public class test {

@Autowired

private EmployeeMapper employeeMapper;

@Test

public void testSelectList() {

Employee empParam = new Employee();

empParam.setId(2);

empParam.setLastName("chengcheng2");

List<Employee> employees = employeeMapper.selectEmpByEmp(empParam);

System.out.println("employees = " + employees);

}

}

以上所有的文件都是为了我们可以通过Mybatis操作数据库做的准备,基本上都是使用操作Mybatis的套路,没有特殊需要关注的。接下来我们进入正题,研究一下,我们是如何告知Mybatis的,使我们写的Mybatis接口与我们的xml映射文件进行对应。

二、Mapper接口与映射文件的绑定

2.1默认方式

采用默认的绑定方式,就是不需要我们做其他额外的操作,重点是需要遵循规则就好:

xml的目录结构,与Mapper接口的包路径完全一致xml文件名与Mapper接口名完全一致(注意大小写都要完全一致)

具体如上图所示,我们可以先看一下上面环境搭建的文件所属位置,接下来我们看一下重点:我们的EmployeeMapper接口与其对应的映射文件所属的包名均为"com.atguigu.sun.mapper",同时名字也是一致的。因此我们的测试类可以正常的访问数据库,结果如下:

employees = [Employee{id=2, lastName='null', email='chengcheng@163.com', salary=100000.0}]

如果采用了这种方式,代码依旧报错,查询不到数据,可以做一下排查,查看我们的target,看看两者之间的对应关系:

保持如上图所示,查看我们的接口和对应的映射文件是否在一起,在一起就基本没有问题。当然基于上图,我们可以直接将xml文件,与mapper接口写在一起,不放在资源路径resources下面。

2.2SpringBoot配置

而我们的第二种方式就相对起来简单了,也是较为常用的用法。SpringBoot给我们提供了一个配置来指定Mapper接口与SQL的绑定,一行配置即可,简单粗暴。在我们的application.properties配置文件中配置即可:

mybatis.mapper-locations= classpath:mappers/*.xml

配置好这行,他就会自动加载classpath下的mappers包下以.xml结尾的所有文件,不需要指定层级一样。详情如下所示:

2.3Mapper标签

而我们的第三种方式是基于我们的mapper标签进行设定,需要mapper标签的话,我们需要一个Mybatis的配置文件,之后通过SpringBoot的配置参数指定该配置文件。

首先我们创建Mybatis的相关配置文件mybatis-config.xml,在里面配置好我们的mapper标签:

<!DOCTYPE configuration

PUBLIC "-//ibatis.apache.org//DTD Config 3.1//EN"

";>

<configuration>

<mappers>

<mapper resource="mappers/EmployeeMapper.xml"/>

</mappers>

</configuration>

之后在application.properties配置文件中指定mybatis-config.xml配置文件:

mybatis.config-location=classpath:mybatis-config.xml

通过这种方式,我们可以进行Mapper接口和对应映射文件之间的匹配了。可以正常的访问数据库信息了:

employees = [Employee{id=2, lastName='null', email='chengcheng@163.com', salary=100000.0}]

2.4SqlSessionFactory

我们还可以通过SqlSessionFactory来进行配置指定我们的xml映射文件。那么我们先说一下SqlSessionFactory。

在我们Spring整合Mybatis的时候,会将我们Mybatis的DAO层的Mapper接口交给Spring去管理,我们都是这样手写创建SqlSessionFactory对象,然后创建DAO层对象:

public SqlSessionFactory getSqlSessionFactory(){

SqlSessionFactory sqlSessionFactory = null;

try {

String resource = "mybatis-config.xml";

InputStream inputStream = Resources.getResourceAsStream(resource);

sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

} catch (IOException e) {

e.printStackTrace();

}

return sqlSessionFactory;

}

然后我们通过SqlSessionFactory来获取我们对应的Mapper对象,然后进行其操作:

SqlSession sqlSession = sqlSessionFactory.openSession();

EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);

那么我们依旧可以通过SqlSessionFactory来指定我们的映射文件路径,由于我们是SpringBoot的项目,我们创建一个配置类,进行装配SqlSessionFactory,具体如下所示:

@Configuration

public class AutoConfig {

@Bean(name = "sqlSessionFactory")

public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {

SqlSessionFactoryBean bean = new SqlSessionFactoryBean();

bean.setDataSource(dataSource);

bean.setMapperLocations(

// 设置mybatis的xml所在位置,这里使用mybatis注解方式,没有配置xml文件

new PathMatchingResourcePatternResolver().getResources("classpath*:mappers/*.xml"));

return bean.getObject();

}

}

通过这样的方式,我们的项目依旧会根据我们配置的信息去自动加载classpath下的mappers包下以.xml结尾的所有文件,然后可以成功的访问我们的数据库。

2.5完全注解开发

当然了,SpringBoot+Mybatis的项目整合,除了可以使用xml的映射文件的形式外,它还提供了完全注解形式的开发,纯用注解的方式来支持CRUD,也算是我们的一种手段吧。

正常情况下我们需要为Mapper接口的每个方法,都要在其对应的映射文件中进行落实SQL语句。使用注解的形式就是我们将SQL语句直接通过注解,写在Mapper接口方法上,就可以了。

@Repository

public interface EmployeeMapper {

@Insert("insert into tbl_employee (last_name, email, salary) values (#{emp.lastName}, #{emp.email}, #{emp.salary})")

int saveEmp(@Param("emp") Employee employee);

}

我们来进行测试:

@SpringBootTest

public class test {

@Autowired

private EmployeeMapper employeeMapper;

@Test

public void testSelectList() {

Employee empParam = new Employee();

empParam.setId(2);

empParam.setLastName("chengcheng2");

int i = employeeMapper.saveEmp(empParam);

System.out.println("==============i = " + i);

}

}

经过验证,我们的数据库已成功添加了数据,使用注解的形式较为简单,但是是否选用还是看个人的喜好了。

总结

本文主要介绍了Mapper接口与对应SQL映射文件关系的4种绑定的形式,以及不需要绑定使用注解的方式。4种绑定形式分别为默认形式:Mapper接口与我们的映射文件层级关系,命名保持一致;使用SpringBoot配置参数形式,这种较为常用;mapper标签形式;以及通过SqlSessionFactory;在实际的开发中大家随机选择一种即可,看个人的喜好。希望本篇文章加深大家Mapper与映射文件之间的联系。

标签: #java映射文件