MyBatis好好学一(基本原理和初始化)

MyBatis好好学一(基本原理和初始化)

大纲

  • 1、MyBatis框架简介

  • 2、MyBatis基本原理

1、MyBatis框架简介

1、简介

        MyBatis是一个基于Java语言的半自动的(需再xml配置文件中写sql)持久层框架,对JDBC的操作数据库过程进行了封装,消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索,提供了普通的sql查询,存储过程调用、和高级映射,可以通过注解或XML文件对JDBC各种操纵进行配置,并将结果映射成Java对象返回。

2、基本特点

-- 优点
1、简单易用,易于上手,学习成本相对较低。
2、灵活度高,可以自己编写sql,
3、SQL与代码解耦,便于维护,支持动态sql
4、提供了映射标签,支持对象和表字段关系映射。
5、可以支持自定义类型处理器、注解和插件。
-- 缺点
1、sql编写工作量大,特别是在字段多、关联表多的情况下,编写复杂的 SQL 语句可能会比较困难
2、SQL 语句依赖于数据库,导致数据库移植性较差,不能随意更换数据库
3、由于会将 SQL 语句和参数组合在一起直接运行数据库执行查询,容易受到恶意数据的影响。

3、与其他框架对比

        MyBatis是一种持久化框架,它可以轻松地将Java对象映射到关系型数据库中。与其他持久化层技术相比,MyBatis有许多独特的优点和不同的特点。

-- 1、MyBatis和JDBC的对比
MyBatis和JDBC都是直接操作SQL的持久化技术。在JDBC中,我们需要手动编写SQL语句,
并将其发送到数据库中执行。而MyBatis则可以将SQL语句与Java对象映射起来,
从而简化了数据库操作。此外,MyBatis还提供了一些高级特性,例如缓存、延迟加载和动态SQL等。
这些特性使得MyBatis更加易于使用,并且可以提高开发效率。

-- 2、MyBatis和Hibernate的对比
MyBatis和Hibernate都是ORM框架。在Hibernate中,我们可以使用对象-关系映射来将Java对象
映射到数据库中。而在MyBatis中,我们仍然需要手动编写SQL语句,但是MyBatis可以将Java对象
映射到SQL语句中。Hibernate提供了更高级的特性,例如一级缓存、二级缓存、自动事务管理等。
而MyBatis则更加轻量级,更加灵活,可以更好地满足个性化需求。

-- 3、MyBatis和Spring JDBC的对比
Spring JDBC是Spring框架提供的持久化技术。与JDBC类似,Spring JDBC也是直接操作SQL的
持久化技术。但是,Spring JDBC可以提供一些基于Spring的特性,例如声明式事务管理和模板
方法等。MyBatis也可以与Spring集成,从而可以享受Spring的一些特性。但是,MyBatis的
优势在于它可以将Java对象映射到SQL语句中,从而提供更加灵活的持久化方案。

-- 4、MyBatis和JPA的对比
JPA是Java Persistence API的缩写,它是Java EE 5规范中定义的一种ORM框架。
与Hibernate类似,JPA也是使用对象-关系映射来将Java对象映射到数据库中。与JPA相比,
MyBatis更加轻量级、更加灵活,可以更好地满足个性化需求。此外,MyBatis可以更好地处理
复杂SQL语句,并提供了一些高级特性,例如缓存、延迟加载和动态SQL等。

2、MyBatis基本原理

1、原生JDBC执行流程

  • JDBC的定义

         JDBC(Java Database Connectivity)是Java语言中用于访问关系型数据库的一种标准API。它提供了一组接口和类,使Java应用程序能够与各种数据库进行连接、执行SQL查询和更新操作,并处理数据库的结果。

  • JDBC的主要组成部分
-- DriverManager:
驱动管理类,负责管理一组可以建立数据库连接的驱动程序。DriverManager会自动加载驱动包
中的驱动类:com.mysql.cj.jdbc.Dirver,并返回驱动包中的Connection接口的实现类对象

-- Driver:
数据库驱动程序实现的接口,用于与具体的数据库后端进行通信。

-- Connection:
表示与数据库建立的连接,并提供了执行SQL语句和事务管理的方法。

-- Statement和PreparedStatement:
用于执行SQL语句,Statement是常规的SQL语句执行接口,PreparedStatement是预编
译的SQL语句执行接口。
-- ResultSet:
表示查询结果集,并提供了对查询结果的访问和操作方法
  • JDBC的执行流程
1、加载数据库驱动程序:通过反射的方式加载驱动包,现在基本无需手动添加驱动包了。

2、建立数据库连接:使用DriverManager.getConnection()方法创建与数据库的连接,需要提供数据库的URL、用户名和密码。

3、创建Statement对象:使用connection.createStatement()方法创建一个Statement对象,用于执行SQL语句。

4、执行SQL语句:使用Statement对象的executeQuery()方法执行查询语句,或者使用executeUpdate()方法执行更新语句。

5、处理结果集:如果执行的是查询语句,可以使用ResultSet对象来处理查询结果。

6、关闭连接:使用connection.close()方法关闭数据库连接,释放资源。
  • 代码示例1
package com.xuzai.JDBC;

import java.sql.*;

public class TestJDBC {
    public static void main(String[] args) throws SQLException {
        //1.注册驱动
        com.mysql.jdbc.Driver driver=new com.mysql.jdbc.Driver();
        DriverManager.registerDriver(driver);
        //2.获取数据库连接对象
        String url="jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String username="root";
        String password="123456";
        Connection conn=DriverManager.getConnection(url,username,password);
        System.out.println(conn);
        //3.获取数据库操作对象(通过一个Connection连接对象可以拿到多个操作对象)
        Statement statement = conn.createStatement();
        //4.执行sql语句(这里以插入和删除为例,其余同理,前提是要会写sql语句)
        //String InsertSql="insert into people(name,age,address) values('小马',18,'山东省')";
        String DeleteSql="delete from people where name='小马'";
        //这个executeUpdate方法专门用来执行sql的增删改查语句的,其中返回值为影响力数据库中的数据条数,也就是影响力几行
        int i = statement.executeUpdate(DeleteSql);
        System.out.println(i);
        //5.释放资源,先释放statement再释放connection
        if (statement != null) {
            statement.close();
        }
        if (conn != null){
            conn.close();
        }
    }
}
  • 代码示例2(处理结果集)
package com.xuzai.JDBC;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
import java.util.ResourceBundle;

//读取配置文件
public class TestJDBC03 {
    public static void main(String[] args) throws SQLException, IOException {
        //获取配置文件数据
        InputStream is=TestJDBC03.class.getClassLoader().getResourceAsStream("db.properties");
        Properties pro=new Properties();
        pro.load(is);
        String username= pro.getProperty("username");
        String password=pro.getProperty("password");
        String url=pro.getProperty("url");

        //1.注册驱动
        com.mysql.jdbc.Driver driver=new com.mysql.jdbc.Driver();

        //2.获取数据库连接对象

        Connection conn=DriverManager.getConnection(url,username,password);
        System.out.println(conn);

        //3.获取数据库操作对象(通过一个Connection连接对象可以拿到多个操作对象)
        Statement statement = conn.createStatement();

        //4.执行sql语句(这里以插入和删除为例,其余同理,前提是要会写sql语句)
        String SeleteSql="select * from people";
        //这个executeUpdate方法专门用来执行sql的增删改查语句的,其中返回值为影响力数据库中的数据条数,也就是影响力几行
        ResultSet resultSet = statement.executeQuery(SeleteSql);

        //5.处理查询结果集
        while(resultSet.next()){
            //这个getString()方法是不管数据库中的值是什么类型的,他都会以String类型返回
            //getString()是通过下标取值的,默认都是以字符串类型取出,可以通过相应类型的get方法取出特定类型的值
            System.out.println(resultSet.getString(1));
            System.out.println(resultSet.getString(2));
            System.out.println(resultSet.getString(3));
            System.out.println(resultSet.getString(4));
        }

        //6.释放资源,先释放statement再释放connection
        if (statement != null) {
            statement.close();
        }
        if (conn != null){
            conn.close();
        }
        if(resultSet!=null){
            resultSet.close();
        }
    }
}
  • 代码示例3(数据库连接信息写到properties配置文件)
package com.xuzai.JDBC;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
import java.util.ResourceBundle;

//读取配置文件
public class TestJDBC03 {
    public static void main(String[] args) throws SQLException, IOException {
        //获取配置文件数据
        InputStream is=TestJDBC03.class.getClassLoader().getResourceAsStream("db.properties");
        Properties pro=new Properties();
        pro.load(is);
        String username= pro.getProperty("username");
        String password=pro.getProperty("password");
        String url=pro.getProperty("url");

        //1.注册驱动
        com.mysql.jdbc.Driver driver=new com.mysql.jdbc.Driver();

        //2.获取数据库连接对象

        Connection conn=DriverManager.getConnection(url,username,password);
        System.out.println(conn);

        //3.获取数据库操作对象(通过一个Connection连接对象可以拿到多个操作对象)
        Statement statement = conn.createStatement();

        //4.执行sql语句(这里以插入和删除为例,其余同理,前提是要会写sql语句)
        String SeleteSql="select * from people";
        //这个executeUpdate方法专门用来执行sql的增删改查语句的,其中返回值为影响力数据库中的数据条数,也就是影响力几行
        ResultSet resultSet = statement.executeQuery(SeleteSql);

        //5.处理查询结果集
        while(resultSet.next()){
            //这个getString()方法是不管数据库中的值是什么类型的,他都会以String类型返回
            //getString()是通过下标取值的,默认都是以字符串类型取出,可以通过相应类型的get方法取出特定类型的值
            System.out.println(resultSet.getString(1));
            System.out.println(resultSet.getString(2));
            System.out.println(resultSet.getString(3));
            System.out.println(resultSet.getString(4));
        }

        //6.释放资源,先释放statement再释放connection
        if (statement != null) {
            statement.close();
        }
        if (conn != null){
            conn.close();
        }
        if(resultSet!=null){
            resultSet.close();
        }
    }
}

2、原理解析

  • 基于配置文件的原理解析

首先,需要配置MyBatis的相关配置文件,全局配置文件mybatis-config.xml 和 映射文件(Mapper XML),配置文件包含了数据库连接信息,事务、缓存等配置。映射文件配置了SQL执行相关的 信息。

-- 1、创建SqlSessionFactory对象
mybatis通过读取配置文件信息(全局配置文件和映射文件),构造出SqlSessionFactory,即会话工厂

// 加载 MyBatis 配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 

-- 2、创建SqlSession对象
通过 SqlSessionFactory 创建 SqlSession 对象,SqlSession 是 MyBatis 与数据库交互的关键对象
SqlSession session = factory.openSession();

-- 3、执行sql
在 SqlSession 中,可以执行各种 SQL 语句,包括查询、插入、更新和删除操作
-- 查询
List<User> userList = session.selectList("com.example.mapper.UserMapper.getAllUsers");
-- 插入
User user = new User("John", 25);
session.insert("com.example.mapper.UserMapper.insertUser", user);
session.commit();

 -- 修改
User user = session.selectOne("com.example.mapper.UserMapper.getUserById", 1);
user.setName("Jane");
session.update("com.example.mapper.UserMapper.updateUser", user);
session.commit(); 
-- 删除
session.delete("com.example.mapper.UserMapper.deleteUser", 1);
session.commit();
  • mybtis执行流程
end
  • 作者:旭仔(联系作者)
  • 发表时间:2024-03-10 20:36
  • 版权声明:自由转载-非商用-非衍生-保持署名
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论