MyBatis的基础操作

目录

一.什么是MyBatis?

二.使用MyBatis的准备工作

1.引入依赖:

2.配置数据库连接字符串(建立MaBatis和MySQL的连接)

3.在model包中建立数据库对应的实体类UserInfo

三.通过@注解的方式实现MyBatis的开发

1.插入语句(Insert)

2.删除语句(Delete)

3.更新语句(Update)

4.查询语句(Select) 

1.起别名:

2.结果映射:

3.开启驼峰命名:

四.通过xml的方式实现MyBatis的开发

1.前提准备:

1)添加关于xml的配置(yml)

2)在resources文件夹中添加xml文件,在文件写入固定格式

3)接着就可以在里写数据库语句了

2.插入语句(Insert)

3.删除语句(Delete)

4.更新语句(Update)

5.查询语句(Select)


一.什么是MyBatis?

MyBatis是一个开源的持久层框架,它提供了一种优雅的方式来管理数据库访问代码。MyBatis通过将SQL语句映射到Java方法,使得在Java应用程序中执行数据库操作变得更加简单和直观。

MyBatis的核心思想是将SQL语句与Java方法和参数进行绑定,这样可以避免传统的JDBC编程中的大量样板代码。开发人员可以使用XML或注解来定义SQL映射,将SQL语句保存在外部文件中,并将其与Java接口或类进行绑定。


二.使用MyBatis的准备工作

1.引入依赖:

        <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>

2.配置数据库连接字符串(建立MaBatis和MySQL的连接)

spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
mybatis:configuration: # 配置打印 MyBatis⽇志map-underscore-to-camel-case: true #配置驼峰⾃动转换log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.在model包中建立数据库对应的实体类UserInfo

public class UserInfo {private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;
}

前提工作做完后,就可以实现数据库操作了


三.通过@注解的方式实现MyBatis的开发

1.插入语句(Insert)

使用@Insert("")注解,并在("")中实现插入语句

示例:

@Insert("insert into userinfo (username, password, age, gender, phone) " +"values (#{userInfo.username},#{userInfo.password},#{userInfo.age}," +"#{userInfo.gender},#{userInfo.phone})")Integer insertUserInfo(UserInfo userInfo);//在上述代码中实现了插入一个userInfo对象的信息到数据库中userinfo的表中
//userInfo的属性不能直接写到sql语句中,而是通过#{userInfo.属性字段}来自动查找userInfo的属性并填入sql语句中

同时可以搭配@Param注解使用,为方法中的参数指定名称

@Insert("insert into userinfo (username, password, age, gender, phone) " +"values (#{user.username}, #{user.password}, #{user.age}," +"#{user.gender}, #{user.phone})")Integer insertUserInfo2(@Param("user") UserInfo userInfo);//将userInfo识别成user使用

当传入参数有多个时,会按顺序填入各属性,而使用@Param就可以更自由的使用参数,同时可以提高代码的清晰度和可读性

Insert 语句默认返回的是受影响的行数,如果想要拿到⾃增id, 需要在方法上添加⼀个@Options注解

    @Options(useGeneratedKeys = true, keyProperty = "id")@Insert("insert into userinfo (username, password, age, gender, phone) " +"values (#{user.username}, #{user.password}, #{user.age}," +"#{user.gender}, #{user.phone})")Integer insertUserInfo2(@Param("user") UserInfo userInfo);
  • useGeneratedKeys = true表示告诉 MyBatis 在执行插入操作后要生成主键。当这个参数设置为 true 时,MyBatis 会通知数据库生成主键,并将生成的主键值返回给应用程序。

  • keyProperty = "id"表示指定将生成的主键值设置到对象的哪个属性上。在这里,keyProperty 指定了要将生成的主键值设置到对象的 id 属性上。

示例:

UserInfo newUser = new UserInfo();
newUser.setUsername("testUser");
newUser.setPassword("123456");
newUser.setAge(25);
newUser.setGender("male");
newUser.setPhone("123456789");Integer result = insertUserInfo2(newUser);System.out.println("插入成功,生成的主键值为:" + newUser.getId());//返回的主键值自动设置到newUser的id属性上了
//⽅法返回值result依然是受影响的⾏数

2.删除语句(Delete)

使用@Delete("")注解,并在("")中实现删除语句

示例:

  @Delete("delete from userinfo where id = #{id}")void delete(Integer id);//通过id删除某个用户

 同样可以使用@Param注解 

3.更新语句(Update)

使用@Update("")注解,并在("")中实现更新语句

示例:

@Update("update userinfo set username=#{username} where id=#{id}")void update(UserInfo userInfo);//通过id更新用户的姓名

4.查询语句(Select) 

使用@Select("")注解,并在("")中实现查询语句

示例:

    @Select("select id, username, password, age, gender, phone, delete_flag, " +"create_time, update_time from userinfo")List<UserInfo> queryAllUser();

MyBatis会自动将查询出的表的数据按照字段名依次放入List<UserInfo> 对象中

但是,如果表的字段名类的属性不一致时,就无法正常赋值了,例如表中的create_time字段类的createTime属性

解决办法:

1.起别名:
@Select("select id, username, `password`, age, gender, phone, delete_flag " +"as deleteFlag, create_time as createTime, update_time as updateTime " +"from userinfo")public List<UserInfo> queryAllUser2();//查询语句中 as 加上想改成的名字
2.结果映射:
@Select("select id, username, `password`, age, gender, phone, delete_flag, 
create_time, update_time from userinfo")
@Results({@Result(column = "delete_flag",property = "deleteFlag"),@Result(column = "create_time",property = "createTime"),@Result(column = "update_time",property = "updateTime")
})
List<UserInfo> queryAllUser();
3.开启驼峰命名:

在yml配置中加上:

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

到此关于注解实现MyBatis的方式就结束了~


四.通过xml的方式实现MyBatis的开发

1.前提准备:

1)添加关于xml的配置(yml)
mybatis:mapper-locations: classpath:mapper/**Mapper.xml
2)在resources文件夹中添加xml文件,在文件写入固定格式

<?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.example.demo.mapper.UserInfoMapper">//写MySQL语句
</mapper>
3)接着就可以在<mapper></mapper>里写数据库语句了

2.插入语句(Insert)

使用<insert>标签实现插入语句

<mapper namespace="com.example.demo.mapper.UserInfoMapper"><insert id="insertUser">insert into userinfo (username, password, age, gender, phone) values (#{username}, #{password}, #{age},#{gender},#{phone})</insert></mapper>

sql语句基本没有变化,只是放入了<insert>标签以及用id指定了mapper中要实现的接口的方法名

如果要返回自增 id,则需要设置useGeneratedKeys 和keyProperty属性

<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">insert into userinfo (username, `password`, age, gender, phone) values(#{userinfo.username},#{userinfo.password},#{userinfo.age},#
{userinfo.gender},#{userinfo.phone})
</insert>

3.删除语句(Delete)

使用<delete>标签实现删除语句

<delete id="deleteUser">delete from userinfo where id = #{id}
</delete>

4.更新语句(Update)

使用<update>标签实现更新语句

<update id="updateUser">update userinfo set username=#{username} where id=#{id}
</update>

5.查询语句(Select)

使用<select>标签实现查询语句

<select id="queryAllUser" resultType="com.example.demo.model.UserInfo">select id, username,`password`, age, gender, phone, delete_flag,create_time, update_time from userinfo
</select>

同理,如果表的字段名类的属性不一致时,就无法正常赋值了,解决方法和用注解的方式类似


到这里,有关MyBatis的基础操作的介绍就全部讲完了

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

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

相关文章

刚接触抖店并开通了个体店,怎么快速起店呢?运营思路参考如下

我是王路飞。 如果你刚接触抖店&#xff0c;并且开通了个体店&#xff0c;但不知道如何做店的话。 其实很简单&#xff0c;抖店的流程并没有这么复杂。 电商的核心无非就是产品&#xff0c;抖店的运营也都是围绕产品展开的。 我给你们说下抖店的运营思路你们可以作为参考&a…

李飞飞亲自撰文:大模型不存在主观感觉能力,多少亿参数都不行

近日&#xff0c;李飞飞连同斯坦福大学以人为本人工智能研究所 HAI 联合主任 John Etchemendy 教授联合撰写了一篇文章&#xff0c;文章对 AI 到底有没有感觉能力&#xff08;sentient&#xff09;进行了深入探讨。 「空间智能是人工智能拼图中的关键一环。」知名「AI 教母」李…

day16--集合进阶(Set、Map集合)

day16——集合进阶&#xff08;Set、Map集合&#xff09; 一、Set系列集合 1.1 认识Set集合的特点 Set集合是属于Collection体系下的另一个分支&#xff0c;它的特点如下图所示 下面我们用代码简单演示一下&#xff0c;每一种Set集合的特点。 //Set<Integer> set ne…

得物小程序逆向+qt可视化(不含sku)

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章未…

canvas层级太高?解决方法

这个方法主要是依赖于邀请好有页面展示的canvas二维码二维码以及其他容器的图片 有一个保存图片功能&#xff0c;这个保存图片是需要将二维码以及涉及到的其他容器比如下图&#xff1a; 所以这时候需要canvas来绘制一个保存图片的效果&#xff0c;然后对这个canvas绘制的图片保…

AI写作工具的革命:AIGC如何提升内容生产效率

AIGC&#xff0c;即人工智能生成内容&#xff0c;是一种新兴的内容生产方式&#xff0c;它利用人工智能技术来自动生成文本、图像、音频、视频等多种形式的内容即进入实际应用层面。 所以AI不再是高深的、让人望尘莫及的算力算法&#xff0c;而是真实地贴近了我们的生活&#…

抖店重磅新规!保证金下调,一张营业执照能开多个店铺了!

哈喽~我是月月 抖音平台为助力小商家实现开店低成本&#xff0c;轻负担&#xff0c;高收益的模式 在5月30日正式实施了两个政策&#xff1a;保证金下调&#xff0c;一证多开 政策一&#xff1a;保证金下调 这次政策&#xff0c;涉及的类目优惠包含了&#xff0c;平台近70%的…

视频营销的智能剪辑:Kompas.ai如何塑造影响力视频内容

引言&#xff1a; 在当今数字化的营销领域&#xff0c;视频内容已经成为品牌吸引用户注意力、建立品牌形象和提升用户参与度的重要方式。然而&#xff0c;要想制作出具有影响力的视频内容&#xff0c;并不是一件容易的事情。这就需要借助先进的技术和工具&#xff0c;如人工智能…

解析控制台厂家在监控控制台尺寸定制有哪些标准

控制台厂家在监控控制台尺寸定制方面遵循着一系列严格的标准&#xff0c;以确保控制台能够适应不同监控室的具体需求&#xff0c;同时保证工作人员的操作便利和舒适性。以下是一些常见的监控控制台尺寸定制标准&#xff1a; 控制台的整体高度范围通常在720mm至1650mm之间&#…

【大模型】 基于AI和全球化进程的权衡:开源大模型与闭源大模型

【大模型】 基于AI和全球化进程的权衡&#xff1a;开源大模型与闭源大模型 前言 实际上关于开源or闭源&#xff0c;一直以来都是颇有争议的话题&#xff0c;人们争执于数据的隐私性和共享性&#xff0c;到底哪一方能获得的收益更大。而对于开源与闭源哪个更好实际上也就是说是…

clocking wizard IP核通过AXI4-Lite接口实现动态重新配置应用实例

在最近的FPGA应用中&#xff0c;应用到了基于Zynq 7000的Uart串口设计&#xff0c;为了让串口的时钟更精确&#xff0c;采用了外部时钟模式&#xff0c;如下图所示。外部时钟连接到了Clocking Wizard IP核的输出端。 在串口通信时&#xff0c;发现串口有错码出现。例如&#xf…

springboot社区助老志愿服务系统-计算机毕业设计源码96682

摘要 大数据时代下&#xff0c;数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求&#xff0c;利用互联网服务于其他行业&#xff0c;促进生产&#xff0c;已经是成为一种势不可挡的趋势。在图书馆管理的要求下&#xff0c;开发一款整体式结构的社区助老志愿服务…

芯课堂 | UI Creator 物理键盘移植指南

LVGL提供输入设备的种类一共有5种&#xff0c;分别是&#xff1a;touchpad&#xff08;触摸板&#xff09;、mouse&#xff08;鼠标&#xff09;、keypad&#xff08;键盘&#xff09;、encoder&#xff08;编码器&#xff09;、button&#xff08;外部按键&#xff09;。而基于…

【源码】一站式Java云商城系统源码,无后门

一站式Java云商城系统源码&#xff0c;无后门&#xff0c;不是java源代码&#xff0c;是编译后的。 系统对接 手动发货 自动发货 兑 换 码 订单监控 商品监控 对象存储 邮箱提醒 加价模板 密价功能 三方支付 会员体系 财务明细 交易分析 售后服务 技术支持 服务器建议配置&a…

简单微信企业群消息推送接口

群管理 群发送接口 POST: JSONURL http://localhost:65029/m/wxapi/sendwxmsg{ "nr":"试", --消息 "at":"wxid_y0k4dv0xcav622,wxid_y0k4dv0xcav622",--群wxid "key":"F98F354F1671A2D21BC78C76B95E96EB",--群k…

不聚焦情绪,不精神内耗:成长的自我修炼

在我们的人生旅途中&#xff0c;总会遇到各种各样的困境和挑战。如何在逆境中保持积极的心态&#xff0c;专注于个人成长&#xff0c;是每一个人都需要面对和思考的问题。这篇文章将探讨如何不抱怨、不指责、不聚焦情绪、不精神内耗&#xff0c;专注于解决困境和个人成长。 问…

【基于 PyTorch 的 Python 深度学习】9 目标检测与语义分割(2)

前言 文章性质&#xff1a;学习笔记 &#x1f4d6; 学习资料&#xff1a;吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2 主要内容&#xff1a;根据学习资料撰写的学习笔记&#xff0c;该篇主要介绍了优化候选框的几种方法。 一、优化候选框的…

C语言——基于stm32G030的温湿度传感器项目实验

一、功能要求&#xff1a; 设备自检功能&#xff1a; 设备上电自检&#xff08;检查传感器采集是否正常&#xff0c; DHT11有存在响应&#xff0c; 可以自检使用&#xff0c; &#xff09;自检通过后&#xff0c;由串口打印设备状态信息。 自动控制功能&#xff1a; 进入自动控…

【招聘】易基因科技诚聘销售总监 虚位以待

&#x1f680; 关于我们 易基因拥有一支充满活力的科研服务团队&#xff0c;致力于以“引领表观遗传学科学研究与临床应用”为愿景&#xff0c;依托高通量测序技术和云数据分析平台&#xff0c;为医疗机构、科研机构、企事业单位等提供以表观遗传学技术为核心的多组学科研服务…

LeetCode994腐烂的橘子

题目描述 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a;值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。返回 直到单元格中没…