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核心配置文件介绍

未完,待续。。。。。。



MyBatis 知识点梳理

时间: 2024-08-05 06:42:21

MyBatis 知识点梳理的相关文章

jquery知识点梳理

jQuery知识点梳理 一.              jquery选择器 基本选择器 ID选择器 类选择器 标记选择器 分组选择器 通配符选择器 层次选择器 $(“ancestor descendent”):祖先后代选择器    空格 $(“parent > child”):父子选择器   大于 $(“prev + next”):相邻后兄弟元素选择器   加号 $(“prev ~ siblings”):所有后兄弟元素选择器  波浪线 过滤选择器:基本过滤选择器 :first.:last.:od

Javascript重要知识点梳理

Javascript重要知识点梳理 说明 Javascript流程控制 js中常用的数据类型 var关键字的使用 if – else if – else switch while for Javascript常用函数 1.  字符串函数 substring indexOf lastIndexOf charAt replace split toLowerCase toUpperCase 2.  数学运算函数 3.  数据类型转换函数 parseInt parseFloat Math.abs Mat

[独孤九剑]Oracle知识点梳理(十)%type与%rowtype及常用函数

本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracle知识点梳理(四)SQL语句之DML和DDL [独孤九剑]Oracle知识点梳理(五)数据库常用对象之Table.View [独孤九剑]Oracle知识点梳理(六)数据库常用对象之Procedure.function.Sequence [独孤九剑]Oracle知识点梳理(七)数据库常用对象之Curs

[独孤九剑]Oracle知识点梳理(七)数据库常用对象之Cursor

本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracle知识点梳理(四)SQL语句之DML和DDL [独孤九剑]Oracle知识点梳理(五)数据库常用对象之Table.View [独孤九剑]Oracle知识点梳理(六)数据库常用对象之Procedure.function.Sequence [独孤九剑]Oracle知识点梳理(八)常见Exception

[独孤九剑]Oracle知识点梳理(八)常见Exception

本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracle知识点梳理(四)SQL语句之DML和DDL [独孤九剑]Oracle知识点梳理(五)数据库常用对象之Table.View [独孤九剑]Oracle知识点梳理(六)数据库常用对象之Procedure.function.Sequence [独孤九剑]Oracle知识点梳理(七)数据库常用对象之Curs

[独孤九剑]Oracle知识点梳理(九)数据库常用对象之常见package

本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracle知识点梳理(四)SQL语句之DML和DDL [独孤九剑]Oracle知识点梳理(五)数据库常用对象之Table.View [独孤九剑]Oracle知识点梳理(六)数据库常用对象之Procedure.function.Sequence [独孤九剑]Oracle知识点梳理(七)数据库常用对象之Curs

[独孤九剑]Oracle知识点梳理(四)SQL语句之DML和DDL

本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracle知识点梳理(五)数据库常用对象之Table.View [独孤九剑]Oracle知识点梳理(六)数据库常用对象之Procedure.function.Sequence [独孤九剑]Oracle知识点梳理(七)数据库常用对象之Cursor [独孤九剑]Oracle知识点梳理(八)常见Exception

[独孤九剑]Oracle知识点梳理(六)数据库常用对象之Procedure、function、Sequence

本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracle知识点梳理(四)SQL语句之DML和DDL [独孤九剑]Oracle知识点梳理(五)数据库常用对象之Table.View [独孤九剑]Oracle知识点梳理(七)数据库常用对象之Cursor [独孤九剑]Oracle知识点梳理(八)常见Exception [独孤九剑]Oracle知识点梳理(九)数

[独孤九剑]Oracle知识点梳理(零)目录

本系列只涉及到Oracle的具体用法,没有上升到理论层面,都是日常工作中总结积累出的零碎知识点,基本上都是一些使用例子,哪天用到了,可以直接复制出来改改. [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracle知识点梳理(四)SQL语句之DML和DDL [独孤九剑]Oracle知识点梳理(五)数据库常用对象之Table.View [独孤九剑]Oracle知识点梳理(六