MyBatis 知识点梳理

Posted To Be A BIG Man!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis 知识点梳理相关的知识,希望对你有一定的参考价值。

简单地梳理下MyBatis相关的知识点,主要想让自己重新捡起以前学的框架,如果能给广大程序猿朋友有所帮助那就更好了。有疏漏的地方也欢迎大家评论指出。闲言少叙,进入正题。。。。。。。

 

MyBatis知识梳理

   简介(百度,随便看看)

  1. MyBatis最早源自Apache基金会的一个开源项目iBatis,2010年这个项目有Apache software foundation迁移到了google code,并且改名为MyBatis。
  2. MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
  3. MyBatis封装了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
  4. MyBatis使用简单地XML或注解做配置和定义映射关系,将Java的POJOs(Plain Old Java Objects)映射成数据库中的记录。

 

  MyBatis体系结构中的几个关键部分

  1. 加载配置 —— 可以是XML配置文件方式,也可以是Java代码的注释。MyBatis将SQL的配置信息加载成为一个个的MappedStatement对象(包括了传入参数映射配置,执行的SQL语句、结果映射配置) ,并将其存储在内存中 
  2. SQL解析 —— 当API接口层接收到调用请求时,会收到传入SQL的ID和传入对象(Map、JavaBean或者基本数据类型),MyBatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。
  3. SQL执行 —— 将得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。
  4. 结果映射 —— 将结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。

 

  MyBatis的配置文件

  1. SqlMapConfig.xml(1个):主配置文件,用于指定数据库连接参数和框架参数
     1 <?xml version="1.0" encoding="UTF-8" ?>  
     2 <!DOCTYPE configuration  
     3   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
     4   "http://mybatis.org/dtd/mybatis-3-config.dtd"> 
     5   
     6   
     7 <configuration>
     8     <!-- 全局别名,之后映射文件引用可以使用PersonEntity代替com.maven.mybatis.entity.PersonEntity-->
     9     <typeAliases>
    10         <typeAlias type="com.maven.mybatis.entity.PersonEntity" alias="PersonEntity"/>
    11     </typeAliases>
    12     
    13     <environments default="development">
    14         <environment id="development">
    15             <transactionManager type="JDBC"/>
    16             <dataSource type="POOLED">
    17                 <property name="driver" value="com.mysql.jdbc.Driver"/>
    18                 <property name="url" value="jdbc:mysql://localhost:3306/test"/>
    19                 <property name="username" value="root"/>
    20                 <property name="password" value=""/>
    21             </dataSource>
    22         </environment>
    23     </environments>
    24     <!-- 指定映射定义文件 -->
    25     <mappers>
    26         <mapper resource="com/maven/mybatis/mapper/PersonEntityMapper.xml"/>
    27     </mappers>
    28     
    29 </configuration>

     

  2. SqlMap.xml(n个):映射定义文件,用于定义SQL语句和映射信息
    !!注:namespace有重要作用,不要重复,调用此文件定义增删改查操作是需要指定namespace;
 1 <?xml version="1.0" encoding="UTF-8" ?>  
 2 <!DOCTYPE mapper  
 3   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
 4   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
 5 
 6 <mapper namespace="com.maven.mybatis.mapper.PersonEntityMapper">
 7     <select id="queryAll" resultType="PersonEntity">
 8         select * from t_person
 9     </select>
10     
11     <insert id="insert" parameterType="PersonEntity">
12         insert into t_person(id, name) values(#{id}, #{name})
13     </insert>
14 
15 </mapper> 

 

    

    

  MyBatis框架主要API简介

  • SqlSessionFactoryBuilder:该对象负责根据MyBatis配置文件SqlMapConfig.xml构建SqlSessionFactory实例
  • SqlSessionFactory:每一个MyBatis的应用程序都以一个SqlSessionFactory对象为核心。该对象负责创建SqlSession对象实例。
  • SqlSession:该对象包含了所有执行SQL操作的方法,用于执行已映射的SQL语句。  

 

  MyBatis基本应用

  • 搭建MyBatis技术环境
    • 为工程添加MyBatis开发包和数据库驱动包

      

    • 在src下添加MyBatis配置文件SqlMapConfig.xml
    • 修改SqlMapConfig.xml,指定数据库连接参数
    • 利用MyBatis API编程,获取SqlSession实例

       

  • 获取SqlSession对象
    String conf = "SqlMapConfig.xml";
    InputStream in = Resources.getResourceAsStream(resource);
    
    //创建SqlSessionFactoryBuilder对象
    SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
    //通过SessionFactoryBuilder对象获取SqlSessionFactory
    SqlSessionFactory sf = sfb.build(in);
    
    //创建Session
    SqlSession session = sf.openSession();

     

  • 实现CRUD操作
    • 添加操作
      SqlMap.xml定义
      <!--parameterType因为前面定义过Alias所以不需要写包名,否则要写全包名加类名-->
      <insert id="insert" parameterType="PersonEntity">
              insert into t_person(id, name) values(#{id}, #{name})
          </insert>

      id属性:用于表示映射文件的sql,可以理解为MappedStatement的id
      #{}:标识一个占位符
      parameterType:指定输入参数的类型
      #{name}:其中name表示输入的参数,参数名为name;如果输入参数为简单类型,#{}中参数可以任意。

               


      Java代码

      //NAMESPACE为SqlMapper.xml文件根标签的namespace属性
      SqlSession session = sf.openSession();

      //第一个参数:指映射文件的id值:namespace.id
      //第二个参数:指映射文件中匹配parameterType类型的实参
      session.insert(NAMESPACE
      + ".insert", person); session.commit(); session.close();

       

    • 添加后返回主键
      • mysql自增主键返回,mysql每次在调用完一个INSERT语句时会自动生成一个自增主键,可以通过函数LAST_INSERT_ID()获取到插入记录的自增主键。  
        <insert id="insert" parameterType="PersonEntity">
           <!--查询后将自增主键返回到实体对象-->
          <selectKey keyProperty="id" order="AFTER" resultType="int"> SELECT LAST_INSERT_ID() </selectKey> INSERT INTO t_person(name) VALUES(#{name}) </insert>

        keyProperty属性:配置返回user对象的属性名
        order属性:配置相对于insert语句执行前或执行后
        resultType:指定结果类型

      • 非自增主键返回,使用UUID()函数。在INSERT语句之前执行UUID函数,再将结果插入到INSERT语句中作为主键(主键必须是字符串类型,长度至少是35位)
        <insert id="insert" parameterType="PersonEntity">
            <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
                SELECT REPLACE(UUID(),\'-\',\'\')
            </selectKey>
            INSERT INTO t_person(id, name) VALUES(#{id},#{name})
        </insert>

         

      • Oracle中自增主键返回
        <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
                     SELECT 序列名.nextVal()
        </selectKey>

         

    • 更新操作
      SqlMap.xml定义
      <update id="update" parameterType="PersonEntity">
          update t_person set name=#{name} where id=#{id}
      </update >

      Java代码
      SqlSession session = sf.openSession();
      session.update(NAMESPACE + ".update", person);
              
      session.commit();
      session.close();
    • 删除操作

      SqlMap.xml定义
      <delete id="delete" parameterType="int">
          delete from t_person where id=#{id}
      </select>

      Java代码
      SqlSession session = sf.openSession();
      session.delete(NAMESPACE + ".delete", 100);
              
      session.commit();
      session.close();

       

    • 查询操作
      SqlMap.xml定义
      <!--查询单行记录-->
      <select id="queryById" parameterType="int" resultType="PersonEntity">
          select * from t_person
      </select>
      
      <!--查询多行记录-->
      <select id="queryAll" resultType="PersonEntity">
          select * from t_person
      </select>
      
      <!--查询返回Map类型查询结果-->
      <select id="queryPerson" parameterType="int" resultType="java.util.HashMap">
          select id, name from t_person where id=#{id}
      </select>
      resultType:指定sql输出结果映射的java对象类型,select指定resultType表示单条记录映射程度额Java对象。
      ${}:表示拼接sql字符串,如select * from t_person where name like \'%${value}%\'
      ${value}:接受输入参数的内容;如果传入的类型是简单类型,只能使用value


      Java代码
      SqlSession session = sf.openSession();
      /*
      //查询单行记录
      PersonEntity person = (PersonEntity)session.selectOne(NAMESPACE + ".queryById", 100);
      
      //返回Map查询结果
      Map map = (Map)session.selectOne("queryPerson", 100);
      */
      //查询多行记录
      List<PersonEntity> personList = session.selectList(NAMESPACE + ".queryAll");
              
      session.commit();
      session.close();



  • MyBatis实现分页查询 —— 在使用SqlSession的selectList()方法时,指定一个RowBounds分页器参数,即可查询指定范围的记录。提示:MyBatis分页是基于内存分页,原理是查询出所有记录,然后基于jdbc的absolute()和next()方法定位获取部分记录,因此在遇到大量数据情况下,不推荐使用MyBatis自带分页功能。需要开发者指定分页查询的SQL语句或对MyBatis进行扩展使用。
    • RowBounds(offset, limit)  
      - offset指定抓取记录的起始行,从0开始
      - limit指定抓取记录的数量
    • 使用方法:sqlSession.selectList(SQL的ID, 参数, RowBounds对象);
  • Mapper映射器:是开发者创造绑定映射语句的接口,映射器接口的实例可以从SqlSession中获得。
    SqlSession session = sqlSessionFactory.openSession();
    PersonMapper mapper = session.getMapper(PersonEntity.class);
    
    session.close();

    PersonMapper接口定义:

    public interface PersonMapper{
        public List<PersonEntity> queryAll();
        public PersonEntity queryById(int id);
        public void insert(Person person);
        public void update(Person person);
        public void delete(int id);                       
        //!提示:Mapper接口中的方法名要和SqlMap.xml中的SQL的id保持一致
    }

    遵循如下规范,MyBatis会自动给我们创建实现该接口的代理对象
    - 在mapper.xml的namespace属性值必须是mapper接口的全路径
    - mapper接口中的方法名必须和mapper.xml文件中的id值相同
    - mapper接口中的输入参数类型必须和mapper.xml中statement中的parameterType类型相同
    - mapper接口中的方法的返回值类型和mapper.xml中statement中的resultType的类型相同


  • ResultMap映射定义
    在SqlMap.xml定义<select>操作时,如果查询结果字段名和Java POJO属于不一致时,需要使用<resultMap>元素显示指定映射关系,例如
    <select id="queryAll1" resultMap="personMap">
        select id, name from t_person
    </select>
    
    <resultMap id="personMap" type="PersonEntity">
        <result property="no" column="id" />
        <result property="username" column="name" />
    </resultMap>

 

  • SqlMapConfig.xml核心配置文件介绍
    • properties属性
      - 这个属性标签可以用来引用外部的properties的文件
      - MyBatis会按一定顺序来加载属性:1)优先读取properties标签体内定义的属性。2)然后读取properties标签中的resource或url属性,并且会覆盖已读取的同名属性。3)最后读取parameterType传递的属性,它会覆盖已读取的同名属性。
      <!-- 引用外部propertes文件替代硬编码的jdbc配置 -->
          <properties resource="db.properties"></properties>
          <!-- 因为将来要和spring进行整合,这部分用不上了 -->
          <environments default="development">
              <environment id="development">
              <!-- 使用jdbc的事务,由mybatis管理 -->
                    <transactionManager type="JDBC"/>
                    <!-- 数据库连接池配置,由mybatis管理 -->
                  <dataSource type="POOLED">
                      <property name="driver" value="${jdbc.driver}"/>
                      <property name="url" value="${jdbc.url}"/>
                      <property name="username" value="${jdbc.username}"/>
                      <property name="password" value="${jdbc.password}"/>
                  </dataSource>
                  </environment>
            </environments>

       



    • settings(全局配置参数):在myBatis框架在运行时可以调整一些运行参数

设置参数

描述

有效值

默认值

cacheEnabled

该配置影响的所有映射器中配置的缓存的全局开关。

true | false

true

lazyLoadingEnabled

延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。

true | false

false

aggressiveLazyLoading

当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载。

true | false

true

multipleResultSetsEnabled

是否允许单一语句返回多结果集(需要兼容驱动)。

true | false

true

useColumnLabel

使用列标签代替列名。不同的驱动在这方面会有不同的表现, 具体可参考相关驱动文档或通过测试这两种不同的模式来观察所用驱动的结果。

true | false

true

useGeneratedKeys

允许 JDBC 支持自动生成主键,需要驱动兼容。 如果设置为 true 则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可正常工作(比如 Derby)。

true | false

False

autoMappingBehavior

指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示取消自动映射;PARTIAL 只会自动映射没有定义嵌套结果集映射的结果集。 FULL 会自动映射任意复杂的结果集(无论是否嵌套)。

NONE, PARTIAL, FULL

PARTIAL

autoMappingUnknownColumnBehavior

以上是关于MyBatis 知识点梳理的主要内容,如果未能解决你的问题,请参考以下文章

mybatis源码过程学习梳理

mybatis源码过程学习梳理

mybatis源码过程学习梳理

mybatis源码过程学习梳理

Mybatis-基本学习(上)

Mybatis框架知识整理

(c)2006-2024 SYSTEM All Rights Reserved IT常识