MyBatis的基础结构

  • 准备数据模型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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);
  • 项目搭建和准备
    依赖导入
    pom.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <dependencies>
    <!-- mybatis依赖 -->
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.11</version>
    </dependency>

    <!-- MySQL驱动 mybatis底层依赖jdbc驱动实现,本次不需要导入连接池,mybatis自带! -->
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.25</version>
    </dependency>

    <!--junit5测试-->
    <dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.3.1</version>
    </dependency>
    </dependencies>
  • 实体类准备

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Employee {

    private Integer empId;

    private String empName;

    private Double empSalary;

    //getter | setter
    }
  • 准备Mapper接口和MapperXML文件
    在MyBatis 框架下,SQL语句在XML中编写,相较于传统的JDBC可以减少大量的代码
    一般编写SQL语句的文件命名:XxxMapper.xml Xxx一般取表名!!
    Mybatis 中的 Mapper 接口相当于以前的 Dao。但是区别在于,Mapper 仅仅只是建接口即可,我们不需要提供实现类,具体的SQL写到对应的Mapper文件,该用法的思路如下图所示:
    image

  • 定义mapper接口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    package com.atguigu.mapper;

    import com.atguigu.pojo.Employee;

    /**
    * t_emp表对应数据库SQL语句映射接口!
    * 此处接口只规定方法,参数和返回值!
    * 在mapper.xml中编写具体SQL语句!
    */
    public interface EmployeeMapper {

    /**
    * 根据员工id查询员工数据方法
    * @param empId 员工id
    * @return 员工实体对象
    */
    Employee selectEmployee(Integer empId);

    }
  • 定义mapper接口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?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.mapper.EmployeeMapper">

    <!-- 查询使用 select标签
    id = mapper接口类对应的方法名
    resultType = 返回值类型,要与方法规定的返回类型一致
    标签内编写SQL语句
    -->
    <select id="selectEmployee" resultType="com.atguigu.pojo.Employee">
    <!-- #{empId}代表动态传入的参数,并且进行赋值! -->
    select emp_id empId,emp_name empName, emp_salary empSalary from
    t_emp where emp_id = #{empId}
    </select>
    </mapper>

    需要注意的是:

    • 方法名和SQL的id一致
    • 方法返回值和resultType一致
    • 方法的参数和SQL的参数一致
    • 接口的全类名和映射配置文件的名称空间一致
  • 准备MyBatis配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?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>

    <!-- 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="root"/>
    </dataSource>
    </environment>
    </environments>

    <mappers>
    <!-- Mapper注册:指定Mybatis映射文件的具体位置 -->
    <!-- mapper标签:配置一个具体的Mapper映射文件 -->
    <!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 -->
    <!-- 对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径,所以这里我们可以以resources目录为基准 -->
    <mapper resource="mappers/EmployeeMapper.xml"/>
    </mappers>

    </configuration>
  • 测试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    /**
    * projectName: com.atguigu.test
    *
    * description: 测试类
    */
    public class MyBatisTest {

    @Test
    public void testSelectEmployee() throws IOException {

    // 1.创建SqlSessionFactory对象
    // ①声明Mybatis全局配置文件的路径
    String mybatisConfigFilePath = "mybatis-config.xml";

    // ②以输入流的形式加载Mybatis配置文件
    InputStream inputStream = Resources.getResourceAsStream(mybatisConfigFilePath);

    // ③基于读取Mybatis配置文件的输入流创建SqlSessionFactory对象
    SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    // 2.使用SqlSessionFactory对象开启一个会话
    SqlSession session = sessionFactory.openSession();

    // 3.根据EmployeeMapper接口的Class对象获取Mapper接口类型的对象(动态代理技术)
    EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);

    // 4. 调用代理类方法既可以触发对应的SQL语句
    Employee employee = employeeMapper.selectEmployee(1);

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

    // 4.关闭SqlSession
    session.commit(); //提交事务 [DQL不需要,其他需要]
    session.close(); //关闭会话

    }
    }