mybatis框架的了解
2026/5/12 11:25:32 网站建设 项目流程

文章目录

  • 1. 概述
  • 2. 核心对象
      • 1)SqlSessionFactoryBuilder
      • 2)SqlSessionFactory
      • 3)SqlSession
      • 4)核心配置文件
      • 5)Sql配置文件(Mapper)
      • 6)Configuration
  • 3. 底层框架实现步骤
  • 4. 所有参数
      • 1)parameterType
      • 2)resultType
      • 3)resultMap
      • 4)占位符
      • 5)#和$ 的区别
  • 5. 获取保存后的主键
      • 1) 主键自增
      • 2) 非主键自增
  • 6. 动态sql
      • 1)if 标签
      • 2)where 标签
      • 3)模糊查询
      • 4)sql 标签
      • 5)foreach
  • 7. 映射关系配置
      • 1)单表的映射关系
      • 2)多表1对1的映射关系
      • 3)多表1对多的映射关系
  • 8. Mybatis数据库连接池
      • 1)配置数据库连接池
      • 2)底层原理
  • 9. Mybatis中的延迟加载
      • 1)概述
      • 2)一对一的延迟加载配置
      • 3)一对多的延迟加载配置
  • 10. Mybatis缓存
      • 1)概述
      • 2)一级缓存
      • 3)二级缓存

1. 概述

使用jdbc直接查询数据库有一些弊端,比如: 1)数据库信息已经硬编码到java代码中 2)Sql语句硬编码到java代码中 3)Jdbc操作极其繁琐 在这个基础上,apache公司开发了一个开源的持久层框架,叫mybatis。 mybatis通过内部封装jdbc操作,大大简化了数据库的操作,是ibatis的更新换代产品。

2. 核心对象

1)SqlSessionFactoryBuilder

1. 作用 解析xml,获取xml配置文件的内容,创建Confifuration对象,并创建SqlSessionFactory对象 。 2. 方法 build(); 3. 说明 1)SqlSessionFactoryBuilder有9个构造方法,字符流4个+字节流4个+Configuration 配置类1个。

2)SqlSessionFactory

1 作用 创建SqiSession对象。 2. 方法 openSession(); 3. 特点 是单例对象(多个线程使用同一个已经创建好的对象),只创建一次(一个)就可以,是一个线程安全的对象。

3)SqlSession

1. 作用 创建dao接口的动态代理对象,完成数据库的CRUD操作。 2. 特点 SqlSession对象是多例对象,不是一个线程安全的对象,所以每次使用都要新创建一个。

4)核心配置文件

1. 作用 1)设置数据库信息 2)设置所有sql配置文件的路径 2. 相关标签 1)properties 标签 作用:引入外部的properties文件。 属性:resource:properties文件的相对路径。 2)typeAlise 标签 作用:设置别名

5)Sql配置文件(Mapper)

1. 作用 配置数据库查询相关内容 1)sql语句 2)sql语句的唯一标识 3)返回值类型 2. 相关标签 1)mappers标签 作用:引入sql映射文件。

6)Configuration

1. 定义 底层将核心配置文件的内容和mapper对象放到了一个新的对象里,这个新的对象叫:Configuration对象。

3. 底层框架实现步骤

4. 所有参数

1)parameterType

1. 作用 1)指定传入的参数类型 a. 如果是实体类对象,那么传入的是对象的全限定类名 b. 如果是基本数据类型,那么传入的是包装类型的全限定类名,或者是基本数据类型(不区分大小写)。

2)resultType

1. 作用 1)定义返回值的类型 a. 如果是实体类对象,那么返回的是实体类对象的全限定类名。 b. 如果是基本数据类型,那么返回的是包装类型的全限定类名,或者是基本数据类型(不区分大小写)。 c. 如果返回的是list,那么resultType 就是List里面的泛型的全限定类名(Map或者对象),而不是list。

3)resultMap

1. 作用 指定映射关系的配置。

4)占位符

1.格式 #{ognl表达式} 2. 注意 ognl表达式只关注对象中的属性名,所有大括号内填的,都是对象对应的属性名。 3.示例 <if test = "b != null and b.属性1 != null and b.属性1 != ""> and a.AAA = #{b.属性1} </if>

5)#和$ 的区别

1. #{} 1)是预编译占位符,替换 ?,传入的值都会自动加一个"", 2)调用prepareStatement的set()方法进行赋值,会经过预编译。 3)使用场景:传递具体参数值 4)如果传入的是实体类,写的是对象中的属性名,如果传入的是基本数据类型,那么参数可以随便写。 5)mybatis在处理#{} 时,会将sql 中的 #{} 替换为 ?,传入的值都会自动加一个“”,并调用prepareStatement 的 set() 方法进行赋值。 2. ${} 1)是动态sql拼接,直接把${}里的值替换成传入的变量的值。 2)不经过预编译,会有sql 注入的危险。 3)使用场景:一般用于传入数据库对象,比如:动态表名,列名,sql片段拼接,动态排序字段等。 4)如果传入的是实体类,写的是对象名,如果传入的是基本数据类型,必须写 value。 5)mybatis 在处理 ${} 时,就是把 ${} 替换成传入的变量的值,完成的是简单的字符串拼接。 3. 总结 1)优先使用#{},除非必须动态拼接sql结构,不然一般不使用${}。 2)如果需要使用${},那么必须进行校验,防止sql注入风险。

5. 获取保存后的主键

1) 主键自增

使用 useGeneratedKeys="true" 开启使用自增id,keyProperty 参数对应实体类主键id的属性。 例: <insert id="saveUser" parameterType="cn.itcast.domain.User" useGeneratedKeys="true" keyProperty="id"> insert into user (username,birthday,sex,address) values (#{username},#{birthday},#{sex},#{address}) </insert>

2) 非主键自增

通过select last_insert_id() 函数,可以查询保存后的主键id。 这个查询函数要和保存操作在一个事务里,才可以获取到。 例: <insert id=”saveUser” parameterType = “cn.itcast.domain.User” <selectKey order="AFTER" resultType="java.lang.Integer" keyProperty="id"> SELECT LAST_INSERT_ID() </selectKey> Insert into User (uaername,password) values (#{username},#{password}) </insert>

6. 动态sql

1)if 标签

1. 作用:用于指定判断条件 2. 示例 <if test="username != null and username != '' "> and username=#{username} </if> <if test="sex != null and sex != '' "> and sex=#{sex} </if> 3. 注意点 1)如果test后面用的双引号,那么里面的内容就用单引号。 2)如果test后面跟的是单引号,那么里面的内容就用双引号。 3)如果传入的是一个单字节的字符串,比如"1",那么使用单引号的时候会有问题,ognl表达式会把这个参数当作char类型,而不是String类型,所以需要修改,修改方法为: test后面换单引号,如: <if test= 'type != null and type == "1" '>

2)where 标签

1. 作用 添加查询条件,对查询语句进行优化,一般是和if 条件查询语句一起使用。

3)模糊查询

针对不同数据库的模糊查询: <if test="ep != null and ep.enterpriseName != null and ep.enterpriseName != ''"> AND b.enterprise_name LIKE <if test="dbName == 'oracle'"> '%'||#{ep.enterpriseName} ||'%' </if> <if test="dbName == 'mssql'"> '%'+#{ep.enterpriseName}+'%' </if> <if test="dbName == 'mysql'"> concat('%',#{ep.enterpriseName},'%') </if> </if>

4)sql 标签

1. 作用 抽取公共的sql片段,用于片段拼接 2. 属性 1)id: 此sql片段的唯一标识。 2)include标签:引入公共的sql片段。 3)refid: 要引入的其他sql片段的唯一标识。 3. 示例 <sql id="userSql"> select id,username,sex,address,birthday from user <where> <if test="username != null and username != '' "> and username=#{username} </if> <if test="sex != null and sex != '' "> and sex=#{sex} </if> </where> </sql> // 引用sql片段 <select id="findByUser" parameterType="user" resultType="user"> <include refid="userSql"></include> </select>

5)foreach

1. 作用 循环迭代查询 2. 属性及含义

注意:collection中的内容 1)如果是一个数组,那么固定的写array。 2)如果是一个list集合,那么固定的写list。 3)如果是一个对象中的属性(数组或者集合),那么就写对象中的属性名。 示例: <select id="findUserByArrayIds" resultType="user" parameterType="_int[]"> select * from user where id in <foreach collection="array" open="(" close=")" separator="," item="id"> #{id} </foreach> </select> <select id="findUserByListIds" resultType="user" parameterType="list"> select * from user where id in <foreach collection="list" open="(" close=")" separator="," item="abc"> #{abc} </foreach> </select> <select id="findUserByVoIds" resultType="user" parameterType="queryVo"> select * from user where id in <foreach collection="ids" open="(" close=")" separator="," item="id"> #{id} </foreach> </select>

7. 映射关系配置

1)单表的映射关系

单表的映射关系可以直接使用别名,然后加上参数:resultType指定。 也可以指定映射关系: 参数: id:唯一标识 type:经过映射关系处理之后返回的对象类型(全限定类名) property :对象中的属性名(从实体类抄) column:数据库中的字段名 (从数据库抄) 注意:如果数据库中的字段名 (从数据库抄) 格式: <resultMap id = "111" type = "com.tsingyun.domain.User"> <id property="id" column="uid"></id> <result property="userName" column="username"></result> <result property="sex" column="sex"></result> </resultMap> <select id = "findById" parameterType= "int" resultMap = "111"> select * from user </select>

2)多表1对1的映射关系

3)多表1对多的映射关系

8. Mybatis数据库连接池

1)配置数据库连接池

1. Mybatis内置数据库连接池 在mybatis的核心配置文件中的datasource节点上通过type属性配置 datasource:配置数据源 type属性: pooled 【默认】 :Mybatis会创建一个数据库连接池,连接池中的连接会被用作数据库操作,一旦数据库操作完成,Mybatis会将此连接返回给连接池。 unpooled :不使用数据库连接池,Mybatis会为每个数据库操作创建一个新的连接,并关闭它。 jndi : Java 平台提供的一种统一 API 接口。核心配置通常围绕 InitialContext 的初始化参数。 2. 集成第三方数据库连接池 HikariCP:性能最优,Spring Boot 默认集成。 Druid:功能全面(支持监控、SQL 防注入等),适合需要统计分析的场景。 在 Spring Boot 项目中,MyBatis 默认使用 HikariCP 作为连接池,配置在 application.properties 或 application.yml 中,示例为: spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # HikariCP 参数 spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.connection-timeout=30000

2)底层原理

注意点 1. 获取连接的时机:操作数据库的时候再获取连接。 2. 在创建sqlSession的时候可以指定连接的事务的提交方式: SqlSession openSession(boolean autoCommit) ; 如果设置成 true,那么可以自动提交事务,但是一般都用默认的 false。

9. Mybatis中的延迟加载

1)概述

1. 概念 延迟加载(懒加载) 指的是关联对象的查询方式,关联对象什么时候使用,就什么时候进行查询。 2. 配置 延迟加载默认是关闭的,如果需要使用,就要在sqlMapConfig核心配置文件中进行设置,设置为true,表示使用延迟加载,配置方式为: <settings> <setting name = "lazyLoadingEnabled" value = "true"> </settings>

2)一对一的延迟加载配置

1. 主表的配置: 配置主表的一对一关系 标签: resultMap 映射 id 表明是主键类型 result 表名是 参数: id:唯一标识 type:经过映射关系处理之后返回的对象类型(全限定类名) property :对象中的属性名(从实体类抄) column:数据库中的字段名 (从数据库抄) 2. 从表的配置 标签: association //标识一对一的映射关系 参数: property //从表在主表中的属性名 javaType //数据类型,如果是集合,就是list,如果是对象,就写对象名称 column //查询关联对象,需要用到的主表的哪个关联字段(注意:该字段来源于主表) 3.具体实例

3)一对多的延迟加载配置

1. 主表的配置: 配置主表的一对多关系 标签: resultMap 映射 id 表明是主键类型 result 表名是 参数: id:唯一标识 type:经过映射关系处理之后返回的对象类型(全限定类名) property :对象中的属性名(从实体类抄) column:数据库中的字段名 (从数据库抄) 2. 从表的配置 标签: collection //标识一对多的映射关系 参数: property //从表在主表中的属性名 javaType //数据类型,如果是集合,就是list,如果是对象,就写对象名称 ofType //泛型的类型(从表的类名) select //查询从表需要用到的查询语句 column //查询关联对象,需要用到的主表的哪个关联字段(注意:该字段来源于主表) 3.具体实例

10. Mybatis缓存

1)概述

缓存:指的是内存中的一块临时区域,用来提高访问效率。 mybatis中的缓存有两种: 一级缓存和二级缓存。

2)一级缓存

1. 概述 sqlSession级别的缓存,随着sqlSession的创建而创建,随着sqlSession的关闭而销毁,是程序自带的,不可以卸载。 2. 一级缓存存取数据 1)第一次查询:先查询一级缓存,如果有,直接获取;如果没有,查询数据库,将查询结果缓存到一级缓存中。 2)第二次查询:先查询一级缓存,如果有,直接获取一级缓存中的内容,如果没有,查询数据库,将查询结果缓存到一级缓存中。 3. 验证一级缓存 直接用一个sqlSession查询两次同样的数据,第一次会去数据库查询获取,第二次没有去数据库查询,而是从缓存直接获取。

3)二级缓存

1. 概述 Mapper级别的缓存(也就是sqlSessionFacotory级别的缓存),随着sqlSessionFacotory的创建而创建,随着sqlSessionFacotory的销毁而销毁。不是程序自带的,需要经过配置。 2. 配置的方法: 1)实体类对象需要实现序列化接口。 2)需要在sqlMapConfig核心配置文件中进行设置,开启二级缓存(默认就是开启的)。 <settings> <setting name = "cacheEnabled" value = "true"> </setting> 3)需要在mapper配置文件中开启使用二级缓存。 4)需要在缓存的sql语句配置中配置使用二级缓存。 <select id = "findById" resultType = "user" useCache="true"> select * from user </select> 5) 操作过程中需要提交后才会存入到缓存中。 提交的方式: a. session.commit(); b. session.close();

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询