MyBatis

本文详细介绍了MyBatis框架,包括其概念、优缺点及适用场景。重点讲解了MyBatis的核心对象SqlSessionFactoryBuilder、配置文件和SQL映射文件的使用。还深入探讨了如何使用MyBatis实现条件查询、动态SQL,如if、choose、foreach等,并介绍了MyBatis的缓存机制和分页功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初始MyBatis

1.框架的概念

  • 框架(Framework)是一个可重用的公式结构的半成品

2.主流框架的介绍

  • Struts 2框架

    Struts 2 以WebWork优秀的设计思想为核心,吸收力Struts框架的部分优点,提供了一个更加整洁的基于MVC设计模式实现的Web应用程序框架

  • Hibernate框架

    Hibernate是一个优秀的持久化框架,负责简化将对象数据保存到数据库中,或从数据库中读取数据并封装到对象的工作

  • Spring框架

    Spring也是一个开源框架,它是一个轻量级的框架,渗透了JavaEE技术的方方面面

  • SpringMVC框架

    SpringMVC是Spring框架的构建Web应用程序的全功能MVC模块,属于SpringFramework的后续产品,已经融合在Spring Web Flow里面,是结构最清晰的MVC Model2的实现

  • MyBatis框架

    MyBatis是一个优秀的数据持久层框架,在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM实现

3.MyBatis框架及ORM

  • MyBatis框架简介

    MyBatis是一个开源的数据持久层框架 ,它内部封装了通过JDBC访问数据库的操作,支持普通的SQL查询,存储过程和高级映射,几乎消除了所有的JDBC代码和参数的手工设置以及结果集的检索

  • 什么是ORM

    ORM(Object/Relation Mapping)即对象/关系映射,是一种数据持久化技术

4.MyBatis框架的优点缺点及其适用场合

  • MyBatis框架的优点

    (1)与JDBC相比,减少了50%以上的代码量

    (2)MyBatis是最简单的持久化框架,小巧并且简单易学

    (3)MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任 何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度, 便于统一管理和优化,并可重用

    (4)提供XML标签,支持编写动态SQL语句

    (5)提供映射标签,支持对象与数据库的ORM字段关系映射

  • MyBatis框架的缺点

    (1)SQL语句的编写工作量大,对开发人员编写SQL语句的功底有一定 要求

    (2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据 库

  • Mybatis框架适用场合

    MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案,对性能要求很高,或者需求变化较多的项目。

5.MyBatis的基本要素-核心对象

  • 核心接口和类
  • MyBatis核心配置文件(mybatis-config.xml)
  • SQL映射文件(mapper.xml)
5.1 SqlSessionFactoryBuilder的作用
  • build(Reader rader,String environment,Properties properties)
  • build(InputStream inputStream ,String environment,Properties properties)
  • build(Configuration config)
5.2 SqlSessionFactoryBuilder 的生命周期和作用域
		SqlSessionFactoryBuilder 的最大特点是:用过即丢。

5.3 SqlSessionFactory的作用

	    SqlSessionFactory简单的理解就是创建SqlSession实例的工厂

5.4 SqlSeesionFactory 的生命周期和作用域

		SqlSeesionFactory 对象一旦创建,就会在整个应用运行过程中始终存在

5.5 SqlSession的作用

​ SqlSession是用于执行持久化操作的对象,类似于JDBC中的Connection

5.6 SqlSession的生命周期和作用域

​ SqlSession对应着一次数据库会话,由于数据库会话不是永久的,因此 SqlSession的生命周期也不应该是永久的

6.MyBatis的基本要素-核心配置文件

6.1 MyBatis-config.xml文件结构
  • properties元素

    描述的都是外部化,可替代的属性

    1.database.properties:
      driver=com.mysql.jdbc.Driver
      url=jdbc:mysql://127.0.0.1:3306/smbms
      user=root
      password=root使用
    2.mybatis-config.xml部分内容
    <!--引入 database.properties 文件-->
    <properties resouces="database.properties"/>
    <dataSouces type="POOLED">
    		<property name="driver" value="${driver}">
    		<property name="url" value="${url}">
    		<property name="username" value="${user}">
    		<property name="password"value="${password}">
    </dataSouces>
    
  • settings元素

    设置项描述允许值默认值
    cacheEnabled对在此配置文件下的所有cache进行全局开/关设置true/falsetrue
    lazyLoadingEnabled全局性设置懒加载,如果设为fasle,则所有相关联的都会被初始化加载true/falsetrue
    autoMappingBehaviorMyBatis对于resultMap自动映射的匹配级别NONE|PARTIAL|FULLPAPTIAL
  • typeAliases元素

    typeAliases元素的作用是配置类型别名,通过与MyBatis的SQL映射文件 相关联,减少输入多余的完整类名,以简化操作

  • environments元素

    MyBatis可以配置多套运行环境,如开发环境,测试环境,生产环境等,我们就可以灵活选择不同的配置,从而将SQL映射应用到不同的数据库环境上

  • mapper元素

    mapper:映射器,用来定义SQL的映射语句,我们只需要告诉MyBatis去哪里找到这些SQL语句,即去哪里找相应的SQL映射文件。

SQL映射文件

1.使用MyBatis实现条件查询

1.1 SQL映射文件

  • mapper:映射文件的根元素节点,只有一个属性namespace
  • cache:配置给定命名空间的缓存
  • cache-ref:从其他命名空间引用缓存配置
  • resultMap:用来描述数据库结果集和对象的对应关系
  • sql:可以重来的SQL块,也可以被其他语句引用
  • insert:映射插入语句
  • update:映射更新语句
  • delete:映射删除语句
  • select:映射查询语句
1.2 使用select完成单条件查询

与查询对应的select元素是使用MyBatis时最常用的元素,

  • id:命名空间中唯一的标识符,可以被用来引用这条语句

  • parameterType:表示查询语句传入参数的类型的完全限定名或别名

    别名映射的类型别名映射的类型
    stringStringdoubleDouble
    byteBytefloatFloat
    longLongbolleanBollean
    shortShortdateDate
    intIntegermapMap
    integerIntegerhashmapHashMap
    arraylistArrayListlistList
  • resultType:查询语句返回结果类型的完全限定名或别名

1.3 使用resultMap 完成查询结果的展现

resultMap元素的属性值和子节点

  • id属性:唯一标识,此id值用于select元素resultMap属性的引用

  • type属性:表示该resultMap的映射结果类型

  • result 子节点:用于标识一些简单属性,其中column属性表示从数据库中查询的字段名,property则表示查询出来的字段对应的值赋给实体对象的哪个属性

    1.resultType 直接表示返回类型,包括基础数据类型和复杂数据类型

    2.resultMap 是对应外部resultMap定义的引用,对应外部resultMap的id,表示返回结果映射到哪一个resultMap上

    3.resultType和resultMap的关联 在MyBatis进行查询映射的时候,其实查询出来的每个字段值都放在一个对应的Map里面,其中键是字段名,值则是其对应的值

    4.resultMap的自动映射级别为了自由灵活地控制映射结果,达到只关心的属性进行赋值填充的目的

1.4使用@param注解实现多参数入参

直接进行多参数入参即可,代码可读性高,可清晰地看出这个接口方法所需的参数是什么,当方法参数有多个时,每个参数目前都需要增加@param注解

public int updatePwd(@param("id")Integer id,@param("userPassword")String pwd);

2.使用resultMap实现高级结果映射

​ 1.属性

  • id:resultMap的唯一标识
  • type:表示该resultMap的映射结果类型
2.子节点
  • id:一般对应数据库中该行的主键id,设置此项可以提升MyBatis性能
  • result:映射到JavaBean的某个"简单类型"属性,如基础数据类型,包装类等
2.1 association

​ 映射到JavaBean的某个"复杂类型"属性,比如JavaBean类,即JavaBean内部嵌套一个复杂数据类型属性,这种情况就属于复杂类型的关联

  • javaType:完整java类名或者别名

  • property:映射数据库列的实体对象的属性

    asscoication的子元素

  • property:映射数据库列的实体对象的属性

  • column:数据库列名或别名

2.2 collection
  • ​ collection元素的作用和association元素的作用差不多一样,事实上,他们非常类似,也是映射到JavaBean的某个"复杂类型"属性,只不过这个属性是一个集合复杂数据类型属性列表,即JavaBean内部嵌套一个

  • ofType:完整Java类名或者别名,即集合所包含的类型

  • property:映射数据库列的实体对象的属性

3.resultMap自动映射级别和MyBatis缓存

3.1 resultMap自动映射级别
  • NONE:禁止自动匹配
  • PARTIAL(默认):自动匹配所有属性,有内部嵌套(association,collection)的除外
  • FULL:自动匹配所有
3.2 MyBatis缓存
  • 一级缓存

    一级级缓存是基于PerpetualCache的HashMap本地缓存,作用范围为seesion域内,当session flush或者chose之后,该session中所有cache就会被清空

  • 二级缓存

    二级缓存就是global caching,它超出范围之外,可以被所有SqlSession共享,开启它只需要在MyBatis的核心配置文件settings设置即可

  • 二级缓存的配置

    (1)MyBatis的全局cache配置,需要在mybatis-config.xml的settings中设置,代码如下

    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>
    

    (2)在mapper文件中设置缓存,默认情况下是没有开启缓存的

    <mapper namespace="cn.smbms.dao.user.UserMapper">
    <!-- cache配置 -->
    <cache
        eviction="FIFO"
        flushInterval="60000"
        size="512"
        readOnly="true"/>
     .....
     </mapper>
    

动态SQL

1.使用动态SQL完成多条件查询

  • if:利用if实现简单的条件选择
  • choose:相当于Java中的switch语句,通常when和otherwise搭配
  • where:简化SQL语句中where的条件判断
  • set:解决动态更新语句
  • trim:可以灵活地去除多余的关键字
  • foreach:迭代一个集合,通常用于in条件

1.1 使用if+trim实现多条件查询

  • prefix:前缀,作用是通过自动识别是否有返回值后,在trim包含的内容上加上前缀,如where
  • suffix:后缀,作用是trim包含内容上加上后缀
  • prefixOverrides:对于trim包含内容的首部进行指定内容的忽略
  • suffixOverrides:对于trim包含内容的首尾部进行指定内容的忽略
2.使用froeach完成复杂查询

2.1MyBatis入参为数组类型的froeach迭代

  • item:表示集合中每一个元素进行迭代时的别名
  • index:指定一个名称,用于表示在迭代过程中,每次迭代到的位置
  • open:表示该语句以书面开始(既然是in条件语句,所以必须以"("开始)
  • separator:表示在每次记性迭代之间以符号作为分隔符(既然是in条件语句,所以必然以","作为分隔符)
  • close:表示该语句以什么结束(既然是in条件语句,所以必然是以")"结束)
  • collection:最关键并最容易出错的属性,需格外注意,该属性必须指定,不同情况下,该属性的值不一样的
2.2 MyBis入参为List类型的foreach迭代

List<User> userList = new ArrayList<>(User);
List<Integer> roleList = new ArrayList<Integer>();
roleList.add(2);
roleList.add(3);
userList=sqlSession.getMapper(UsreMapper.class).
getUserByRoleId_foreach_array(roleIds);
2.3 MyBatis 入参为Map类型的froeach迭代
List<Integer> roleList = new ArrayList<Integer>();
roleList.add(2);
roleList.add(3);
Map<String,Object> roleMap = new HasMap<String,Object>();
roleMap.put("rKey",roleList);
2.4 choose(when,otherwise)

​ 对于某些查询需求,虽有多个查询条件,但是我们不想应有所有的条件,只想选择其中一中情况下的查询结果

  • when元素:当其test属性中条件满足的时候,就会输出when元素中的内容
  • otherwise元素:当when中的所有条件都不满足的时候,就会自动输出otherwise元素的内容

3.MyBatis实现分页功能

1.UserMapper.java

  /**
     * 查询用户列表(分页显示)
     * @param userName
     * @param roleId
     * @param currentPageNo
     * @param pageSize
     * @return
     */
    List<User> getUserList(@Param("userName") String userName,
                           @Param("roleId") Integer roleId,
                           @Param("from") Integer currentPageNo,
                           @Param("pageSize") Integer pageSize);

2.UserMapper.xml

 <select id="getUserList" resultMap="userList">
        select u.*,r.roleName from smbms_user u,smbms_role r where u.userRole=r.id
        <if test="userRole !=null">
            and u.userRole=#{userRole}
        </if>
        <if test="userName !=null and userName!=''">
            and userName like CONCAT('%',#{userName},'%')
            order by creationDate desc limit #{from},#{pageSize}
        </if>
    </select>

3.test测试

 public void testGetUserList1(){
        SqlSession sqlSession = null;
        List<User> userList = new ArrayList<User>();
        try {
            sqlSession= MyBatisUtil.createSqlSession();
            String userName="";
            Integer roleId=null;
            Integer pageSize=5;
            Integer currentPageNo=0;
            userList=sqlSession.getMapper(UserMapper.class).getUserList(userName,roleId,currentPageNo,pageSize);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            MyBatisUtil.closeSqlSession(sqlSession);
        }
        System.out.println("UserList.size------>"+userList.size());
        for (User user:userList){
            System.out.println("testGetUserList==========> id:"+user.getId()+
                    "and userCode:"+user.getUserCode()+
                    "and usreName:"+user.getUserName()+
                    "and userRole:"+user.getUserRole()+
                    "and userRoleName:"+user.getAge()+
                    "and gender"+user.getGender()+
                    "and creationDate:"+new SimpleDateFormat("yyyy-MM-dd").format(user.getCreationDate()));
        }
    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值