明哥复习MyBatis(1)

2023-10-27

这不是原创,借鉴尚硅谷的,不是原创

一、核心配置文件详解

① <properties resource="jdbc.properties"/>  这个标签用于引入properties配置文件
②<typeAliases>
            <package name="com.atguigu.mybatis.pojo"/>
        <!--   这个表示这个包下面的所有类将自动拥有别名 -->
 </typeAliases>    
这个标签用于设置类型别名,里面的package表示以包为单位,这个包下面的所有表将自动拥有这个别名
③ <environments default="development">
        <environment id="development">
            <dataSource type="POOLED">
                <!--                -->
                <!--                配置驱动-->
                <property name="driver" value="${jdbc.driver}"/>
                <!--配置路径 端口号后面的表示操作数据库的名称-->
                <property name="url" value="${jdbc.url}"/>
                <!--                用户名-->
                <property name="username" value="${jdbc.username}"/>
                <!--          注意MySQL的密码设置      密码-->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>  用于配置连接数据库的具体环境
④<mappers>
        <!--        <mapper resource="mappers/UserMapper.xml"/>-->
        <!--        这是以包的方式引入映射文件,必须满足两个条件:-->
        <package name="com.atguigu.mybatis.mapper"/>
 </mappers>   引入映射文件

注意:映射文件之间存在双一致原则,即:

1.Mapper接口和映射文件所在的包必须保持一致

2.Mapper接口的名字和映射文件的名字必须保持一致

如下图所示:

二、Mybatis实现快速的增删改查操作: 

注意:再Mybatis中一张表对应一个实体类对象,对应一个Mapper接口,对应一个配置文件(这里进一步体现前面的双一致原则)。同时一条增删改查操作对应一个Mapper接口的抽象方法,也就对应配置文件中的一条标签设置

增删改较为固定,接口返回值是受影响的行数,下面演示按照id增加的操作:

首先创建UserMapper接口对象,为接口添加抽象方法:

int insertUser();

其次,在配置文件中,添加标签

<!--    int insertUser();方法名要和sql语句的id保持一致-->
    <insert id="insertUser">
        insert into t_user values(null,"admin",'123456','男','123456@qq.com')
    </insert>

这样就完成添加操作了。

对于查询操作,多上一个resultMap和resultType即多一个结果返回集,即要在标签中设置这两个属性中的一个。

比如

<select id="getUserById" resultType="com.atguigu.mybatis.pojo.User">
    select *from t_user where id=2
</select>

resultType中要写查询结果的全类名,注意,此时标签typeAliases就起作用了,为这个包设置了别名。

三、获取参数的两种方式

先说结论,获取参数有两种方式${}和#{}

${}的本质就是字符串拼接,#{}的本质就是占位符赋值 ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号

原则上先使用#{},但是有特殊情况只可以使用${}

①对于单个字面量,可以使用#{}或者${}都可以,但是${}要手动设置单引号。

如下面所示:

<select id="getUserByUserName" resultType="User">
<!-- 要通过接口,获取得到username中的这个参数-->
       select *from t_user where username='${uesername}'
 </select>

注意:当参数只有一个时,可以时任意字符。

②多个字面量类型

若mapper接口中的方法参数为多个时 此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1...为键,以参数为值;以 param1,param2...为键,以参数为值;因此只需要通过${}和#{}访问map集合的键就可以获取相 对应的值,此时也可以通过@Param()注解,来设置键,会替换arg0,arg1.

如:

User getUserById(@Param("id") Integer id);

<!--    User getUserById(@Param("id") Integer id);-->
    <select id="getUserById" resultType="user">
        select * from t_user where id=#{id}
    </select>

③实体类参数

若mapper接口中的方法参数为实体类对象时 此时可以使用${}和#{},

通过访问实体类对象中的属性名获取属性值,注意${}需要手动加单引号

比如:

void insertUser(User user);

<insert id="insertUser">
    insert into t_user value(null,#{username},#{password},#{gender},#{email})
</insert>

总的来说MyBatis获取实体类参数的两种方式,分别是通过字面量获取参数(这时通过@Param()注解),或者通过访问实体类对象中的属性名获取属性值。

四、运用Mybatis实现各种各样的查询(只介绍一种了)

①查询结果为Map构成的集合

第一种方式:通过将查询的结果放入到一个List集合当中

<select id="getUserById" resultType="user">
    select * from t_user where id=#{id}
</select>
List<Map<String,Object>> getAllUserToMap(); 

第二种方式:通过注解的方式进行

@MapKey("id")
Map<String,Object> getAllUserMap();//将查询出来的id作为值,将查询出来的对象作为值进行保存

五、特殊的SQL的查询(一下几种查询,优先使用${}字符串拼接的方式进行)

①模糊查询(就记忆这个东西)

select *from t_user where username like "%"#{mohu}"%" 
或者
select *from t_user where username like '%'${mohu}'%'
//这其实很好理解,就是对字符串进行拼接
List<User> getUserByLike(@Param("mohu") String mohu);

②批量删除(说白了就是有in这个参数)

void deleteMoreUser(@Param("ids") String ids);
<delete id="deleteMoreUser">
<!-- 这里不可以用#{}因为底层会加上''-->
            delete from t_user where id in(${ids})
</delete>
//输入参数的时候,要输入字符串1,2表示删除1和2两个字符串

③动态设置表名,之所以这边不用#{},是因为查询表明的时候不可以用'表名'来进行表示

比如:

<select id="getUserList" resultType="User">
        select *from ${tableName}
</select>
List<User> getUserList(@Param("tableName") String tableName);

④添加用户信息,并且获得自增的主键

void insertUser(User user);
useGeneratedKeys表示当前添加功能使用了自增的主键
keyProperty将自增的主键为实体类参数的主键进行赋值(由于增删改返回的值都是相同,因此我们将哪个获取的主键赋值给哪个变量)

        <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
            insert into t_user values(null,#{username},#{password},#{gender},#{email})
        </insert>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

明哥复习MyBatis(1) 的相关文章

  • 如何在流中收集到TreeMap中?

    我有两个Collectors groupingBy在流中 我需要收集所有信息TreeMap 我的代码 Map
  • java.sql.SQLException: ORA-01005: 给定的密码为空;登录被拒绝

    我在尝试连接到数据库时遇到以下异常 java sql SQLException ORA 01005 null password given logon denied at oracle jdbc driver T4CTTIoer proce
  • 如何检查字符串是否具有特定模式[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 用户输入任意字符串 程序会区分该字符
  • 黄瓜与 Micronaut

    我正在尝试将 Cucumber 与 Micronaut 一起使用 但当我尝试将其与 Cucumber 一起使用时 MicronautTest 注释根本不起作用 未注入 theApple 请参阅下面的代码 如果我在没有黄瓜的情况下运行它就可以
  • Java 中的本机方法

    我花了一些时间学习什么是 Java Native 方法以及它们是在平台相关代码 主要是 C 中实现的 但是我在哪里可以找到这些 Java 的本机实现呢 例如 Thread 类的 sleep long millis 方法是本机的 但它的实现代
  • 在 JSP 中对表单操作使用相对路径

    如何在表单操作中使用相对路径
  • Keycloak 社交登录 REST API

    我已经为我的 keycloak 实例启用了谷歌社交登录 但我需要将其用作休息服务 是否有可用于执行此操作的端点 Keycloak 中没有 Google 身份验证 API 但您可以使用以下方法解决它代币交换 https www keycloa
  • 如何连接hibernate和DB2

    我正在运行一个使用 struts 和 hibernate 的应用程序 我目前正在使用 Derby 数据库 现在我必须转向 DB2 数据库 请告诉我 我必须做什么配置 休眠配置文件 我必须设置任何类路径吗 多变的 我知道 DB2 有两个 ja
  • Spring @Value 添加验证小于

    我使用以下属性值注入 我如何向此操作添加小于验证 我的意思是我想设置一个验证user maxpassiveday可以说 财产价值不得低于 100 Value user maxpassiveday int maxpassiveday 使用Sp
  • 用于测试的嵌入式 H2 数据库的 Spring 配置

    使用 Spring 进行集成测试的配置是什么样的 嵌入式 h2 数据源 http www h2database com html main html以及可选的 JUnit 我第一次尝试单连接数据源 http static springsou
  • 在 Spring Security SAML 身份验证请求中配置 POST ProtocolBinding

    Spring Security SAML 坚持在 SAML 身份验证请求中请求 Artifact 绑定 ProtocolBinding 属性
  • 如何在 Spring Boot 中创建 Apache POI Excel 视图配置

    当我想使用 Spring Boot Web 将数据导出到 Excel 时遇到问题 我使用 Thymeleaf 作为模板引擎 由 Spring Boot 自动配置 但是当我在附加配置中添加 XmlViewResolver 时 由 XmlVie
  • 如何获取队列中的第 n 个项目?

    我的应用程序中有许多队列和优先级队列 我想轻松访问这些队列中的第 n 个项目 但没有看到使用 API 实现此目的的简单方法 我想我可以创建一个Iterator并迭代到第 n 个元素或使用toArray index 但似乎应该有一个更简单的方
  • 在openjdk:7-jre-alpine docker上如何安装python 3.6

    直到大约一周前 我才在 java 图像上成功使用 python 3 6 脚本 如下所示 FROM openjdk 7 jre alpine RUN apk update apk upgrade apk add no cache bash a
  • 有时 Properties.load() 会跳过行

    在以下情况下 Properties load 会跳过 InputStream 的第二行 这是 Java 的错误还是正常行为 public class PropTest public static void main String args
  • 为什么 HttpServletRequest 输入流为空?

    我有这段代码 我从请求输入流读取输入并使用 JacksonMapper 转换为 POJO 它在具有 guice 支持的 jetty 7 容器中运行 Override protected void doPost HttpServletRequ
  • 如何使用 Spring Resource.groovy 正确注入 Grails 服务

    使用 Grails 2 2 1 我定义了以下 Grails 服务 package poc class TestService def helperService class HelperService 我已经用过TestService如下
  • 根据 Java 环境变量中的值创建使用 @JsonIgnore 的自定义注释

    我需要创建一个新的注释 用于在环境变量设置时忽略输出 JSON 文件中的字段var false 我尝试使用JsonAnnotationIntrospector 但无法获得预期的输出 public class Vehicle String v
  • javafx中的stackpane和root有什么区别?

    我正在练习javafx做饼图 以下是开发饼图的代码 如果我这样做Group并与StackPane 我发现输出没有区别 我已经评论了组部分 只是徘徊两者之间的区别 import javafx application Application i
  • 对 Java 协议缓冲区对象进行一些小更改

    我想在 Java 协议缓冲区对象树的深处进行一个小更改 我可以使用 getBuilder 方法来创建一个新对象 该新对象是旧对象的克隆并进行一些更改 当深入完成此操作时 代码会变得丑陋 Quux Builder quuxBuilder fo

随机推荐

  • C# 父类实现的 IEquatable<T> 接口,重写的相等性判断函数都能被子类继承

    实验代码 Son s1 new s2 new Console WriteLine s1 s2 s1 s2 Console WriteLine Console WriteLine s1 s2 s1 s2 Console WriteLine C
  • 多媒体计算机的媒体信息包括文字,多媒体计算机中的媒体信息是指什么

    多媒体计算机中的媒体信息是指 数字 文字 声音 图像 动画 视频影像等 文本是以文字和各种专用符号表达的信息形式 图像是多媒体软件中最重要的信息表现形式之一 动画是快速播放一系列连续运动变化的图形图像 视频影像具有时序性与丰富的信息内涵 本
  • Halcon判断一个点是否在某个区域

    Index of all regions containing a given pixel read image Image fabrik dev close window dev open window 0 0 512 512 black
  • Vue + ElementUI 实现后台管理系统模板 -- 前端篇(九):使用 iframe 标签嵌套页面 及内容顶部tab页签

    一 使用 iframe 标签嵌套页面 1 简单了解一下 1 什么是 iframe iframe 标签会创建一个行内框架 包含另一个文档的内联框架 简单地理解 页面中嵌套另一个页面 2 使用场景 有的项目需求 需要在当前页面中显示外部网页 比
  • 给wordpress添加关键词与描述

    Wordpress网站的关键字及网页描述关系网站对搜索引擎的友好程度 如果自己手动加显然太折腾了 那如何让WordPress博客自动为每篇文章自动关键字及网页描述 每篇文章的内容不同 我们该如何让wordpress自动添加文章描述和关键词呢
  • Heyperledger Fabric 运行时架构

    一 运行时架构图 逻辑架构图说明了Heyperledger Fabric 的各个核心组件 模块 由于Heyperledger Fabric 是一个需要保证交易数据安全的分布式系统 所以再实际运行时将不同的服务器配置成为不同的Node 节点
  • allegro中网表的导入与器件放置

    文章目录 封装库路径的指定 网表导入 器件放置 自动器件放置 手动器件放置 room器件放置 封装库路径的指定 Setup User Perference Paths Library中zhi dzhid 特别关注一下三个路径 devpath
  • 小程序开发——比较好看的登录界面设计

    主要代码 login wxml
  • Windows10开机自动运行批处理、脚本等的方法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 方法 步骤 一 打开我的电脑 在地址栏输入 C ProgramData Microsoft Windows Start Menu Programs Startup 二 把自
  • 彻底解决乱码问题(附一):简体中文编码中区位码、国标码、内码、外码、字形码的区别及关系

    首先声明这篇博客的创作过程 大部分文本来自 笨笨阿林 的原创文章 我在看完后加入了部分自己的理解 有些地方做了略微调整 比如将有些不易理解的地方重新解释 多余的话删除等 也在最后加入了一个例子来证实了一下在GB2312编码下从区位码到实际在
  • vue3-print-nb 实现页面打印(含分页打印)

    安装vue3 print nb npm install vue3 print nb save 引用vue3 print nb 全局引入 全局引用 import createApp from vue import App from App v
  • 左程云算法笔记(三)堆排序、桶排序、排序总结

    左程云算法笔记 三 堆 堆结构 堆排序 堆排序扩展题 桶排序 计数排序 基数排序 补 桶排序 补 希尔排序 排序总结 稳定性 综合比较 常见的坑 工程上对排序的改进 堆 堆结构 1 堆结构就是用数组实现的完全二叉树结构 2 完全二叉树中如果
  • Spring Boot使用(基础)

    目录 1 Spring Boot是什么 2 Spring Boot使用 2 1Spring目录介绍 2 2SpringBoot的使用 1 Spring Boot是什么 Spring Boot就是Spring脚手架 就是为了简化Spring开
  • 权重设计介绍

    相关产品 RocketMQ 之前在阿里的 负载均衡 比赛中 就有这个算法 RocketMQ 中包含多种负载算法 其中 权重 算法就属于其中一种 也是最实用的一种 奖励系统 经常会有许多活动 或则任务 当用户完成后 可以获得相关的奖励 当然可
  • 华为OD机试 - 评论转换输出(Java)

    题目描述 在一个博客网站上 每篇博客都有评论 每一条评论都是一个非空英文字母字符串 评论具有树状结构 除了根评论外 每个评论都有一个父评论 当评论保存时 使用以下格式 首先是评论的内容 然后是回复当前评论的数量 最后是当前评论的所有了评论
  • 操作系统内核

    现代操作系统一般将OS划分为若干个层次 再将OS的不同功能分别设置在不同的层次中 通常将一些与硬件紧密相关的模块 如中断处理程序等 各种常用及运行频率较高的模块 如时钟管理 进程调度和许多模块所公用的二些基本操作 都安排在紧靠硬件的软件层次
  • vue生命周期

    随着对 vue 的不断了解 会越来越发现它生命周期的重要性 只有了解了它的生命周期 才能在开发项目的时候在逻辑上的很好的判断什么时候该发生什么事件 即很好的控制页面 一 什么是 vue 生命周期 Vue 实例从创建到销毁的过程 就是生命周期
  • kong+Verdaccio+ldap(docker)

    需求 使用Kong来代理Verdaccio 实现直接通过域名 path的方式来访问 并且Verdaccio使用ldap来管理 前提 Kong ldap已部署好 并且也部署好了Kong Dashboard 后面有需求再写关于Kong代理的各种
  • 国内的Ubuntu镜像源

    国内的Ubuntu镜像源 Ubuntu清华镜像源 今天学习docker需要在线Ubuntu镜像 所以做了一个镜像下载地址笔记 方面以后的下载 官方镜像下载访问地址 https cn ubuntu com download alternati
  • 明哥复习MyBatis(1)

    这不是原创 借鉴尚硅谷的 不是原创 一 核心配置文件详解