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

下面介绍注解和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);
 @Testvoid queryUserInfoById() {userInfoMapper.queryUserInfoById(2);}

运行结果:

参数绑定: 

where id = #{写值}

  • 第二种写法:使用注解绑定参数
 @Select("select * from userinfo where id = #{value}")UserInfo queryUserInfoById2(@Param("value") Integer id);
@Testvoid 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);
  @Testvoid 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);
@Testvoid deleteUserInfo() {userInfoMapper.deleteUserInfo(10);userInfoMapper.deleteUserInfo(9);}

运行结果:

(2)修改操作

代码:

 @Update("update userinfo set phone = #{phone}where id=#{id}")void updateUserInfo(UserInfo userInfo);
  @Testvoid 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();
 @Testvoid 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();
 @Testvoid 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.mzph.cn/pingmian/51043.shtml

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

相关文章

中国居民膳食指南书籍知识点汇总

人如果吃不好&#xff0c;就不能好好思考&#xff0c;好好爱&#xff0c;好好休息。——维吉尼亚伍儿夫 文章目录 书籍简介饮食准则推荐膳食图示 准则一&#xff1a;食物多样&#xff0c;合理搭配合理搭配的方法平衡膳食的科学原理均衡饮食的作用食物功效&#xff08;有科学实验…

02、爬虫数据解析-Re解析

数据解析的目的是不拿到页面的全部内容&#xff0c;只拿到部分我们想要的内容内容。 Re解析就是正则解析&#xff0c;效率高准确性高。学习本节内容前需要学会基础的正则表达式。 一、正则匹配规则 1、常用元字符 . 匹配除换行符以外的字符 \w 匹配字母或数字或下划…

基于Python的房产数据分析系统的设计与实现(源码+lw+部署文档+讲解等)

文章目录&#xff1a; 目录 详细视频演示 设计文档详细参考 技术开发的参考技术栈&#xff01; 2.1 Python语言 2.2 Django框架 2.3 MySQL 2.4 Hadoop介绍 2.5 Scrapy介绍 4.2 系统结构设计 4.3 数据库设计 界面设计与功能实现 5.1系统登录注册实现 5.2管理员模块…

【请求代理】springboot单机服务基于过滤器Filter实现第三方服务器接口请求代理功能

springboot单机服务基于过滤器Filter实现第三方服务器接口请求代理功能 一、前言二、解决思路三、基于gateway实现四、基于过滤器Filter实现五、问题总结 **注&#xff1a;本文源码获取或者更多资料&#xff0c;关注公众号&#xff1a;技术闲人**一、前言 在项目开发时会遇到w…

基于yolov8的口罩检测模型

项目介绍 本项目基于yolov8对图像进行训练&#xff0c;可以检测戴口罩的人与没有带口罩的人的图片和视频&#xff0c;除此之外&#xff0c;还提供了数据分析界面&#xff0c;支持检测过的信息转化为excel&#xff0c;信息可视化等功能 配置过程 软件开发环境:python3.9 系统…

前端开发:HTML与CSS

文章目录 前言1.1、CS架构和BS架构1.2、网页构成 HTML1.web开发1.1、最简单的web应用程序1.2、HTTP协议1.2.1 、简介1.2.2、 http协议特性1.3.3、http请求协议与响应协议 2.HTML概述3.HTML标准结构4.标签的语法5.基本标签6.超链接标签6.1、超链接基本使用6.2、锚点 7.img标签8.…

Apollo:实时通信架构CyberRT入门, my writer

1. 简介 1.1 从 ROS 系统说起 Apollo 最初用的中间件是 ROS(机器人操作系统),在 v3.0 之前用的都是基于 ROS 框架进行开发。概括来说,ROS 系统主要包含三方面: 第一是通信系统,ROS 是个分布式的松耦合系统,算法模块是以独立的进程形式存在的,也就是我们常说的 Node。R…

单击和一些案例

一、单击 1、单击概念 除了定位鼠标之外&#xff0c;processing鼠标还捕捉鼠标是否被单击。mousePressed在鼠标单击和不单击的情况下有不同的值。mousePressed变量是一种bool变量&#xff0c;也就是说它只有两个可能的值&#xff0c;真和假。当鼠标按下的时候mousePressed的值…

apache2和httpd web服务器

apache2和httpd web服务器 apache2和httpd web服务器是啥apache是软件基金会apache2是一个web服务httpd和apache2是同一个东西&#xff0c;但是不同linux发行版中叫法不一样。就是同一个东西&#xff0c;但是看上去有一些不一样。 apache2和httpd web服务器是啥 apache是软件基…

Scikit-learn内置的数据集

数据集是我们学习和研究机器学习不可或缺的基础&#xff0c;Scikit-learn库内置了丰富的数据集资源&#xff0c;非常适合初学者用来练习和验证机器学习算法的效果。 一、鸢尾花数据集 鸢尾花数据集&#xff08;Iris Dataset&#xff09;是机器学习领域中最著名的数据集之一&am…

【每日一篇】使用图神经网络进行交通速度预测的上下文感知知识图谱框架【为了自己方便读论文】

Context-aware knowledge graph framework for traffic speed forecasting using graph neural network 论文链接&#xff1a; https://arxiv.org/abs/2407.17703 翻译&#xff1a; 摘要 人类流动在空间和时间上受到城市环境的密切影响&#xff0c;构成了理解交通系统的重…

MarkTool之UDP

UDP客户端&#xff0c;主要作用是与UDP服务端连接进行数据通讯 1、连接参数有4个&#xff0c;绑定IP和Port&#xff0c;服务端IP和Port 2、接收数据和发送数据的参数设置&#xff0c;有16进制&#xff0c;有字符&#xff0c;有原始数据&#xff0c;都可进行选择 3、定时发送&a…

理解常见开源协议的区别

本文将介绍几种常见的开源许可证&#xff0c;包括GPL、LGPL、MIT、Apache、BSD 和 木兰协议&#xff08;Mulan PSL&#xff09;&#xff0c;并详细解释它们的区别。 1. GPL (GNU General Public License) GPL 是最著名和最常用的开源许可证之一&#xff0c;由自由软件基金会 …

泰安网站建设有几大特点

泰安网站建设的特点可以分为以下几个方面&#xff1a; 一、突出地域特色。泰安是山东省的一个地级市&#xff0c;具有悠久的历史和深厚的文化底蕴。在网站建设过程中&#xff0c;泰安的特色文化和旅游资源应得到充分的展示。可以通过优美的图片、详细的介绍和生动的文字&#x…

【Python 基础】字典和结构化数据 -1

字典和结构化数据 在本文中,我将介绍字典数据类型,它提供了一种灵活的访问和组织数据的方式。然后,结合字典与关于列表的知识,你将学习如何创建一个数据结构,对井字棋盘建模。 字典数据类型 像列表一样,“字典”是许多值的集合。但不像列表的下标,字典的索引可以使用…

【STM32】SysTick定时器

SysTick定时器 前言一、介绍最大计时时间 固件库函数体现用途 总结 前言 参考一下猫咪博主的文章&#xff0c;作为补充学习⇨【STM32】Systick滴答定时器 当然我主要还是跟着金善愚老师学的&#xff0c;我觉得他真的有种高中班主任的亲切感。那个1812的名号往那里一放&#x…

【vluhub】elasticsearch漏洞

Elasticsearch介绍 是Apache旗下的一个开源的、分布式、RESTful的搜索和分析引擎&#xff0c;适用于java语言项目 默认端口9200 kali中搭建ElasticHD, 即可未授权绕过ES可视化界面 直通车 https://github.com/360EntSecGroup-Skylar/ElasticHD/releases/download/1.4/elas…

Csrf复习(pikachu靶场和防御手段)

CSRF漏洞简介 CSRF又称跨站请求伪造&#xff0c;是指攻击者在用户登录的状态下&#xff08;浏览器保存了用户的cookie&#xff09;通过伪造恶意url诱导用户点击&#xff0c;借助用户的cookie网站权限&#xff08;冒充用户身份来进行非法操作&#xff0c;对于服务器来说是合法的…

视觉SLAM第二讲

SLAM分为定位和建图两个问题。 定位问题 定位问题是通过传感器观测数据直接或间接求解位置和姿态。 通常可以分为两类&#xff1a;基于已知地图的定位和基于未知地图的定位。 基于已知地图的定位 利用预先构建的地图&#xff0c;结合传感器数据进行全局定位。SLAM中的全局…

如何利用开源Bug管理系统提高团队效率

国内外主流的10款开源bug管理系统对比&#xff1a;PingCode、Worktile、Trac、WebIssues、MantisBT、Bugzilla 、Fossil、The Bug Genie、TestLink 、OpenProject。 在软件开发的复杂世界中&#xff0c;Bug管理可能是一个令人头疼的问题&#xff0c;尤其是当工具不足以捕捉和解…