Java开发:Mybatis中Mapper接口与映射文件的绑定 | 您所在的位置:网站首页 › java怎么创建项目和包 › Java开发:Mybatis中Mapper接口与映射文件的绑定 |
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依赖文件如下: org.springframework.boot spring-boot-starter-parent 2.3.4.RELEASE org.springframework.boot spring-boot-starter-test test org.mybatis.spring.boot mybatis-spring-boot-starter 2.2.0 mysql mysql-connector-java 创建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 selectEmpByEmp(Employee employee); } 对应的映射文件EmployeeMapper.xml的准备,由于本篇文章重点研究接口与映射文件的绑定情况,因此我们的映射文件内容操作均为同一个,根据条件查询表数据,具体如下: SELECT id, last_name, email, salary, dept_id FROM tbl_employee id = #{id} AND last_name = #{lastName} AND email = #{email} AND salary = #{salary} 最后就是测试类的准备,用来测试我们的用例: @SpringBootTest public class test { @Autowired private EmployeeMapper employeeMapper; @Test public void testSelectList() { Employee empParam = new Employee(); empParam.setId(2); empParam.setLastName("chengcheng2"); List 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='[email protected]', 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标签: 之后在application.properties配置文件中指定mybatis-config.xml配置文件: mybatis.config-location=classpath:mybatis-config.xml 通过这种方式,我们可以进行Mapper接口和对应映射文件之间的匹配了。可以正常的访问数据库信息了: employees = [Employee{id=2, lastName='null', email='[email protected]', 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与映射文件之间的联系。 |
CopyRight 2018-2019 实验室设备网 版权所有 |