【Java WEB】MyBatis详解

个人博客:www.hellocode.top
⭐所有文章均在上方博客首发,其他平台同步更新
本文专栏:《Java Web从入门到实战》
> 如没有Java基础,请先前往《Java零基础指南》专栏学习相应知识
⚡如有问题,欢迎指正,一起学习~~


文章目录

      • 快速入门
        • MyBatis介绍
        • 入门程序
      • 相关API
      • 映射配置文件
        • 查询功能
        • 新增功能
        • 修改功能
        • 删除功能
      • 核心配置文件
        • 数据库连接配置文件引用
        • 起别名
      • Dao层的实现
        • 传统方式
        • 接口代理方式
      • 动态sql
        • if标签
        • foreach标签
        • SQL 片段的抽取
      • 分页插件
      • 多表操作
        • 一对一
        • 一对多
        • 多对多
      • 注解开发
        • 查询操作
        • 新增操作
      • 注解多表操作
      • 构建SQL
        • 查询操作
        • 新增操作
        • 修改操作
        • 删除操作


快速入门

框架是一款半成品软件,我们可以基于这个半成品软件继续开发,来完成我们的个性化需求

  • ORM(Object Relational Mapping):对象关系映射
    指的是持久化数据和实体对象的映射模式,为了解决面向对象与关系型数据库存在的互不匹配的现象的技术

MyBatis介绍

  • 原始 JDBC 的操作问题分析
    1. 频繁创建和销毁数据库的连接会造成系统资源浪费从而影响系统性能
    2. sql 语句在代码中硬编码,如果要修改sql语句,就需要修改 java 代码,造成代码不易维护
    3. 查询操作时,需要手动将结果集中的数据封装到实体对象中
    4. 增删改查操作需要参数时,需要手动将实体对象的数据设置到sql 语句的占位符
  • 原始 JDBC 的操作问题解决方案
    1. 使用数据库连接池初始化连接资源
    2. 将sql 语句抽取到配置文件中
    3. 使用反射、内省等底层操作技术,将实体与表进行属性与字段的自动映射
  • MyBatis 是一个优秀的基于Java的持久层框架,它内部封装了 JDBC,使开发者只需要关注 SQL 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建执行者等复杂的操作
  • MyBatis 通过xml 或注解的方式将要执行的各种 Statement 配置起来,并通过Java 对象和Statement 中 SQL 的动态参数进行映射生成最终要执行的SQL语句
  • 最后 MyBatis 框架执行完SQL 并将结果映射为 Java对象并返回。采用 ORM 思想解决了实体和数据库映射的问题,对 JDBC 进行了封装,屏蔽了 JDBC API 底层访问细节,使我们不用与 JDBC API 打交道,就可以完成对数据库的持久化操作
  • MyBatis官网:http://www.mybatis.org

入门程序

  1. 数据库数据准备

  2. 导入 jar 包

  3. 在src 下创建映射配置文件

    
    DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="StudentMapper">
        <select id="selectAll" resultType="mybaits.study.bean.Student">
            SELECT * FROM student
        select>
    mapper>
    
  4. 在 src 下创建核心配置文件

    
    DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
    <configuration>
        <environments default="mysql">
            <environment id="mysql">
                <transactionManager type="JDBC">transactionManager>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://192.168.23.129:3306/db1"/>
                    <property name="username" value="root"/>
                    <property name="password" value="密码"/>
                dataSource>
            environment>
        environments>
        
        <mappers>
            <mapper resource="StudentMapper.xml">mapper>
        mappers>
    configuration>
    
  5. 编写测试类完成相关API 的使用

  6. 运行测试查看结果

package mybatis.study.dao;

import mybatis.study.bean.Student;
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;
import java.util.List;

public class StudentTest01 {
    /*
    *       查询全部
    * */
    @Test
    public void selectAll() throws IOException {
        // 1.加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

        // 2. 获取SqlSession工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        // 3.通过SqlSession工厂对象获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 4.执行映射配置文件中的sql语句,并接收结果
        List<Student> list = sqlSession.selectList("StudentMapper.selectAll");

        // 5.处理结果
        for(Student stu : list){
            System.out.println(stu);
        }

        // 6.释放资源
        sqlSession.close();
        is.close();
    }
}

相关API

Resources

  • org.apache.ibaties.io.Resources:加载资源的工具类
  • 核心方法
    返回值 方法名 说明
    InputStream getResourcesAsStream(String fileName) 通过类加载器返回指定资源的字节输入流

    除了使用这个工具类的方法,还可以使用类名.class.getClassLoader().getResourceAsStream(配置文件名.xml)获取到字节输入流对象

SqlSessionFactoryBuilder

  • org.apache.ibaties.session.SqlSessionFactoryBuilder:获取SqlSessionFactory 工厂对象的功能类
  • 核心方法
    返回值 方法名 说明
    SqlSessionFactory build(InputStream is) 通过指定资源字节输入流获取SqlSession 工厂对象

SqlSessionFactory

  • org.apache.ibaties.srssion.SqlSessionFactory:获取SqlSession 构建者对象的工厂接口
  • 核心方法
    返回值 方法名 说明
    SqlSession openSession() 获取SqlSession 构建者对象,并开启手动提交事务
    SqlSession openSession(boolean autoCommit) 获取SqlSession构建者对象,如果参数为true,则开启自动提交事务

SqlSession

  • org.apache.ibaties.session.SqlSession:构建者对象接口。用于执行SQL、管理事务、接口代理
  • 核心方法
    返回值 方法名 说明
    List selectList(String statement,Object paramter) 执行查询语句,返回List集合
    T selectOne(String statement,Object paramter) 执行查询语句,返回一个结果对象
    int insert(String statement,Object paramter) 执行新增语句,返回影响行数
    int update(String statement,Object paramter) 执行修改语句,返回影响行数
    int delete(String statement,Object paramter) 执行删除语句,返回影响行数
    void commit() 提交事务
    void rollback() 回滚事务
    T getMapper(Classcls) 获取指定接口的代理实现类对象
    void close() 释放资源

映射配置文件

  • 映射配置文件包含了数据和对象之间的映射关系以及要执行的SQL语句


DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="StudentMapper">
    
    <select id="selectAll" resultType="mybaits.study.bean.Student">
        SELECT * FROM student
    select>
mapper>

查询功能


DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="StudentMapper">
    <select id="selectAll" resultType="mybatis.study.bean.Student">
        SELECT * FROM student
    select>
    <select id="selectById" resultType="mybatis.study.bean.Student" parameterType="java.lang.Integer">
        SELECT * FROM student WHERE id = #{参数名称}
    select>
mapper>
@Test 
public void selectById() throws IOException {
    InputStream is = Resources.getResourceAsStream("MybatisConfig.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    Student stu = sqlSession.selectOne("StudentMapper.selectById", 1);
    System.out.println(stu);
    sqlSession.close();
    is.close();
}