当前位置: 首页 > news >正文

mybatis概述及搭建

目录

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.单元测试插件

使某一方法可以独立运行

 @Testpublic 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

相关文章:

mybatis概述及搭建

目录 1.概述 2.mybatis搭建 1.创建一个maven项目&#xff0c;添加mybatis、mysql所依赖的jar 2.创建一个数据库表&#xff0c;及对应的java类 3.创建一个mybatis的核心配置文件&#xff0c;配置数据库连接信息&#xff0c;配置sql映射文件 4.创建sql映射文件&#xff0c;…...

DNDC模型---土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的应用

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会议上讲到&#xff0c;要把“双碳”纳入经济社会发展和生态文明建设整体布局。同时&#xff0c;提到要把减污降碳协同增效作为促…...

Android studio 2022.3.1 鼠标移动时不显示快速文档

在使用技术工具的过程中&#xff0c;我们时常会遇到各种各样的问题和挑战。最近&#xff0c;我升级了我的Android Studio到2022.3.1版本&#xff0c;但是在使用过程中&#xff0c;我碰到了一个让我颇为困扰的问题&#xff1a;在鼠标移动到类名或字段上时&#xff0c;原本应该显…...

五度易链最新“产业大数据服务解决方案”亮相,打造数据引擎,构建智慧产业!

快来五度易链官网 点击网址【http://www.wdsk.net/】 看看我们都发布了哪些新功能!!! 自2015年布局产业大数据服务行业以来&#xff0c;“五度易链”作为全国产业大数据服务行业先锋企业&#xff0c;以“让数据引领决策&#xff0c;以智慧驾驭未来”为愿景&#xff0c;肩负“打…...

简述hive环境搭建

文章目录 部署参数配置hive简单命令 部署 Hive的三种部署模式&#xff0c;主要按Metastore 的运行模式进行区分。 在安装Hive之前&#xff0c;要求先预装JDK 8、Hadoop、MySQL &#xff1b; 1.下载hive&#xff0c;并解压缩到用户主目录下 tar -xzvf apache-hive-2.3.6-bin.t…...

小米AI音箱联网升级折腾记录(解决配网失败+升级失败等问题)

小米AI音箱&#xff08;一代&#xff09;联网升级折腾记录 我折腾了半天终于勉强能进入下载升级包这步&#xff0c;算是成功一半吧… 总结就是&#xff0c;网络信号一定要好&#xff0c;需要不停换网找到兼容的网&#xff0c;还需要仔细配置DNS让音响连的上api.mina.mi.com 推荐…...

tensorRT安装

官方指导文档&#xff1a;Installation Guide :: NVIDIA Deep Learning TensorRT Documentation 适配很重要&#xff01;&#xff01;&#xff01;&#xff01; 需要cuda, cuDNN, tensorRT三者匹配。我的cuda11.3 所以对应的cuDNN和tensorRT下载的是如下版本&#xff1a; cud…...

电脑重装+提升网速

https://www.douyin.com/user/self?modal_id7147216653720341767&showTabfavorite_collectionhttps://www.douyin.com/user/self?modal_id7147216653720341767&showTabfavorite_collection 零封有哈数的主页 - 抖音 (douyin.com)https://www.douyin.com/user/self?…...

Modelica由入门到精通—为什么要学习Modelica语言

1.为什么要学习Modelica语言 本人正在研究Modelica 多领域统一建模仿真语言&#xff0c;特此做学习入门介绍&#xff0c;希望可以帮助需要的小伙伴。 文章目录 1.为什么要学习Modelica语言一、背景二、系统建模与仿真2.1 系统仿真与系统模型2.2 仿真价值与可靠性 三、物理建模…...

opencv 进阶20-随机森林示例

OpenCV中的随机森林是一种强大的机器学习算法&#xff0c;旨在解决分类和回归问题。随机森林使用多个决策树来进行预测&#xff0c;每个决策树都是由随机选择的样本和特征组成的。在分类问题中&#xff0c;随机森林通过投票来确定最终的类别&#xff1b;在回归问题中&#xff0…...

Spring Boot进阶(58):集成PostgreSQL数据库及实战使用 | 万字长文,超级详细

1. 前言&#x1f525; PostgreSQL是一种广泛使用的开源关系型数据库&#xff0c;具有可靠性高、性能优异、拥有丰富的数据类型和扩展等优点&#xff0c;越来越多的企业和开发者开始使用它来存储和管理数据。而Spring Boot是一种快速开发的框架&#xff0c;可以简化开发过程并提…...

Java | 使用ServerSocket查找TCP可用端口

关注&#xff1a;CodingTechWork 引言 在项目开发中&#xff0c;有一个程序是专门给服务下发tcp端口占用的&#xff0c;但是tcp端口有时候会被其他服务给占用&#xff0c;此时端口就会冲突。本文提供一个工具类进行端口占用判断并返回可用端口。 代码 工具类 Slf4j public …...

【深入浅出C#】章节 9: C#高级主题:LINQ查询和表达式

C#高级主题涉及到更复杂、更灵活的编程概念和技术&#xff0c;能够让开发者更好地应对现代软件开发中的挑战。其中&#xff0c;LINQ查询和表达式是C#高级主题中的一项关键内容&#xff0c;具有以下重要性和优势&#xff1a; 数据处理和操作&#xff1a; 在现代软件中&#xff…...

【Git】git clone --depth 1 浅克隆

问题 PycharmProjects git clone git Cloning into risk-package... remote: Counting objects: 576, done. error: pack-objects died of signal 947/574) error: git upload-pack: git-pack-objects died with error. fatal: git upload-pack: aborting due to possible r…...

搭建 Gitlab

当设置和配置 GitLab 实例并执行诸如创建群组、项目、用户和上传代码等操作时&#xff0c;涉及到多个步骤&#xff0c;每个步骤都有特定的目的。让我们逐步解释每个步骤并说明其背后的原因&#xff1a; 安装必需的软件&#xff1a; yum install -y curl policycoreutils-python…...

CTFhub-sqli注入-报错注入

用到的函数 updatexml(1&#xff0c; &#xff0c;1) concat(0x7e, ,0x7e) group_concat(目标值) right(&#xff0c;32) 1 1 1 union select updatexml(1,concat(0x7e,database(),0x7e),1) 1 union select updatexml(1,concat(0x7e,(select(group_concat(ta…...

中国人民大学与加拿大女王大学金融硕士让金融界短暂迷茫的你发现新的方向

此刻金融职场的你已经站在了金融金字塔的哪个层级&#xff1f;是正在金融界不断的改变自己&#xff0c;迎接着一个又一个的挑战成为了职场精英&#xff1f;还是转行的想法不断敲打着你&#xff0c;但是又不知道自己该干什么&#xff0c;能干什么&#xff0c;发现自己的职业核心…...

PHPEXCEL 导出excel

$styleArray [alignment > [horizontal > Alignment::HORIZONTAL_CENTER,vertical > Alignment::VERTICAL_CENTER],];$border_style [borders > [allborders > [style > \PHPExcel_Style_Border::BORDER_THIN ,//细边框]]];$begin_date $request->beg…...

Elasticsearch简介及安装

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…...

Python 密码破解指南:10~14

协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【OpenDocCN 饱和式翻译计划】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 收割 SB 的人会被 SB 们封神&#xff0c;试图唤醒 SB 的人是 SB 眼中的 SB。——SB 第三定律 十、加…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...