MyBatis源码分析(一)

MyBatis故事:

  官方网站:http://www.mybatis.org

  官方文档:http://www.mybatis.org/mybatis-3/ 

  GitHub:https://github.com/mybatis

通过在MyBatis的官方网站,我们会看到和MyBatis相关的一些软件产品:

  MyBatis Migrations 是一款数据库迁移工具 http://www.mybatis.org/migrations

  MyBatipse (Eclipse plugin) ,Eclipse插件提供在编写xml配置文件时的内容提示和验证;

  MyBatis Generator 代码生成工具;

What is MyBatis?

MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.

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

MyBatis SQL mapper framework for Java可以将其称之为Java持久层框架.

MyBatis 的前身是apache下的一个开源项目iBatis,  iBATIS是一个由Clinton Begin在2002年发起的开源项目,是一个基于Java的持久层框架。

iBATIS:http://ibatis.apache.org

iBATIS这个项目于2010年6月16号由apache迁移到了google code,iBatis3.x并且改名为MyBatis 。

MyBatis: http://code.google.com/p/mybatis/ (现在已经无法打开)

2013年11月MyBatis又从google code将代码迁移到Github。

MyBatis和Hibernate

MyBatis的作者:Clinton Begin 加拿大人  https://www.linkedin.com/in/clintonbegin 

Hibernate 2001年推出的Java持久层框架,澳大利亚人 Gavin King  https://www.linkedin.com/in/GavinKing 

人们经常喜欢比较这两款优秀的持久层框架的特点:

技术 优点 缺点
jdbc 简单,纯粹,一切均可见,最基础的一种技术

1:需要手动关闭连接

2:结果集不能自动映射为对象

3:SQL夹杂在代码中,耦合度高,导致硬编码内伤

4:实际开发中SQL经常随需求变动,导致频繁修改,不易维护

jdbcTemplate

简单、纯粹、自动会话管理、结果集映射

需要手动拼装SQL,SQL与Java代码混合在一起,长的SQL管理混乱

Hibernate

JPA

编程效率高,无需编写SQL
数据库更换成本低

较完善的二级缓存、自动防SQL注入

完全掌握的门槛高
复杂SQL、复杂映射处理困难
性能优化较麻烦、不易做特殊优化
基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难,导致数据库性能下降

MyBatis

学习成本低、可以进行更为细腻SQL优化,减少查询字段、统一的SQL管理
SQLJava编码分开,功能边界清晰

需要手动编写维护SQL、表结构变更之后需要手动维护SQL与映射;

 MyBatis的定位

MyBatis专注于SQL本身,其为SQL映射,而非完整的SQL映射,它是一个半自动的ORM框架,需要自己编写SQL语句,这是其优点,也是缺点.

优点:SQL语句单独维护,便于SQL优化,便于发挥SQL的最大性能.

缺点:当数据库表和字段更改后,实体和数据库的映射关系需要手动维护,耗费时间长.

使用场景:是用于性能要求高,有大量的查询操作,适用于互联网项目,如:电商,O2O

互联网项目对持久层的需求:

1:对数据库的访问更加纯粹

2:尽可能不要使用数据库做运算

3:SQL语句尽可能命中索引(字段排序,查询字段,查询条件,尽可能命中索引)

MyBatis实战应用:

  Mybatis框架就一个jar包;要使用 MyBatis, 只需将 mybatis-3.5.1.jar 文件置于 classpath 中即可。

  使用Maven构建项目


    org.mybatis
    mybatis
    3.5.1

下载MyBatis源码,构建MyBatis项目;https://codeload.github.com/mybatis/mybatis-3/zip/mybatis-3.5.1

如果不出意外,我们解压下载的压缩包,然后通过pom.xml导入IDEA中,通过Maven的compiler就可以正常编译成功,首次编译可能需要一定时间。

为了验证我么编译的项目是否可用,我们可以写一个简单的案例项目去测试一下,也方便后续的断点跟踪源码分析。

创建普通的Maven项目,添加Maven依赖

 

 
            junit
            junit
            4.11
            test
        

        
        
            mysql
            mysql-connector-java
            5.1.47
        

        
        
            org.projectlombok
            lombok
            1.18.8
        

        
        
            org.slf4j
            slf4j-api
            1.7.26
        

        
        
            org.apache.logging.log4j
            log4j-api
            2.11.2
        
        
            org.apache.logging.log4j
            log4j-slf4j-impl
            2.11.2
        

        
        
            cglib
            cglib
            3.3.0
        

        
        
            org.javassist
            javassist
            3.27.0-GA
        

 

添加resources编译,个人建议添加

  
            
                src/main/java
                
                    **/*.xml
                
            
            
                src/main/resources
                
                    **/*.*
                
            
        

添加jdbc.properties,根据自身配置

jdbc.username=xxx
jdbc.password=xxxxx
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://xxxx:3306/xxx?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useSSL=false

最后贴上mybatis的xml配置

"1.0" encoding="UTF-8" ?>
DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">




    

    
    "D:\mybatis-3-mybatis-3.5.1\mybatis3-test\src\main\resources\jdbc.properties"/>

    
        
        "logImpl" value="SLF4J"/>
        
        "cacheEnabled" value="true"/>
    

    
    
        "com.xxx.model.User" alias="User"/>
    

    
        
        "com.xxx.type.CryptHandlerType"
                javaType="com.xxx.model.IdCardType"/>
    

    
    

    
    default="development">
        "development">
            "org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory"/>
            "POOLED">
                "driver" value="${jdbc.driver}"/>
                "url" value="${jdbc.url}"/>
                "username" value="${jdbc.username}"/>
                "password" value="${jdbc.password}"/>
            
        

        "test">
            "JDBC"/>
            "POOLED">
                "driver" value="${jdbc.driver}"/>
                "url" value="${jdbc.url}"/>
                "username" value="${jdbc.username}"/>
                "password" value="${jdbc.password}"/>
            
        

        "product">
            "JDBC"/>
            "POOLED">
                "driver" value="${jdbc.driver}"/>
                "url" value="${jdbc.url}"/>
                "username" value="${jdbc.username}"/>
                "password" value="${jdbc.password}"/>
            
        
    

    
    
      
        "com/xxx/mapper/UsersMapper.xml"/>
    

日志配置

"1.0" encoding="UTF-8"?>
"debug">

    
        "Console" target="SYSTEM_OUT">
            "%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        
    

    
        "debug">
            ref="Console"/>
        
    

贴上本人的项目结构,仅供参考

 

MyBatis源码分析(一)_第1张图片

MyBatis独立使用  

     //通过配置文件获取输入流
        InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");

        //构建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);

        //打开session
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //第四步 获取Mapper接口对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        //第五步 调用Mapper接口对象的方法操作数据库
        User user = mapper.selectByPrimaryKey(1);

        //获取结果,处理业务
        log.info("查询结果:",user.getId());

 

当我们数据库配置等都设置完毕,正常来说查询数据是不会出现异常的,这样就说明我们的源码编译是成功的。

MyBatis Generator (MBG)

 

 

MyBatis Generator 简称MBG,是用Java语言开发的一个代码生成工具,可以深入分析你的数据库和表,帮助你生成基本的对数据库的CRUD操作代码以及QBC风格的条件查询,但是表连接、存储过程等这些复杂SQL的定义需要我们手工编写。

 

MyBatis Generator 生成3个东西:

1、POJO

2、Mapper XML Files

3、Mapper interface

MyBatis Generator 生成代码不需要依赖任何第三方jar包,仅仅需要一个jdbc驱动包;

文档:http://www.mybatis.org/generator/

Github:https://github.com/mybatis/generator

原来MyBatis Generator老版本:ibator,用于iBatis代码生成;

1、配置MyBatis Generator (MBG) 的配置文件

"1.0" encoding="UTF-8"?>
DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">



    
    "jdbc.properties"/>

    
    "F:/mysql-connector-java-5.1.46.jar"/>

    
    "tables" targetRuntime="MyBatis3">

        
        
            "suppressAllComments" value="true" />
        

        
        
            "driverClass" value="${jdbc.driver}"/>
            "connectionURL" value="${jdbc.url}"/>
            "userId" value="${jdbc.username}"/>
            "password" value="${jdbc.password}"/>
        

        
        

        
        "org.mybatis.model" targetProject="src/main/java">
            "enableSubPackages" value="false" />
            "trimStrings" value="false" />
        

        
        "org.mybatis.mapper" targetProject="src/main/java">
            "enableSubPackages" value="false" />
        

        
        "XMLMAPPER" targetPackage="org.mybatis.mapper" targetProject="src/main/java">
            "enableSubPackages" value="false" />
        

        
        "user"
                domainObjectName="User"
                enableCountByExample="false"
                enableUpdateByExample="false"
                enableDeleteByExample="false"
                enableSelectByExample="false"
                selectByExampleQueryId="false"/>
    

1、生成代码

   --通过命令行生成 java -jar mybatis-generator-core-1.3.7.jar -configfile generatorConfig.xml (用得比较少)

   --通过Ant生成 ant几乎被淘汰了)

   --通过java程序生成

   --通过maven生成 

 
            
            
                org.mybatis.generator
                mybatis-generator-maven-plugin
                1.3.7
                
                    
                    src/main/resources/generatorConfig.xml
                    
                    true
                    
                    true
                
            
        

   --通过Eclipse生成

建议不要用mysql驱动8.0, 5.1.x系列的驱动;

使用maven插件通过以下方式即可自动生成。

MyBatis源码分析(一)_第2张图片

在源码分析的前面,我会分享一些MyBatis的常规应用

 

你可能感兴趣的:(MyBatis源码分析(一))