【JavaEE】MyBatis

news/2024/4/27 0:13:57/文章来源:https://blog.csdn.net/T_158327/article/details/128062583

文章目录

    • 1.MyBatis介绍
    • 2.MyBatis快速入门
    • 3.Mapper代理开发
    • 4.MyBatis核心配置文件
    • 5.配置文件完成增删改查
      • 5.1 查询
      • 5.2 添加/修改
      • 5.3 删除
    • 6.MyBatis参数传递
    • 7.注解完成增删改查

1.MyBatis介绍

1.什么是MyBatis?

  • MyBatis是一款优秀的 持久层框架用于简化JDBC开发
  • MyBatis本是 Apache 的一个开源项目 iBatis,2010年这个项目由 apache software foundation 迁移到了 google code,并且改名为 MyBatis。2013年11月迁移到 Github
    官网:https://mybatis.org/mybatis-3/zh/index.html
     

2.持久层

  • 负责将数据到保存到 数据库 的那一层代码
  • JavaEE三层架构:表现层、业务层、持久层
     

3.框架

  • 框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
  • 在框架的基础之上构建软件编写更加高效、规范、通用、可扩展

在这里插入图片描述
在这里插入图片描述

 

2.MyBatis快速入门

查询 user 表中所有数据

在这里插入图片描述

1、添加依赖:
在这里插入图片描述
2、编写mybatis-config.xml配置文件
在这里插入图片描述
3.编写sql语句映射文件(UserMapper.xml)
在这里插入图片描述
4.获取工厂构造的对象,执行sql语句
在这里插入图片描述

 

3.Mapper代理开发

在这里插入图片描述
 在这里插入图片描述

1.定义接口,返回值类型、方法名对应映射文件
在这里插入图片描述
2.maper映射文件放置相同目录下,名称空间为接口全限定名
在这里插入图片描述
3.mapper代理方式mybatis-config.xml可以使用包扫描的方式加载映射文件
在这里插入图片描述
4.获取 Mapper 接口对象,调用相应方法执行sql语句
在这里插入图片描述

 

4.MyBatis核心配置文件

配置的属性应符合以下顺序(官网),否则报错
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 给该包下的类起别名,为类名,不区分大小写 --><typeAliases><package name="com.eve.pojo"/></typeAliases><!--environments: 配置数据库连接环境信息, 通过default设置:development、test--><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 连接信息 --><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/><property name="username" value="root"/><property name="password" value="abc123"/></dataSource></environment><environment id="test"><transactionManager type="JDBC"/><dataSource type="POOLED"><!-- 连接信息 --><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///testdb?useSSL=false"/><property name="username" value="root"/><property name="password" value="abc123"/></dataSource></environment></environments><mappers><!-- 加载sql映射文件 --><!--<mapper resource="com/eve/mapper/UserMapper.xml"/>--><!-- mapper代理方式(包扫描的方式) --><package name="com.eve.mapper"/> <!-- 扫描些目录下的所有映射文件 --></mappers>
</configuration>

 

5.配置文件完成增删改查

MyBatis动态Sql:
在这里插入图片描述

MyBatisX插件:
在这里插入图片描述

在这里插入图片描述

 

5.1 查询

1、表列和与属性名不一样(resultMap标签)、特殊字符处理(转义字符、CDATA区)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.eve.mapper.BrandMapper"><!--数据库表中属性的名称和实体类属性名不一样:* 起别名:对不一样的别名起和pojo实体类相同的名称(每次查询都要起别名)* sql片断: 定义一个sql片断,然后导入(不灵活)* resultMap: id唯一标识,type映射的类型,column列名,property实体类属性类参数占位符:1. #{}: 会替换为 ? 占位符, 为防止 SQL 注入2. ${}: 拼SQL, 存在 SQL 注入问题3. 参数传递时使用 #{}4. 表名或列名不固定的情况下可以使用 ${}5. 参数类型: parameterType, 可以不写6. 特殊字符: 如 < 在这里是标签的起始符,* 转义字符: <  &gt;* CDATA区: <![CDATA[ ______ ]]> (纯文本处理)--><resultMap id="brandResultMap" type="com.eve.pojo.Brand"><!-- id: 主键字段的映射,result: 一般字段的映射 --><result column="brand_name" property="brandName"/><result column="company_name" property="companyName"/></resultMap><select id="selectAll" resultMap="brandResultMap">select *from tb_brand;</select><select id="selectById" resultMap="brandResultMap">select *from tb_brand where id = #{id};</select><select id="selectById1" resultMap="brandResultMap">select *from tb_brand where id<![CDATA[]]>#{id};</select></mapper>

 
2、多参数传递(多个参数、对象、集合)

在这里插入图片描述

public class BrandMapperTest {@Testpublic void selectByCondition() throws IOException {// 接收参数int status = 1;String companyName = "华为";String brandName = "华为";// 处理参数companyName = "%" + companyName + "%";brandName = "%" + brandName + "%";// 封装对象
//        Brand brand = new Brand();
//        brand.setStatus(status);
//        brand.setCompanyName(companyName);
//        brand.setBrandName(brandName);Map map = new HashMap();map.put("status",status);map.put("companyName",companyName);map.put("brandName",brandName);String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);SqlSession sqlSession = sqlSessionFactory.openSession();BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);List<Brand> brands = mapper.selectByCondition(map);System.out.println(brands);}
}

 
2、动态条件查询

在这里插入图片描述
 
多条件动态查询:
在这里插入图片描述
 
单条件查询:
在这里插入图片描述
在这里插入图片描述

 

5.2 添加/修改

添加:在这里插入图片描述
 
返回主键(两个属性)

在这里插入图片描述
 
修改:
在这里插入图片描述
 
动态修改(set标签)
在这里插入图片描述

 

5.3 删除

在这里插入图片描述
 
批量删除(foreach标签)
在这里插入图片描述

 

6.MyBatis参数传递

在这里插入图片描述
 
封装:

在这里插入图片描述

 
MyBatis封装参数方法源码:

public Object getNamedParams(Object[] args) {int paramCount = this.names.size();if (args != null && paramCount != 0) {if (!this.hasParamAnnotation && paramCount == 1) {Object value = args[(Integer)this.names.firstKey()];return wrapToMapIfCollection(value, this.useActualParamName ? (String)this.names.get(0) : null);} else {Map<String, Object> param = new MapperMethod.ParamMap();int i = 0;for(Iterator var5 = this.names.entrySet().iterator(); var5.hasNext(); ++i) {Map.Entry<Integer, String> entry = (Map.Entry)var5.next();param.put(entry.getValue(), args[(Integer)entry.getKey()]);String genericParamName = "param" + (i + 1);if (!this.names.containsValue(genericParamName)) {param.put(genericParamName, args[(Integer)entry.getKey()]);}}return param;}} else {return null;}
}

 
&、map传递时,如何取出里面的User对象里的username、password值
在这里插入图片描述

<select id="selectBrandByName" resultMap="brandResultMap">select *from tb_brandwhere brand_name = #{brand.brandName}and company_name = #{brand.companyName};
</select>

 

7.注解完成增删改查

在这里插入图片描述

使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java注解不仅力不从心,还会让你本就复杂的SQL语句更加混乱不堪。因此,如果你需要做一些很复杂的操作,最好用XML来映射语句。
 
选择何种方式来配置映射,以及认为是否应该要统一映射语句定义的形式,完全取决于你和你的团队。换句话说,永远不要拘泥于一种方式,你可以很轻松的在基于注解和ML的语句映射方式间自由移植和切换。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

入门力扣自学笔记208 C++ (题目编号:895)

895. 最大频率栈​​​​​​ 题目&#xff1a; 设计一个类似堆栈的数据结构&#xff0c;将元素推入堆栈&#xff0c;并从堆栈中弹出出现频率最高的元素。 实现 FreqStack 类: FreqStack() 构造一个空的堆栈。 void push(int val) 将一个整数 val 压入栈顶。 int pop() 删除…

Kotlin高仿微信-第11篇-单聊-语音

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

基于Tree-LSTM网络语义表示模型

TC&#xff1b;DR 目前的LSTM仅能对序列信息进行建模&#xff0c; 但是自然语言中通常由词组成的短语形成了句法依存的语义树。为了学习到树结构的语义信息。论文中提出了两种Tree-LSTM模型。Child-Sum、Tree-LSTM、和N-ary Tree LSTMs。实验部分的Tree-LSTM、对比多种LSTMs的…

nuxtjs中asyncData异步数据请求、代理配置、fetch网络请求、vuex的使用、中间件处理

文章目录1. asyncData异步数据请求2. 代理配置3. fetch网络请求4. vuex4.1 state中的数据展示4.2 同步方法与异步方法4.3 数据持久化处理5. 中间件处理1. asyncData异步数据请求 Nuxt.js 扩展了 Vue.js&#xff0c;增加了一个叫 asyncData 和 fetch 的方法&#xff0c;使得我们…

这或许是全网最详细的介绍预言机赛道的视频课程,通俗易通,有趣有料!

图片来源&#xff1a;由无界版图 AI 绘画工具生成有一句话在创业者中很流行&#xff1a;Web3创业三大坑&#xff0c;隐私、跨链、预言机……搞塌加密市场的DK和SBF还在豪华度假酒店里思考人生搞隐私&#xff0c;一毛钱没赚到的Tornado cash开发者却在吃牢饭……加密圈前十大资产…

力扣(LeetCode)895. 最大频率栈(C++)

设计 ①维护最大频率&#xff0c;②维护每个数的出现次数&#xff0c;③维护出现次数对应的栈。 压栈时&#xff0c;新数压入出现次数对应的栈&#xff0c;每次压入新数&#xff0c;维护最大频率(所有出现次数中的最大出现次数)。 弹栈时&#xff0c;找最大频率对应的栈&…

拖死项目的不是团队,可能是失败的管理

项目中的活动&#xff0c;归根结底是由人来完成的&#xff0c;如何发挥项目成员的能力&#xff0c;对于项目的成败起着至关重要的作用。如何充分地发挥团队成员的能力&#xff0c;对项目经理也是一个挑战。 在团队管理者我们会遇见这些难题&#xff1a; 1、团队凝聚力不足&a…

【MySQL 18】Docker 安装 MySQL8 .0.30

1、查看可用的 MySQL 版本 访问 MySQL 镜像库地址&#xff1a; https://hub.docker.com/_/mysql?tabtags 。2、拉取 MySQL 8.0.30 镜像 拉取官方的指定版本的镜像&#xff1a; docker pull mysql:8.0.30[rootlocalhost deploy]# docker pull mysql:8.0.30 8.0.30: Pulling…

云小课|云小课教您如何选择Redis实例类型

阅识风云是华为云信息大咖&#xff0c;擅长将复杂信息多元化呈现&#xff0c;其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击此处。 摘要&#xff1a;购买Redis实例时&#xff0c;实例类型有单机、主备、Pr…

公司新来一个同事,把网关系统设计的炉火纯青,万能通用,稳的一批。。

本文准备围绕七个点来讲网关&#xff0c;分别是网关的基本概念、网关设计思路、网关设计重点、流量网关、业务网关、常见网关对比&#xff0c;对基础概念熟悉的朋友可以根据目录查看自己感兴趣的部分。 什么是网关 网关&#xff0c;很多地方将网关比如成门&#xff0c; 没什么…

Casein-PEG-Rhodamine B 络蛋白-聚乙二醇-罗丹明B Casein-RB

产品名称&#xff1a;络蛋白-聚乙二醇-罗丹明B 英文名称&#xff1a;Casein-PEG-Rhodamine B 质量控制&#xff1a;95% 原料分散系数PDI&#xff1a;≤1.05 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 用 途&#xff1a;仅供科研实验使用&#xff0c;不用于诊…

全波形反演的深度学习方法: 第三章 常规反演

本章介绍反演的基础知识, 以及工程中的常规反演. 仅供内部培训. 3.1 地震数据采集 地震勘探中常使用人工激发的振动进行数据采集. 相应装置包括: 激发器是产生震动的装置, 如炸药, 地震车 (撞击地面). 在城市道路等具有车辆会产生振动的地方, 也可以不安装这类装置;地震检波…

【Linux】高频指令及简单的vim使用(0基础带你快速入门)

目录 一、目录操作指令 1.1、ls 1.2、pwd 1.3、cd 1.4、touch 1.5、cat 1.6、echo 1.7、mkdir 1.8、rm 1.9、mv 1.10、cp 二、Linux中如何手动安装插件 三、vim 3.1、打开文件 3.2、编辑文件 3.3、保存退出 一、目录操作指令 1.1、ls 语法&#xff1a; 第一种&#…

Android中简单使用aspectj

Android中简单使用aspectj 前言&#xff1a; 面向切面编程&#xff08;AOP是Aspect Oriented Program的首字母缩写&#xff09;,这种在运行时&#xff0c;动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程. 1.简介&#xff1a; 在Android中使用注解…

onnx删除无用属性

这里写自定义目录标题在推理onnx模型时&#xff0c;报了一个错&#xff0c;如下&#xff1a;InvalidGraph: [ONNXRuntimeError] : 10 : INVALID_GRAPH : This is an invalid model. In Node, ("Conv_0", Conv, "", -1) : ("x": tensor(float),&q…

xxljob

分为调度中心 执行器 调度中心&#xff1a;提供可视化界面&#xff0c;配置定时任务&#xff0c;定时去调用执行器 调度中心执行器管理&#xff1a;每个springboot作为执行器&#xff0c; 也就是执行器的标识 任务管理&#xff1a;选中执行器&#xff0c;创建改该执行器下的任…

c++ - 第15节 - 二叉树进阶

1. 二叉搜索树 1.1.二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节…

iphone怎么传数据到另一个手机,苹果如何转移数据到新手机,两台iphone怎么同步所有数据

换新手机后&#xff0c;需要迁移旧苹果手机的数据到新苹果手机里面&#xff0c;那么&#xff0c;iphone怎么传数据到另一个手机&#xff1f;本篇文章带您深度了解苹果手机的数据传输技巧。 方法一、通过“快速开始”传输数据 苹果手机如何数据传输&#xff1f;我记得之前换 iP…

沉睡者IT - Web3的未来在哪里?

欢迎关注沉睡者IT&#xff0c;点上面关注我 ↑ ↑ 专家说&#xff0c;web3将颠覆现在的互联网 今天我们来讨论一下&#xff0c;web3会颠覆现在的互联网呢&#xff1f; 看了小编往期的作品你应该知道&#xff0c;如果同样的作品发在web3平台上&#xff0c;你将获取到收益。 那…

Codeforces Round #290 (Div. 2) C. Fox And Names

翻译&#xff1a; Fox Ciel将发表一篇关于FOCS (Fox操作的计算机系统&#xff0c;发音:“Fox”)的论文。她听到一个谣言:报纸上的作者名单总是按照词典顺序排列的。 在查看了一些例子后&#xff0c;她发现有时这不是真的。在一些论文中&#xff0c;作者的名字没有按照正常意义…