MyBatis入门

本文详细介绍了MyBatis的各个方面,包括历史、优点、下载方式,以及如何创建HelloWorld项目。深入讲解了全局配置文件的各个属性,如properties、settings、typeAliases、typeHandlers、plugins、environments、databaseIdProvider和mappers。还涵盖了映射文件的使用,包括CRUD操作、主键生成、参数传递和结果映射,以及动态SQL的if、choose、trim、set、foreach、sql标签。最后,讨论了一级和二级缓存机制、逆向工程以及PageHelper分页插件的使用,以及SSM框架整合的注意事项和步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

第1章 MyBatis简介

1.1 MyBatis历史

1)MyBatis是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移到了Google Code,随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis ,代码于2013年11月迁移到Github。
2)iBatis一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。 iBatis 提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。

1.2 MyBatis简介

1) MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架
2) MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
3) MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Ordinary Java Object,普通的Java对象)映射成数据库中的记录
4) Mybatis 是一个 半自动的ORM(Object Relation Mapping)框架

1.3 如何下载MyBatis

1) 下载网址
https://github.com/mybatis/mybatis-3
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.4 为什么要使用MyBatis – 现有持久化技术的对比

1) JDBC
① SQL夹在Java代码块里,耦合度高导致硬编码内伤
② 维护不易且实际开发需求中sql有变化,频繁修改的情况多见
2) Hibernate和JPA
① 长难复杂SQL,对于Hibernate而言处理也不容易
② 内部自动生产的SQL,不容易做特殊优化
③ 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。导致数据库性能下降

3) MyBatis
① 对开发人员而言,核心sql还是需要自己优化
② sql和java编码分开,功能边界清晰,一个专注业务、一个专注数据

第2章 HelloWorld

2.1 开发环境的准备

  1. 导入以下jar包

在这里插入图片描述
2) 导入log4j 的配置文件log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 
 <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
   <param name="Encoding" value="UTF-8" />
   <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n" />
   </layout>
 </appender>
 <logger name="java.sql">
   <level value="debug" />
 </logger>
 <logger name="org.apache.ibatis">
   <level value="info" />
 </logger>
 <root>
   <level value="debug" />
   <appender-ref ref="STDOUT" />
 </root>
</log4j:configuration>


2.2 创建数据库和表

在MySQL中执行资料中的mybatis.sql文件

2.3 创建Employee类

package com.atguigu.mybatis.entities;

public class Employee {
   
   
    private Integer id;
    private String lastName;
    private String email;
    private Double salary;
    private Integer deptId;

    public Employee() {
   
   
    }

    public Employee(Integer id, String lastName, String email, Double salary, Integer deptId) {
   
   
        this.id = id;
        this.lastName = lastName;
        this.email = email;
        this.salary = salary;
        this.deptId = deptId;
    }

    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 Integer getDeptId() {
   
   
        return deptId;
    }

    public void setDeptId(Integer deptId) {
   
   
        this.deptId = deptId;
    }

    @Override
    public String toString() {
   
   
        return "Employee{" +
                "id=" + id +
                ", lastName='" + lastName + '\'' +
                ", email='" + email + '\'' +
                ", salary=" + salary +
                ", deptId=" + deptId +
                '}';
    }
}


2.4 创建EmployeeMapper(Dao)接口

package com.atguigu.mybatis.dao;

import com.atguigu.mybatis.entities.Employee;

public interface EmployeeMapper {
   
   
    
    Employee getEmployeeById(Integer id);
}


2.5 创建Mybatis的sql映射文件

  1. 参考MyBatis的官方文档创建EmployeeMapper.xml映射文件
  2. 完成两个绑定
    a) 标签中的namespace属性必须指定成Mapper接口的全类名
    b) Mapper映射文件中的增删改查标签的id必须指定成Mapper接口中的方法名
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace属性:设置为接口的全类名-->
<mapper namespace="com.atguigu.mybatis.dao.EmployeeMapper">

    <!--
        id属性:设置为接口中的方法名
        resultType属性:设置为方法的返回值的类型的全类名
    -->
    <select id="getEmployeeById" resultType="com.atguigu.mybatis.entities.Employee">
        select id,last_name lastName,email,salary,dept_id deptId
        from employees
        where id = #{id}
    </select>
</mapper>


2.6 创建MyBatis的全局配置文件

参考MyBatis的官网文档创建mybatis-config.xml全局配置文件

<?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 default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <!--设置Mapper映射文件(sql映射文件)-->
    <mappers>
        <mapper resource="com/atguigu/mybatis/dao/EmployeeMapper.xml"/>
    </mappers>
</configuration>


2.7 测试

参考MyBatis的官方文件创建测试代码

package com.atguigu.mybatis.test;

import com.atguigu.mybatis.dao.EmployeeMapper;
import com.atguigu.mybatis.entities.Employee;
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.Test;

import java.io.IOException;
import java.io.InputStream;

public class MyBatisTest {
   
   

    /*
       测试HelloWorld
    */
    @Test
    public void testHelloWorld() throws IOException {
   
   
        //设置MyBatis全局配置文件的路径
        String resource = "mybatis-config.xml";
        //读取类路径下的配置文件得到输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //获取SqlSession对象,相当于Connection对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
   
   
            //获取Mapper代理对象
            EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
            //调用EmployeeMapper中获取一个对象的方法
            Employee employeeById = mapper.getEmployeeById(1);
            System.out.println(employeeById);
        } finally {
   
   
            //关闭sqlSession
            sqlSession.close();
        }
    }
}


第3章 MyBatis全局配置文件

3.1 MyBatis全局配置文件简介

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

在这里插入图片描述

3.2 properties属性

  1. 可外部配置且可动态替换的,既可以在典型的 Java 属性文件中配置,亦可通过 properties 元素的子元素来配置
<properties>
    <property name="username" value="hanzong"/>
    <property name="password" value="123456"/>
</properties>

  1. 然而properties的作用并不单单是这样,你可以创建一个资源文件,名为jdbc.properties的文件,将四个连接字符串的数据在资源文件中通过键值 对(key=value)的方式放置,不要任何符号,一条占一行
    a) jdbc.properties
jdbc.username=root
jdbc.password=root
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.driver=com.mysql.jdbc.Driver

b) 通过properties标签引入jdbc.properties文件

<!--
    resource属性:引入类路径下的属性文件
    url属性:引入网络或磁盘路径下的属性文件
-->
<properties resource="jdbc.properties"></properties

c) 在environment元素的dataSource元素中为其动态设置

<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
</environments>

  1. 如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载:
    a) 首先读取在 properties 元素体内指定的属性。
    b) 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
    c) 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。

3.3 settings设置

这是 MyBatis 中极为重要的调整设置,它们会改变 MyBatis 的运行时行为。 下表描述了设置中各项常见设置的含义、默认值等

在这里插入图片描述

3.4 typeAliases 别名处理

  1. 通过子标签typeAlias设置别名
<typeAliases>
    <!--
      子标签typeAlias:用来给某些类指定别名
        type属性:指定起别名的类的全类名
        alias属性:指定别名,如果没有指定则是类命的首字母小写,但是别名大小写不敏感
    -->
    <typeAlias type="com.atguigu.mybatis.entities.Employee" alias="employee"></typeAlias>
</typeAliases>

  1. 通过子标签package设置别名
<typeAliases>
    <!--
        子标签package:通过指定包名给包下所有的类起别名
            name属性:指定包名
    -->
    <package name="com.atguigu.mybatis.entities"/>
</typeAliases>


  1. MyBatis已经取好的别名

在这里插入图片描述

3.5 typeHandlers 类型处理器

  1. 无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型
  2. MyBatis中提供的类型处理器:
    在这里插入图片描述
  3. 日期和时间的处理,JDK1.8以前一直是个头疼的问题。我们通常使用JSR310规范领导者Stephen Colebourne创建的Joda-Time来操作。1.8已经实现全部的JSR310规范了
  4. 日期时间处理上,我们可以使用MyBatis基于JSR310(Date and Time API)编写的各种日期时间类型处理器。
  5. MyBatis3.4以前的版本需要我们手动注册这些处理器,以后的版本都是自动注册的,如需注册,需要下载mybatistypehandlers-jsr310,并通过如下方式注册
    在这里插入图片描述
6)	自定义类型转换器
①	我们可以重写类型处理器或创建自己的类型处理器来处理不支持的或非标准的类 型
②	步骤
	实现org.apache.ibatis.type.TypeHandler接口或者继承org.apache.ibatis.type.BaseTypeHandler
	指定其映射某个JDBC类型(可选操作)
	在mybatis全局配置文件中注册

3.6 plugins 插件机制

  1. 插件是MyBatis提供的一个非常强大的机制,我们可以通过插件来修改MyBatis的一些核心行为。插件通过动态代理机制,可以介入四大对象的任何一个方法的执行
  2. 四大对象:
    Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)

ParameterHandler (getParameterObject, setParameters)

ResultSetHandler (handleResultSets, handleOutputParameters)

StatementHandler (prepare, parameterize, batch, update, query)

3.7 environments 环境配置

  1. MyBatis可以配置多种环境,比如开发、测试和生产环境需要有不同的配置
  2. 每种环境使用一个environment标签进行配置并通过id属性指定唯一标识符
  3. 可以通过environments标签中的default属性指定一个环境的标识符来快速的切换环境
  4. environment-指定具体环境
    a) id:指定当前环境的唯一标识
    b) transactionManager和dataSource都必须有
<environments default="development">
    <!--开发环境-->
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>

    <!--生产环境-->
    <environment id="online">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
        </dataSource>
    </environment>
</environments>


  1. transactionManager
    type: JDBC | MANAGED | 自定义
    JDBC:使用了 JDBC 的提交和回滚设置,依赖于从数据源得到的连接来管理事务范 围。 JdbcTransactionFactory
    MANAGED:不提交或回滚一个连接、让容器来管理事务的整个生命周期(比如 JEE 应用服务器的上下文)。 ManagedTransactionFactory
    自定义:实现TransactionFactory接口,type=全类名/别名

  2. dataSource
    type: UNPOOLED | POOLED | JNDI | 自定义
    UNPOOLED:不使用连接池, UnpooledDataSourceFactory
    POOLED:使用连接池, PooledDataSourceFactory
    JNDI: 在EJB 或应用服务器这类容器中查找指定的数据源
    自定义:实现DataSourceFactory接口,定义数据源的获取方式。

  3. 可以通过org.apache.ibatis.session. Configuration查询上述信息

  4. 实际开发中我们使用Spring管理数据源,并进行事务控制的配置来覆盖上述配置

3.8 databaseIdProvider数据库厂商标识

  1. MyBatis 可以根据不同的数据库厂商执行不同的语句
<!--设置数据库厂商标识--
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月常新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值