首页 > 代码库 > MyBatis 知识点梳理

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 知识点梳理