• mybatis源码阅读系列(一)


    源码下载

    mybatis

    初识mybatis

    MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects)映射成数据库中的记录。
    MyBatis 的几个主要特点:

    1. 支持定制化 SQL、存储过程和高级映射:MyBatis 主要管理 SQL 语句的运行,让开发者可以专注于 SQL 语句本身,而不是花费精力处理 JDBC 等数据库连接相关的代码。
    2. 灵活的映射规则:MyBatis 提供了很多灵活的映射规则,比如一对一、一对多、多对多等复杂关系都可以通过简单的 XML 配置实现。
    3. 松耦合:MyBatis 不会像一些传统的 ORM 框架那样强迫你使用某种编程模型,它允许你使用简单的 XML 或注解来配置 SQL 语句和映射关系,不会强制你抽象出 POJOs。
    4. 易于上手和集成:MyBatis 易于理解和实施,它可以很容易地集成到各种应用之中。
    5. 动态 SQL:MyBatis 提供了强大的动态 SQL 功能,可以方便地实现复杂的查询和操作。
    6. 可定制 SQL 执行:MyBatis 允许自定义 SQL 执行语句,提供了包括插件在内的多种方式来优化 SQL 的执行。
    7. 丰富的映射标签:MyBatis 提供了丰富的映射标签,使得数据库操作更加灵活、方便。
    8. 良好的支持性:MyBatis 支持多种数据库,如 MySQL、Oracle、SQL Server、H2、Sqlite 等。
      MyBatis 的使用步骤大致如下:
    9. 配置 MyBatis:通过 SQL 映射文件或注解来配置 SQL 语句。
    10. 创建会话工厂(SqlSessionFactory):通过配置文件或代码来创建 SqlSessionFactory。
    11. 创建 SQL 会话(SqlSession):利用 SqlSessionFactory 来创建 SQL 会话。
    12. 执行操作:通过 SQL 会话执行定义好的 SQL 语句。
    13. 处理结果:根据执行的 SQL 语句处理结果集。
    14. 关闭会话:操作完成后关闭 SQL 会话。
      MyBatis 框架在国内外都有广泛的应用,是 Java 开发中常用的一种数据库操作框架。

    原生jdbc操作数据库

    原生 JDBC(Java Database Connectivity)是指 Java 数据库连接,它是一个用于 Java 程序和各种数据库之间进行交互的 API。JDBC 提供了一种标准方法来访问数据库,允许 Java 应用程序以一种统一的方式与不同的数据库进行通信。

    package com.wyl.mybatis.service;
    
    import java.sql.*;
    
    /**
     * @Description
     * @Author WuYiLong
     * @Date 2024/2/26 11:36
     */
    public class JdbcService {
    
        /**
         * 数据库链接
         */
        private static final String url = "jdbc:mysql://localhost:3306/blog?zeroDateTimeBehavior=CONVERT_TO_NULL&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=GMT%2B8";
    
        /**
         * 用户名
         */
        private static final String username = "root";
    
        /**
         * 密码
         */
        private static final String  password = "123456";
    
        public static void main(String[] args) {
            try {
                // 加载所需的 JDBC 驱动,这通常是通过调用 Class.forName() 方法来完成的
                Class.forName("com.mysql.cj.jdbc.Driver");
                // 使用 DriverManager.getConnection() 方法建立与数据库的连接。
                Connection connection = DriverManager.getConnection(url, username, password);
                // 创建一个 Statement 或 PreparedStatement 对象来执行 SQL 语句。
                String sql = "SELECT * FROM `b_expert` limit 10;";
                PreparedStatement preparedStatement = connection.prepareStatement(sql);
                preparedStatement.executeQuery(sql);
                // 如果是查询操作,执行 executeQuery() 方法,并处理返回的 ResultSet。
                ResultSet resultSet = preparedStatement.executeQuery(sql);
                // 通过遍历,输出数据
                while (resultSet.next()) {
                    System.out.println("专家名称:"+resultSet.getString("name"));
                }
                // 关闭 ResultSet、Statement 和 Connection,以释放数据库资源。
                resultSet.close();
                preparedStatement.close();
                connection.close();
            } catch (SQLException | ClassNotFoundException throwables) {
                System.out.println(throwables.getMessage());
            }
        }
    }
    
    
    • 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
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    image.png

    mybatis操作数据库

    数据表设计

    CREATE TABLE `d_full_city` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
      `name` varchar(255) DEFAULT NULL COMMENT '名称',
      `code` varchar(255) DEFAULT NULL COMMENT '区域码',
      `full_name` varchar(255) DEFAULT NULL COMMENT '全名称',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=46476 DEFAULT CHARSET=utf8mb4 COMMENT='省市区-字典';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    实体类

    package com.wyl.mybatis.entity;
    
    /**
     * @Description 省市区-字典
     * @Author wuyilong
     * @Date 2024-02-26
     */
    public class FullCity {
    
        private static final long serialVersionUID = 1L;
    
        /**
         * 主键ID
         */
        private Long id;
    
        /**
         * 名称
         */
        private String name;
    
        /**
         * 区域码
         */
        private String code;
    
        /**
         * 全名称
         */
        private String fullName;
    
        public static long getSerialVersionUID() {
            return serialVersionUID;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getCode() {
            return code;
        }
    
        public void setCode(String code) {
            this.code = code;
        }
    
        public String getFullName() {
            return fullName;
        }
    
        public void setFullName(String fullName) {
            this.fullName = fullName;
        }
    }
    
    
    • 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
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    mapper接口

    package com.wyl.mybatis.mapper;
    
    import com.wyl.mybatis.entity.FullCity;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Param;
    
    /**
    * @Description 省市区-字典
    * @Author wuyilong
    * @Date 2024-02-26
    */
    @Mapper
    public interface FullCityMapper {
    
        /**
         * 根据名称查询
         * @param name
         * @return
         */
        FullCity selectByName(@Param("name") String name);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    mapper.xml

    
    DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.wyl.mybatis.mapper.FullCityMapper">
    
      
      <resultMap id="BaseResultMap" type="com.wyl.mybatis.entity.FullCity">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="code" property="code"/>
        <result column="full_name" property="fullName"/>
      resultMap>
    
      <select id="selectByName" resultType="com.wyl.mybatis.entity.FullCity">
        select * from d_full_city where name = #{name}
      select>
    
    
    mapper>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    mybatis的配置文件

    
    DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
    <configuration>
        
    
        <properties resource="mybatis-mysql.properties">
            <property name="username" value="root"/>
            <property name="password" value="root"/>
            <property name="driver" value=""/>
            <property name="url" value=""/>
        properties>
        
        <settings>
            
            <setting name="cacheEnabled" value="true"/>
    
    
    
    
    
    
    
    
    
    
    
    
    
        settings>
    
        
        <environments default="development">
            
            <environment id="development">
                
                <transactionManager type="jdbc">transactionManager>
                
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                dataSource>
            environment>
        environments>
    
        <mappers>
            <mapper resource="./mapper/ExpertMapper.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
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    mybatis的数据库配置文件

    username=root
    password=123456
    driver=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/blog?zeroDateTimeBehavior=CONVERT_TO_NULL&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=GMT%2B8
    
    • 1
    • 2
    • 3
    • 4

    执行过程

    package com.wyl.mybatis.service;
    
    import com.wyl.mybatis.entity.FullCity;
    import com.wyl.mybatis.mapper.FullCityMapper;
    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 java.io.IOException;
    import java.io.InputStream;
    
    /**
     * @Description
     * @Author WuYiLong
     * @Date 2024/2/26 16:04
     */
    public class MybatisService {
    
        public static void main(String[] args) throws IOException {
            InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession sqlSession = sqlSessionFactory.openSession();
    
            FullCityMapper mapper = sqlSession.getMapper(FullCityMapper.class);
            FullCity fullCity = mapper.selectByName("广东省");
            System.out.println("城市的名称:"+fullCity.getName());
    
        }
    }
    
    
    • 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

    在这里插入图片描述

    总结

    JDBC 提供了最底层的访问数据库的方式,直接使用SQL语句,灵活但需要手动管理连接和事务。
    MyBatis 是在JDBC之上的一个抽象层,隐藏了如何连接数据库、如何处理事务、如何关闭流、自动提交,通过ORM提供了更高层次的数据库操作,通过编写简单的sql就可以完成增删改查,简化了开发流程,更适合于复杂的SQL操作和动态SQL需求。
    所以在选择使用JDBC还是MyBatis时,通常考虑应用的复杂性、性能需求和开发效率等因素。对于简单的数据库操作,JDBC可能更直接高效;而对于复杂的业务逻辑和大量的数据库交互,MyBatis提供的抽象和便利可能会更加合适。

    在这里插入图片描述

  • 相关阅读:
    如何判断SSL证书的安全性高低?越贵越好?懂点原理会少花冤枉钱
    URLConnection程序报java.net.ConnectException: Connection refused: connect
    无人机航线规划
    DM达梦数据库的使用以及数据迁移工具的使用
    信息系统项目管理师 第四版 口诀
    连夜整理七个开源项目:练手、毕设、接私活都不愁了
    【b站韩顺平 快速学Java课】Java的JDK8(包括公共JRE8)安装教程 总结
    MySQL性能优化之索引设计
    物理机、虚拟机、容器(docker)
    沃通CA证书支持多所高校招投标文件电子签名
  • 原文地址:https://blog.csdn.net/weixin_44830665/article/details/136768825