mybatis概述及搭建

news2025/4/17 17:17:45

目录

1.概述

2.mybatis搭建

1.创建一个maven项目,添加mybatis、mysql所依赖的jar

2.创建一个数据库表,及对应的java类

3.创建一个mybatis的核心配置文件,配置数据库连接信息,配置sql映射文件

4.创建sql映射文件,定义一个与接口方法名相同的查询语句

5.创建一个访问接口,定义一个方法

6.测试

API接口

SqlSessionFactory接口

SqlSession接口

嵌套查询

数据库连接池(缓冲池)

7.单元测试插件

8.参数传递

#{} 和${}区别

9.结果处理

1.简单类型输出映射

2.对象映射

3.特殊处理定义 resultMap

4.多表关联处理结果集

10.Mybatis 动态 SQL

if

where

trim

choose

set

foreach

11.特殊符号处理

12.mybatis一级缓存和二级缓存

一级缓存

二级缓存

1.概述

mybatis是一款优秀的持久层框架

mybatis是对jdbc功能进行轻量级的封装, 提供了统一的数据库信息配置,统一放在一个xml文件中,读取就行;

将sql提取到一个xml文件中, 提供了动态sql功能 提供了结果自动映射封装;

是一个orm(ORM Object Relational Mapping 对象关系映射)实现,orm指的是,将数居中的记录与java中的对象进行关系映, 对jdbc原生接口进行封装,提供了一些mybatis自己的接口和类来实现.

servlet(负责接收前端请求 调用其他的java程序处理 响应) web层

service(业务逻辑层) 验证数据 调用dao 结果 组装 服务层(逻辑处理,数据组装)

dao(data access Object) jdbc 数据持久层

2.mybatis搭建

1.创建一个maven项目,添加mybatis、mysql所依赖的jar

2.创建一个数据库表,及对应的java类
3.创建一个mybatis的核心配置文件,配置数据库连接信息,配置sql映射文件
4.创建sql映射文件,定义一个与接口方法名相同的查询语句
5.创建一个访问接口,定义一个方法
6.测试

读取配置

Reader reader = Resources.getResourceAsReader("mybatis-config.xml");

创建SqlSessionFactory

SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder(

).build(reader);

创建SqlSession

SqlSession sqlSession = sessionFactory.openSession();

创建接口代理对象

sqlSession.getMapper(接口.class); sqlSession .close();

调用接口中的方法 执行对应的sql

API接口

SqlSessionFactory接口

SqlSessionFactory 用来创建SqlSession,只创建一次,一旦创建 ,SqlSessionFactory就在整个应用过程中存在。

SqlSession接口

SqlSession代表和数据库连接会话,此接口封装了对数据库的操作方法,完成后关闭会话

嵌套查询

将一个多表关联查询拆分为多次查询,先查询主表数据,然后查询关联表数据.

<resultMap id="studentMap" type="Student">
        <id column="id" property="id"></id>
        <result column="num" property="num"></result>
        <result column="name" property="name"></result>
        <result column="gender" property="gender"></result>
        <!--将学生关系和操作人信息分别封装到宿舍对象和管理员对象中去  属于嵌套-->
        <association property="dorm" javaType="Dorm">
            <result column="dnum" property="num"></result>
        </association>
        <association property="admin" javaType="Admin">
            <result column="account" property="account"></result>
        </association>
</resultMap>
<resultMap id="dormMap" type="Dorm">
        <id column="id" property="id"></id>
        <result column="num" property="num"></result>
        <collection property="students" javaType="list" ofType="Student">
            <result column="name" property="name"></result>
            <result column="snum" property="num"></result>
        </collection>
</resultMap>

数据库连接池(缓冲池)

现在每与数据库交互一次,创建一个数据库连接对象(Connection,Sql),用完就关闭销毁。下次需要,就重复此过程。问题:频繁创建销毁对象,开销大

思想:可以在启动时设置一个容器,在里面初始化好一些数据库连接对象,有请求到来时,可不用每次创建销毁,可重复使用,减少了频繁创建销毁链接对象的开销。

7.单元测试插件

使某一方法可以独立运行

 @Test
    public void update() {
        SqlSession sqlSession= MybatisUtil.getSqlSession();
        StudentDao studentDao=sqlSession.getMapper(StudentDao.class);
        Student student=new Student();
        student.setId(1);
        student.setNum(107);
        student.setName("qq");
        studentDao.updateStudent(student);
        sqlSession.commit();
        sqlSession.close();

    }

8.参数传递

  • 单参数直接传递,基本类型不需做任何处理

    Admin findAdminById(int id);

  • 多参数处理方式

    Admin login(@Param("acc") String account,@Param("pwd") String password);

  • 多参数封装到一个对象中

    Admin login1(Admin admin);

#{} 和${}区别

  • #{参数名}

    传值是预编译方式,更安全,主要用于向sql中传值

  • ${参数名}

    主要用来动态的向sql中传列名 传值时是直接将参数拼接到sql中(不建议) 排序 order by ${column} 动态传列名进来

9.结果处理

1.简单类型输出映射

返回简单基本类型
<select id="adminCount" resultType="int">
    SELECT COUNT(*) FROM admin
</select>

2.对象映射

mybatis会将查询到的结构自动封装到一个对象中,会自己创建给定类型的对象
自动封装结果有条件:
    1.开启了全局的自动结果映射  PARTIAL  默认是单张表开启的
    2.数据库列名和属性名一样 如果名字不一致,不能映射,
      两种解决方法:
          (1)可设置别名使其映射
          (2)<setting name="mapUnderscoreToCamelCase"  value="true"/>

3.特殊处理定义 resultMap

1.resultMap 的 id 是resultMap 的唯一标识

2.column 是映射查询结果的列名称

   property 是类中的属性名称     

<resultMap id="adminMap" type="Admin">
     <id column="id" property="id"></id><!--封装映射主键列-->
     <result column="admin_gender" property="gender"></result>
</resultMap>
<select id="findAdmins1" resultMap="adminMap">
     select id,account,password,admin_gender from admin
</select>

4.多表关联处理结果集

注解标签

@Insert : 插入 sql 

@Select :查询 sql

@Update :更新 sql

@Delete :删除 sql

@Results :设置结果集合

@Result : 结果

比如:

    @Delete("delete from student where id=#{id}")
    void deleteStudent(int id);

    @Insert("insert into student(num,name,gender)value (#{num},#{name},#{gender})")
    void saveStudent(Student student);


    @Select("select * from student where id=#{id}")
    @Results(id="stumap",value={
            @Result(id = true,column = "id",property = "id"),
            @Result(column = "num",property = "num")
    })
    @ResultMap(value = "stumap")
    Student findStudent(int id);

10.Mybatis 动态 SQL

MyBatis 中用于实现动态 SQL 的元素主要有:

If、 where、 trim、 set、 choose (when, otherwise)、 foreach

if

对传入的条件进行判断

where

where 动态根据where标签内的if是否有成立,动态添加where关键宁,还可以去除条件前面的关键宁(anc/ or)

当查询条件的个数不确定时,使用where标签,当标签中有返回值时,就会插入一个我where;

若标签返回的内容以and/or开头,where标签自动剔除and/or。

trim

当 WHERE 后紧随 AND 或则 OR 的 时候,就去除 AND 或者 OR。prefix 前缀,prefixOverrides 覆盖首部指定 内容

choose

choose\when\otherwise
多个条件选择一个,可有多个when
select id,num,name,gender from student
        <trim prefix="where" prefixOverrides="and">
            <choose>
                <when test="num!=0">
                    num=#{num}
                </when>
                <when test="name!=null">
                    and name=#{name}
                </when>
                <otherwise>
                    and gender=#{gender}
                </otherwise>
            </choose>
        </trim>

set

set可取去除最后一个逗号

foreach

open 表示该语句以什么开始(仅执行一次)

separator 表示在每次进行迭代之间以什么符号作为分隔符;

close 表示以什么结束(仅执行一次)

item 表示集合中每一个元素进行迭代时的别名;

index 表一个名字,表示在迭代过程中,每次迭代到的位置

collection

        如果传入的是单参数且参数类型是一个 List 时,collection 属性值为 list

        如果传入的是单参数且参数类型是一个 array 数组时,collection 的属性值为 array

<delete id="deleteStudent">
     delete from student where id in
         <foreach collection="list" item="item" open="(" separator="," close =")" >
             #{item}
         </foreach>
</delete>

11.特殊符号处理

xml属于标记语言,类似<、>、& 不能再sql中使用,mybatis会报错

解决办法
1.转义符号代替

特殊字符   转义字符

      <             &It

      >             &gt

      "              &quot

      '               &apos

      &             &amp

<delete id="deleteStudent">

    delete from student where id &lt; 10

    <if test="id!=@ &amp; id>10"></if>
</delete>


2.使用 <![CDATA[ < ]]> 进行处理,尽量只将特殊符号写在里面

<delete id="deleteStudent">
     delete from student where id <![CDATA[<]]> 10
</delete>

12.mybatis一级缓存和二级缓存

缓存(cache)的作用是为了减去数据库的压力,提高查询效率。缓存实现的原理是从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存(缓存)中, 当再次需要获取该对象时,直接从内存(缓存)中直接获取,不再向数据库执行 select 语句,从而减少了对数据库的查询次数,因此提高了数据库的性能。

一级缓存

一级缓存的作用域是同一个 SqlSession, 在同一个 sqlSession 中两次执行相同的 sql 语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据,不再从数据库查询,提高查询效率。当一个 sqlSession结束后该 sqlSession 中的一级缓存就销毁了。

Mybatis 默认开启一级缓存。

一级缓存失效(生命周期):

1. sqlsession.close(); 销毁sqlsession对象
2. sqlsession.clearCache(); 清楚缓存数据
3. 执行有关增删改操作会清除缓存数据

二级缓存

二级缓存是SqlSessionFactory级别(一个),若将查询到的数据放到二级缓存中,可实现多个 SqlSession 共享;

当第一次查询到数据后并且关闭Sqlsession时数据被存入到二级缓存中,

Mybatis 默认没有开启二级缓存需要配置开启:

1.在SqlMapperConfig.xml中启用:

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

2.在Mapper映射文件中启用:

        <cache flushInterval="1000”></cache>

3.实现序列化接口:

        将所有的 POJO 类实现序列化接口 Java.io. Serializable

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/923479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab高光谱遥感数据处理与混合像元分解实践技术

光谱和图像是人们观察世界的两种方式&#xff0c;高光谱遥感通过“图谱合一”的技术创新将两者结合起来&#xff0c;大大提高了人们对客观世界的认知能力&#xff0c;本来在宽波段遥感中不可探测的物质&#xff0c;在高光谱遥感中能被探测。以高光谱遥感为核心&#xff0c;构建…

Mysql报错 mysqladmin flush-hosts

出现这个的原因是错误连接达到数据库设置的最大值。 此时需要释放重置连接最大值。 进入mysql使用命令 flush-hosts;环境说明&#xff1a; 内网测试服务器192.168.18.251 为WEB服务器&#xff0c;安装了mysql; 内网音视频转码服务器192.168.18.253安装了转码工具&#xff0…

IP协议报文结构

IP报文结构 4位版本号: 指定IP协议的版本, 对于IPv4来说, 就是4.4位头部长度: IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大的数字是15, 因此IP头部最大长度是60字节.8位服务类型: 3位优先权字段(已经弃用) 4位TOS字段 1位保留字段(必须置为0). 4位…

【使用perf和火焰图分析PostgreSQL数据库的性能瓶颈】

Perf工具可用来对软件进行优化&#xff0c;包括算法优化&#xff08;空间复杂度、时间复杂度&#xff09;和代码优化&#xff08;提高执行速度、减少内存占用&#xff09;等等&#xff0c;perf 最常用的参数有top、stat、record&#xff0c;另外还有list和report等。 本文主要使…

枚举和反射

枚举 枚举 枚举是一种特殊的类&#xff0c;它可以有自己的属性、方法和构造方法。 两种枚举的方法 自定义枚举 a.将构造器私有化&#xff0c;防止外部直接new b.去掉set方法&#xff0c;防止属性被修改 c.在内部直接创建固定的对象 通过类名直接去访问 关键字枚举 用…

即拼七人拼团:突破传统模式,二二复制结合拼团快速引流

如何解决平台运营难的问题&#xff1f;企业主要关注的点则是新客的引流、用户的留存、平台活跃度提高以及如何变现等一些的问题&#xff0c;下面就针对这块分析提出一个七人拼团的解决方案。一个7人成团的即拼模式&#xff0c;为什么会在众多拼团模式中脱颖而出&#xff0c;即拼…

学会Mybatis框架:一文掌握MyBatis与GitHub插件分页的完美结合【三.分页】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Mybatis的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Mybatis分页 1. Mybatis自带分页 2…

职业技术培训内容介绍

泰迪职业技术培训包括&#xff1a;Python技术应用、大数据技术应用、机器学习、大数据分析 、人工智能技术应用。 职业技术培训-Python技术应用 “Python技术应用工程师”职业技术认证是由工业和信息化部教育与考试中心推出一套专业化、科学化、系统化的人才考核标准&…

8.24随笔记录科研灵感

在B站浏览关于人脸3D的视频&#xff0c;无意看到这一部分“结构光-深度图信息” 【巧的是这也是微软的模型】 就想到了自己的V4.3版本的算法里面估计距离其实用的也是结构光&#xff08;红光&#xff09;来估测距离&#xff0c;而且目前水下图像处理领域并没有采用这个方法&am…

【DC】逻辑综合实战

DC实战 0. 学习目标1. Design1.1 Design Schematic1.2 Design Specification 2. 配置文件和约束文件2.1 配置文件(1) common_setup.tcl 文件(2) dc_setup.tcl 文件(3) .synopsys_dc.setup 文件 2.3 启动工具查看单元库信息(1) 查看目标库的时间单位 2.3 设计约束文件(1) 时钟约…

洗涤护理门店小程序搭建全攻略:数字化转型的起点

在现代社会中&#xff0c;人们越来越注重便捷和个性化的服务体验。而随着智能手机的普及&#xff0c;小程序成为了商家与用户之间沟通的重要桥梁。在这篇文章中&#xff0c;将介绍如何使用第三方小程序制作平台搭建一个个性化干洗店洗护小程序。 首先&#xff0c;我们需要注册并…

ORB-SLAM2报错集合(数据集测试系列1)

目录 错误1 错误2 错误3 错误4 错误5 错误6 错误7 错误8 TUM-RGBD测试 KITTI测试 EuRoC测试 写在前面~ ORB-SLAM2 github链接&#xff1a;GitHub - electech6/ORB_SLAM2_detailed_comments: Detailed comments for ORB-SLAM2 with trouble-shooting, key formula …

单个无人机三维路径规划问题及其建模

单个无人机三维路径规划问题及建模如下&#xff1a; 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120

Grafana Dashboard 备份方案

文章目录 Grafana Dashboard 备份方案引言工具简介支持的组件要求配置备份安装使用 pypi 安装grafana备份工具配置环境变量使用Grafana Backup Tool 进行备份恢复备份 Grafana Dashboard恢复 Grafana Dashboard结论Grafana Dashboard 备份方案 引言 每个使用 Grafana 的同学都…

vue离线缓存资源文件

本文章主要是解决大文件,实时请求资源浪费网络资源的问题 从而有效的将解决用户体验的问题 话不多说上才艺 ⬇️⬇️⬇️⬇️⬇️⬇️⬇️ 找到项目中的 index.html 文件,并在 html 标签中加入 manifest"manifest.appcache" 安装 appcache-manifest 包 npm ins…

深入浅出理解相机标定原理

重要说明&#xff1a;本文从网上资料整理而来&#xff0c;仅记录博主学习相关知识点的过程&#xff0c;侵删。 一、参考资料 微信公众号&#xff1a;计算机视觉life 专栏&#xff1a;#相机标定 Camera Calibration 张正友标定法-完整学习笔记-从原理到实战 二、相机标定相…

C语言刷题训练DAY.12

1.统计成绩 解题思路&#xff1a; 这里我们设置两个变量记录最大值和最小值&#xff0c;再用一个sum统计分数总和即可。 解题代码&#xff1a; #include<stdio.h> int main() {int n 0;scanf("%d", &n);double arr[100] { 0 };int i 0;//最高分double …

UVM Heartbeat机制

1. 前言 在硬件电路中&#xff0c;为了使系统在异常情况下能自动复位&#xff0c;一般都需要引入看门狗(Watchdog)。看门狗其实就是一个定时器电路。当看门狗启动后&#xff0c;计数器开始自动计数&#xff0c;经过一定时间&#xff0c;如果没有被清零&#xff0c;计数器溢出就…

谁为软件质量负责?

如果我们直接问自己以下问题——谁负责软件质量&#xff0c;我们首先想到的就是——当然是测试人员&#xff01;但这并不像看起来那么容易。 IT领域有几个特点&#xff0c;总是发生在软件测试的最后阶段&#xff0c;就在它发布之前。它们使我们不仅从软件的技术质量保证的角度…

学习JAVA打卡第四十一天

字符串与字符数组、字节数组 ⑴字符串与字符数组 String类的构造方法String&#xff08;char a[]&#xff09;和String&#xff08;char a[]&#xff09;,int offset,int length,分别用数组a中的全部字符和部分字符创建string对象。 String类也提供将string对象的字符序列存…