MyBatis的入门操作--打印日志和增删改查(单表静态)

news2025/2/22 17:04:29

下面介绍注解和xml实现crud的操作

目录

一、日志打印和参数传递

1.1.使用mybatis打印日志

1.2.参数传递细节

二、crud(注解实现)

2.1.增(insert)

2.2.删(delete) 和 (update)

2.3.查(select)

三、crud(xml实现)

3.1.准备工作

3.2.查询

3.3.增删改


介绍一下准备工作:

数据库信息:

环境和代码框架

一、日志打印和参数传递

1.1.使用mybatis打印日志

(1)准备工作

我们要在使用mybatis的时候打印日志,不需要写什么代码,只需要将配置放上即可。

yml格式:

mybatis:
configuration: # 配置打印 MyBatis⽇志
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

properties格式:
 

#指定mybatis输出⽇志的位置, 输出控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

未使用打印日志的情况:

(2)使用配置打印日志

我们使用yml配置,要注意格式

再次运行后的结果:

多出来的部分就是使用了日志的结果,我们后续可以通过日志的内容,来判断程序是否正确和排查问题等。

1.2.参数传递细节

我们下面使用select * from userInfo来举例,介绍参数名字的映射关系。

(1)单个参数传递

上面的sql语句是查询表的所有数据,是没有参数的,下面我们介绍传递参数的写法。

  • 第一种代码写法:直接写
  @Select("select * from userinfo where id = #{id}")
    UserInfo queryUserInfoById( Integer id);
 @Test
    void queryUserInfoById() {
        userInfoMapper.queryUserInfoById(2);
    }

运行结果:

参数绑定: 

where id = #{写值}

  • 第二种写法:使用注解绑定参数
 @Select("select * from userinfo where id = #{value}")
    UserInfo queryUserInfoById2(@Param("value") Integer id);
@Test
    void queryUserInfoById2() {
        userInfoMapper.queryUserInfoById2(3);
    }

这种写法就是可以绑定到指定参数上,id的值绑定到value上

  • 注意点

一般来说,只有一个参数,参数名字可以随意取,都是可以映射的上

(2)多个参数

  • 两个参数错误版

当多个参数而且名字不一样时,mybatis是没有办法帮我们做到参数映射的

  • 两个参数正确版

运行结果:

无论参数有多少个,只要参数名字对应上了,那就是没有问题

  • 两个参数注解版

运行结果:

使用注解后,参数名字就可以不一样了。

(3)总结

二、crud(注解实现)

这里我们介绍增删改查

2.1.增(insert)

(1)普通插入数据版

  • 正确版

因为插入的参数很多,所以方法的参数可以写成对象的形式,而sql语句正常写参数即可

 @Insert("insert into userinfo (username,password,age,gender,phone)" +
            " values (#{username},#{password},#{age}," +
            "#{gender},#{phone})")
    Integer insertUserInfo(UserInfo userInfo);
  @Test
    void insertUserInfo() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("ssy");
        userInfo.setPassword("bb");
        userInfo.setAge(22);
        userInfo.setGender(1);
        userInfo.setPhone("1750000000");
        System.out.println(userInfoMapper.insertUserInfo(userInfo));
    }

运行结果:插入成功

我们需要注意的点:

  • 属性错误版 

运行结果:

也就是在对象的属性中找不到ages,也就是没有get方法

  • 字段错误版

(2)注解插入数据版

  • 注解错误版

运行结果:

错误原因:方法中的参数username直接映射到注解中了,当加上注解后,就不会自动映射到每一个参数上。

  • 正确注解写法:拿着注解的参数去给每个参数赋值

运行结果:

(3)获取主键自增id

  • 做法:在方法前面加上:@Options注解

运行结果:

2.2.删(delete) 和 (update)

通过前面的学习,删除和修改操作也差不多

(1)删除操作

代码:

  @Delete("delete from userinfo where id=#{id}")
    Integer deleteUserInfo(Integer id);
@Test
    void deleteUserInfo() {
        userInfoMapper.deleteUserInfo(10);
        userInfoMapper.deleteUserInfo(9);
    }

运行结果:

(2)修改操作

代码:

 @Update("update userinfo set phone = #{phone}where id=#{id}")
    void updateUserInfo(UserInfo userInfo);
  @Test
    void updateUserInfo() {
        UserInfo userInfo = new UserInfo();
        userInfo.setId(8);
        userInfo.setPhone("88888888888");
        userInfoMapper.updateUserInfo(userInfo);
    }

运行结果:

如果id没有设置,就会修改失败,但是不会有报错信息。

2.3.查(select)

前面我们有简单的查询语句,我们重新看一下

运行结果:

我们来解释一下:

首先,数据库返回的是有数据的,但是映射到对象上却没了,原因就是变量名字不一样。比如数据库返回的是:create_time,而对象的变量名是:createTime,因此他们没有办法映射上,所以值为空。

下面我们介绍3-4种名字映射方法,可以解决上面的问题。

(1)起别名

这种方法最简单粗暴,就是直接在数据库返回数据后改变名字。

作用位置:注解上

代码:

@Select("select id,username,password,age,gender,phone,delete_flag as deleteFlag" +
            ",create_time as createTime,update_time as updateTime from UserInfo")
    List<UserInfo> queryUserInfos();
 @Test
    void queryUserInfos() {
        userInfoMapper.queryUserInfos();
    }

我们只需要给那些:表的字段名字和java对象中名字不一样的起别名就好

(至于为什么不把它们两个的名字搞成一样,因为它们都有不同的命名规范)

上述的方法比较暴力,很麻烦,为了给几个单独的字段起别名,还要顺便把所有字段加上。

(2)定义结果映射

作用方式:新起一个注解

 @Results({
           @Result(column = "delete_flag",property = "deleteFlag"),
           @Result(column = "create_time",property = "createTime"),
           @Result(column = "update_time",property = "updateTime"),
   })
    @Select("select * from UserInfo")
    List<UserInfo> queryUserInfos222();
 @Test
    void testQueryUserInfos2() {
        userInfoMapper.queryUserInfos222().forEach(System.out::println);
    }

运行结果:

只需要记住注解内的别买是这样起就可以了。

但是这样,还是需要每个语句都需要加上一长串注解,所以也就还有优化的地方

(3)复用结果映射

这种方法就是:只需要定义一次结果映射,后续就不需要重新定义,只需要复用即可。

为了复用上面的注解,我们就需要给上面的注解加上标志(也就是id),方便后续复用

如何使用:

 @Results(id = "base",value = {
           @Result(column = "delete_flag",property = "deleteFlag"),
           @Result(column = "create_time",property = "createTime"),
           @Result(column = "update_time",property = "updateTime"),
   })
    @Select("select * from UserInfo")
    List<UserInfo> queryUserInfos222();

   @ResultMap("base")
   @Select("select * from userinfo")
   List<UserInfo> queryUserInfos333();

运行结果:

所以后续,只需要写一次注解就可以了,后续只需要引用。

(4)配置驼峰

上面的方式还是会有点麻烦,所以我们再学习一个终极方法,就是使用配置文件让他们的名字对应上。

yml配置文件:

mybatis:
    configuration:
        map-underscore-to-camel-case: true #配置驼峰⾃动转换

放到文件中:

我们接着运行没有做任何处理的代码:

运行结果:成功有了数据

所以说,最后一种配置文件是推荐使用的,非常的方便。

三、crud(xml实现)

3.1.准备工作

我们开始先介绍准备工作:

(1)第一步:配置响应的依赖(创建项目的时候顺带配置了)

(2)第二步:配置数据库连接信息(一般一开始就设置好了)

(3)第三步:写一个mapper接口,里面就存放crud的接口

(4)第四步:使用yml配置xml路径(xml用来实现crud代码)

# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis:
    mapper-locations: classpath:mapper/**Mapper.xml

(5)第五步:建立xml文件夹

(6)第六步:套模版

模版代码:复制即可

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.exmple.mybatis.mapper.UserInfoXmlMapper">
 

</mapper>

其中:namepace后面跟的是一个全限定类名,也就是需要使用的那个mapper接口

最后:

准备工作做完,接下来就是写sql的实现了(和注解的方式差不多了)

3.2.查询

(1)查询操作

代码:

我们先完成左边方法,就可以自动生成右边的代码(生成<select>标签);对于里面的sql语句则需要自己写,语法就和写mysql的时候一样了。

我们通过测试代码查询一下运行结果:

结果是没有什么问题的。后面的一些值有变量,原因是前面已经配置好了驼峰转换。

如果关了配置是这样的:

下面介绍使用起别名和使用注解的方法进行变量映射

(2)起别名

这里的起别名和前面使用注解进行crud是一样的

运行结果:

(3)使用注解

 <resultMap id="XMLbase" type="demo.model.UserInfo">
        <id column="id" property="id"></id>
        <result column="delete_flag" property="deleteFlag"></result>
        <result column="create_time" property="createTime"></result>
        <result column="update_time" property="updateTime"></result>
    </resultMap>
    <select id="queryUserInfo2" resultMap="XMLbase">
        select * from userinfo
    </select>

运行结果:

3.3.增删改

(1)增

void insertUserInfo11(UserInfo userInfo);
<insert id="insertUserInfo11">
        insert into userinfo (username,password,age,gender,phone)
        values (#{username},#{password},#{age},#{gender},#{phone})
    </insert>

运行后:

(2)改

void updateUserInfo(UserInfo userInfo);
    <update id="updateUserInfo">
        update userinfo set password = #{password} where id = #{id}
    </update>

成功修改

(3)删

void deleteUserInfo(Integer id);
<delete id="deleteUserInfo">
        delete from userinfo where id = #{id}
</delete>

成功删除


文章到这里就结束了,至于多表查询,就不再介绍,企业中基本也不会使用。

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

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

相关文章

环境搭建-Windows系统搭建Docker

Windows系统搭建Docker 一、系统虚拟化1.1 启用虚拟化2.2 启用Hyper-v并开启虚拟任务 三、安装WSL3.1 检验安装3.2 安装WSL 四、Docker安装4.1 Docker安装包下载4.2 Docker安装4.3 运行docker Desktop 五、Docker配置5.1 打开Docker配置中心5.2 配置Docker国内镜像 六、使用 一…

WIN7系统安装,BIOS+MBR方式

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

【数据结构初阶】单链表经典算法题十二道——得道飞升(中篇)

hi&#xff0c;bro—— 目录 5、 链表分割 6、 链表的回文结构 7、 相交链表 8、 环形链表 【思考】 —————————————— DEAD POOL —————————————— 5、 链表分割 /* struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), …

C++编程: 使用 Nanomsg 进行 PUB-SUB 模式基准测试

文章目录 0. 引言1. Nanomsg简介1.1 可扩展性协议类型1.2 支持的传输机制1.3 NanoMsg 架构与实现 2. PUB-SUB 模式基准测试 0. 引言 Nanomsg 作为一款高性能的通信库&#xff0c;支持多种消息传递模式&#xff0c;其中包括 PUB-SUB&#xff08;发布-订阅&#xff09;。 本篇文…

【NPU 系列专栏 2.4 -- 高速互连 NVLink 详细介绍】

请阅读【嵌入式及芯片开发学必备专栏】 文章目录 NVLink 简介NVLink 主要特点NVLink 应用场景NVLink 工作原理NVLink 实例介绍DL 中使用 NVLinkHPC 中使用 NVLinkSummaryNVLink 简介 NVLink 是 NVIDIA 开发的一种高速互连技术,旨在提升 GPU 与 GPU 之间以及 GPU 与 CPU 之间的…

simapro碳捕集

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

SpringBoot整合阿里云短信业务

详细介绍SpringBoot整合阿里云短信服务的每一步过程&#xff0c;同时会将验证码存放到Redis中并设置过期时间&#xff0c;尽量保证实战的同时也让没做过的好兄弟也能实现发短信的功能~ 1. 注册阿里云账号和创建Access Key 首先&#xff0c;你需要注册一个阿里云账号&#xff0…

【轨物方案】电表红外抄表物联网装置

对于光伏运维工程师来说&#xff0c;电表抄表是一件并不陌生的工作&#xff0c;不过很多并网电表的RS485通讯接口一般都被占用了&#xff0c;并且电表的外壳也被铅封起来。在这种情况下电站通常采用人工抄表的方式采集电量数据&#xff0c;这种方式费时费力&#xff0c;对电站运…

【研发日记】Matlab/Simulink技能解锁(十)——PID调参技巧

文章目录 前言 项目背景 参数P调节 参数I调节 参数D调节 整体优化 分析和应用 总结 参考资料 前言 见《【研发日记】Matlab/Simulink技能解锁(五)——七个Simulink布线技巧》 见《【研发日记】Matlab/Simulink技能解锁(六)——六种Simulink模型架构》 见《【研发日记】…

WEB前端11-Vue2基础01(项目构建/目录解析/基础案例)

Vue2基础(01) 1.Vue2项目构建 步骤一&#xff1a;安装前端脚手架 npm install -g vue/cli步骤二&#xff1a;创建项目 vue ui步骤三&#xff1a;运行项目 npm run serve步骤四&#xff1a;修改vue相关的属性 DevServer | webpack //修改端口和添加代理 const { defineCo…

7·19微软蓝屏事件:对全球 IT 基础设施的冲击与反思

719微软蓝屏事件&#xff1a;对全球 IT 基础设施的冲击与反思 一、引言二、事件的详细剖析三、网络安全与系统稳定性的挑战四、构建稳固和安全网络环境的建议五、各领域的有效实践六、总结与展望 719微软蓝屏事件是指当地时间2024年7月19日美国网络安全企业“群集打击”&#x…

Cocos Creator2D游戏开发-(1)初始化设置

初心: 做一款微信或者抖音小游戏,然后发布,对于我来说这是一个新的赛道; 写这些文档的原因,记录一下自己学习过程,下次用的时候方便找 cocos creator版本: 3.8.3 当前小游戏飞机大战教程来源于: 抖音: 禅影 chanying001 源码目录: https://www.kdocs.cn/l/caLr6XCbEfPa 创建一个…

【iOS】KVO底层原理

KVO底层原理 KVO概述KVO常用方法注册监听器详细解释1. 系统不会增加观察者对象的引用计数2. 对象释放后观察者不会自动置空3. 需要自己持有观察者对象的强引用 示例代码Person 类Observer 类main 函数 解释删除监听器监听器对象的监听回掉方法 KVO内部实现_NSSetLongLongValueA…

脑网络布线成本优化——从Caja守恒原则到最小化成本的探索

脑网络布线成本优化——从Caja守恒原则到最小化成本的探索 Caja守恒原则的核心作用 Caja守恒原则&#xff0c;即大脑组织的布线成本最小化原则&#xff0c;是神经科学中的一个重要概念。它指出&#xff0c;大脑在组织结构上倾向于最小化连接神经元以构成环路或网络所涉及的布…

掌握 Python 面向对象编程与模块化导入技巧

文章目录 前言一、封装、继承、多态1. 封装2. 继承3. 多态 二、导入模块1. 导入整个模块2. 导入模块的特定部分3. 导入模块中的所有功能4. 导入整个模块并重命名5. 导入模块的特定部分并重命名 三、函数参数类型1. 位置参数2. 关键字参数3. 默认参数4. 可变参数 总结 前言 在 …

vue3-01创建项目

一、创建一个 Vue 应用 1、前提条件 前提条件&#xff1a; 已安装 18.3 或更高版本的 Node.js&#xff0c;如果当前的node 版本低于18的话&#xff0c;也没关系&#xff0c;可以使用这个命令行&#xff0c;忽略忽略引擎版本的检查 yarn config set ignore-engines true2、创建…

【数学建模】——【python】实现【最短路径】【最小生成树】【复杂网络分析】

目录 1. 最短路径问题 - 绘制城市间旅行最短路径图 题目描述&#xff1a; 要求&#xff1a; 示例数据&#xff1a; python 代码实现 实现思想&#xff1a; 要点&#xff1a; 2. 最小生成树问题 - Kruskal算法绘制MST 题目描述&#xff1a; 要求&#xff1a; 示例数据…

【前端 15】Vue生命周期

Vue生命周期 在Vue.js中&#xff0c;了解组件的生命周期对于开发者来说是至关重要的。Vue的生命周期指的是Vue实例从创建到销毁的一系列过程&#xff0c;每个阶段都对应着特定的生命周期钩子&#xff08;或称为生命周期方法&#xff09;&#xff0c;允许我们在不同的时间点加入…

【中项】系统集成项目管理工程师-第7章 软硬件系统集成-7.2基础设施集成

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…