一、MyBatis简介

一、MyBatis简介

官方文档:配置_MyBatis中文网

1、介绍

1、MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下, iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。

2、MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

3、总结一句话。就是自定义。然后需要自己去写sql语句。但是程序的增删改查框架会写好。

4、这里使用3.5.11版本

2、持久层框架的对比

1、JDBC

  • SQL 夹杂在Java代码中耦合度高,导致硬编码内伤
  • 维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见
  • 代码冗长,开发效率低

2、Hibernate 和 JPA

  • 操作简便,开发效率高
  • 程序中的长难复杂 SQL 需要绕过框架
  • 内部自动生成的 SQL,不容易做特殊优化
  • 基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。
  • 反射操作太多,导致数据库性能下降

3、MyBatis

  • 轻量级,性能出色
  • SQL 和 Java 编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据
  • 开发效率稍逊于 Hibernate,但是完全能够接收

4、开发效率:Hibernate>Mybatis>JDBC

5、运行效率:JDBC>Mybatis>Hibernate

3、mybatis的快速入门

1、例子

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、创建一个实体类

package com.atgui.pojo;

public class Employee {
    private int empId;
    private String empName;
    private String empSalary;

    public int getEmpId() {
        return empId;
    }

    public void setEmpId(int empId) {
        this.empId = empId;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public String getEmpSalary() {
        return empSalary;
    }

    public void setEmpSalary(String empSalary) {
        this.empSalary = empSalary;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "empId=" + empId +
                ", empName='" + empName + '\'' +
                ", empSalary='" + empSalary + '\'' +
                '}';
    }
}

3、创建一个接口Employee.mapper

package com.atgui.mapper;

import com.atgui.pojo.Employee;

public interface EmployeeMapper {

    Employee selectEmployee(int id);
}

4、创建一个接口对应的xml文件EmployeeMapper.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.atgui.mapper.EmployeeMapper">

    <!-- 查询使用 select标签
            id = 方法名
            resultType = 返回值类型
            标签内编写SQL语句
     -->
    <select id="selectEmployee" resultType="com.atgui.pojo.Employee">
        select emp_id empId,emp_name empName,emp_salary empSalary
        from t_emp
        where emp_id = #{empId}
    </select>

</mapper>

5、创建一个mybatis的总xml配置文件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表示配置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>

6、创建一个测试类MybatisTest

package com.atgui;

import com.atgui.mapper.EmployeeMapper;
import com.atgui.pojo.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.jupiter.api.Test;

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

public class MybatisTest {

    @Test
    public void testSelectEmployee() throws IOException{
//        声明SqlSessionFactory对象
        String mybatisConfigFilePath = "mybatis-config.xml";
//        以输入流的方式加载Mybatis配置文件
        InputStream inputStream = Resources.getResourceAsStream(mybatisConfigFilePath);
//        基于读取mybatis配置文件以输入流创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//        使用SqlSessionFactory对象开启一个会话,真正干活的对象
        SqlSession session = sqlSessionFactory.openSession();
//        根据EmployeeMapper接口的Class对象获取Mapper接口类型的对象(动态代理技术)
        EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
//        调用代理类方法可以出发对应的sql语句
        Employee employee = employeeMapper.selectEmployee(1);
        System.out.println("employee = " + employee);

//        关闭流
        session.commit();
        session.close();
    }
}

2、ibatis和Mybatis的区别

1、ibatis是apache公司的。然后转入Google Code旗下。在3.0版本后就便成了Mybatis

2、说白了:mybatis就是对ibatis的一层封装。

3、ibatis实现方式

image-20240113114810958

1、就是先创建数据库,实体类

2、然后进行mybatis-config.xml的配置

3、然后在测试的时候直接使用sqlSession提供的crud方法就可以对数据库进行查询

4、这里举例(和上面代码一样,只是测试调用的时候不一样)

package com.atgui;

import com.atgui.mapper.EmployeeMapper;
import com.atgui.pojo.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.jupiter.api.Test;

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

public class MybatisTest {

    @Test
    public void testSelectEmployee() throws IOException{
//        声明SqlSessionFactory对象
        String mybatisConfigFilePath = "mybatis-config.xml";
//        以输入流的方式加载Mybatis配置文件
        InputStream inputStream = Resources.getResourceAsStream(mybatisConfigFilePath);
//        基于读取mybatis配置文件以输入流创建SqlSessionFactory对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//        使用SqlSessionFactory对象开启一个会话,真正干活的对象
        SqlSession session = sqlSessionFactory.openSession();
//      直接使用sqlSession提供的crud方法进行数据库调用就行了
        Employee employee = sqlSession.selectOne("xxx字符串标识,就是mapper中的spaceName=+id",[参数(只能有一个)])

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

//        关闭流
        session.commit();
        session.close();
    }
}

5、缺点

  • sql语句标签对应的字符串标识,容易出现错误
  • 参数需要进行整合只能传递一个
  • 返回值问题

4、MyBatis实现方式

1、就是对ibatis进行封装

2、多了一个接口用来规定参数类型

3、然后通过一个代理类来对增删改查代码调用,然后我们要用代理类来执行

image-20240113115447902

5、注意说明

  • SqlSession:代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的会话)
  • SqlSessionFactory:是“生产”SqlSession的“工厂”。
  • 工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个“工厂类”中,以后都使用这个工厂类来“生产”我们需要的对象。

6、SqlSession和HttpSession区别

1、HttpSession:工作在Web服务器上,属于表述层。

  • 代表浏览器和Web服务器之间的会话。

2、SqlSession:不依赖Web服务器,属于持久化层。

  • 代表Java程序和数据库之间的会话。

3、如图

image-20240113115730777

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇