1、建库建表
CREATE DATABASE `mybatis-example`; USE `mybatis-example`; CREATE TABLE `t_emp`( emp_id INT AUTO_INCREMENT, emp_name CHAR(100), emp_salary DOUBLE(10,5), PRIMARY KEY(emp_id) ); INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("tom",200.33); INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("jerry",666.66); INSERT INTO `t_emp`(emp_name,emp_salary) VALUES("andy",777.77);
2、pom.xml
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </dependency> <!-- MySQL驱动 mybatis底层依赖jdbc驱动实现,本次不需要导入连接池,mybatis自带! --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--junit5测试--> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
3、Employee.java(pojo)
package com.atguigu.mybatis.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class Employee { private Integer empId; private String empName; private Double empSalary; }
4、EmpMapper.java
package com.atguigu.mybatis.mapper; import com.atguigu.mybatis.pojo.Employee; public interface EmpMapper { int getEmpCount(); Employee getEmployee(Integer empId); }
5、mybatis-config.xml(mybatis的总配置文件)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <!--<typeAlias type="com.atguigu.mybatis.pojo.Employee" alias="emp"/>--> <package name="com.atguigu.mybatis.pojo"/> </typeAliases> <!-- environments表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 --> <environments default="development"> <!-- environment表示配置Mybatis的一个具体的环境 --> <environment id="development"> <!-- Mybatis的内置的事务管理器 --> <transactionManager type="JDBC"/> <!-- 配置数据源 --> <dataSource type="POOLED"> <!-- 建立数据库连接的具体信息 --> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis-example"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <!-- Mapper注册:指定Mybatis映射文件的具体位置 --> <!-- mapper标签:配置一个具体的Mapper映射文件 --> <!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 --> <!-- 对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径,所以这里我们可以以resources目录为基准 --> <mapper resource="mapper/EmpMapper.xml"/> </mappers> </configuration>
6、EmpMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace等于mapper接口类的全限定名,这样实现对应 --> <mapper namespace="com.atguigu.mybatis.mapper.EmpMapper"> <!--演示输出数据类型--> <!--1.单个简单数据类型--> <select id="getEmpCount" resultType="int"> select count(*) from t_emp </select> <!--2.返回实体类类型--> <select id="getEmployee" resultType="employee"><!--employee和Employee都可以,Bean类名首字母大小写都可以--> select emp_id as empId, emp_name as empName, emp_salary as empSalary from t_emp where emp_id=#{value} </select> </mapper>
7、MybatisTest.java
package com.atguigu.mybatis; import com.atguigu.mybatis.mapper.EmpMapper; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.io.IOException; import java.io.InputStream; public class MybatisTest { SqlSessionFactory sqlSessionFactory; SqlSession sqlSession; EmpMapper empMapper; @BeforeEach public void setup() throws IOException { // 获取资源流,读取"mybatis-config.xml"文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); // 使用资源流创建SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); // 使用SqlSessionFactory打开一个Session sqlSession = sqlSessionFactory.openSession(); //基于Mapper接口编程 empMapper = sqlSession.getMapper(EmpMapper.class); } // 在每个测试用例之后执行的清理方法 @AfterEach public void teardown() { sqlSession.commit(); // 提交事务 sqlSession.close(); // 关闭SqlSession } @Test public void test01() { System.out.println(empMapper.getEmpCount()); System.out.println(empMapper.getEmployee(2)); } }
8、MapperRegistry
MapperRegistry是MyBatis中的一个重要组件,用于注册、获取和判断Mapper接口。它具有以下功能:
- getMapper:从缓存集合中获取对应的Mapper接口。
- hasMapper:判断缓存集合中是否存在Mapper接口。
- addMapper:添加Mapper接口到knownMappers集合中。
- getMappers:获取knownMappers集合中所有已经注册的Mapper接口。
- addMappers:添加某个包下的所有符合superType的子类或者子接口。
在MyBatis 3.2.2及之后的版本中,还新增了getMappers方法,用于获取knownMappers集合中所有已经注册的Mapper接口。同时,MapperRegistry也用于处理mapper的自动扫描和注册。
MapperRegistry是MyBatis框架的一个重要组成部分,它的作用是管理Mapper接口与Mapper代理对象的映射关系。MyBatis中的Mapper接口用于描述数据库操作的方法,Mapper代理对象则是通过动态代理技术在运行时生成的,它们的作用是将Mapper接口中定义的方法转换为对应的SQL语句并执行。
MapperRegistry类主要有如下两个作用:
注册Mapper接口与Mapper代理对象的映射关系。MyBatis通过MapperRegistry类的registerMapper方法来实现,该方法会将Mapper接口名称与对应的Mapper代理对象实例存储到一个ConcurrentMap中。
获取Mapper接口对应的Mapper代理对象。MyBatis会通过MapperRegistry类的getMapper方法来获取Mapper接口对应的Mapper代理对象,如果该Mapper接口还未注册,则会抛出异常。
通过MapperRegistry类,MyBatis能够在运行时动态生成Mapper代理对象,实现了Mapper接口与SQL语句的自动关联。这样就可以在编写代码时只关注业务逻辑,而不需要关心SQL语句的编写。