前言:
此刻朋友们对“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映射文件