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.mzph.cn/news/842586.shtml

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

相关文章

地理信息科学专业认知与介绍

地理信息科学的背景意义在于它提供了一种解决各种空间问题的方法。随着全球化和数字化的发展&#xff0c;地理信息科学正在成为一个越来越重要的领域。它被广泛应用于城市规划、土地利用、环境保护、资源管理、农业、林业、水利、地震等领域。 专业特色 地理空间信息处理&…

突破乙肝治疗瓶颈新希望!恒瑞医药小核酸疗法领跑进入II期临床试验

近日&#xff0c;恒瑞医药的针对慢性乙型肝炎的小核酸疗法要准备开启一项多中心、随机、开放、平行设计的 II 期研究,旨在评估 HRS-5635 注射液单独或与其他药物联合治疗慢性乙型肝炎患者的疗效和安全性二期临床实验。去年开启的1期&#xff0c;今年就要准备2期实验了。 咱们国…

Java核心: Stream流的实现原理

Java 8之后我们对Stream的使用都已经习以为常了&#xff0c;它帮助我们从怎么做的细节里脱身&#xff0c;只要告诉它做什么即可。这一篇文章我们主要讲Java Stream的实现原理&#xff0c;手写一个Stream框架&#xff0c;然后再来讲解Java Stream的核心类&#xff0c;做到知其然…

vue-3d-loader 加载多个模型

需求 1、在使用three.js进行开发的过程中&#xff0c;需要列表加载多个模型&#xff0c;并根据需要多模型进行加载。 2、当鼠标移动到图片上去的时候&#xff0c;开始加载模型&#xff0c; 模型进行加载和展示。 3、在制作3d沉浸式商城时&#xff0c;需要根据需求&#xff0…

字典推导式

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 使用字典推导式可以快速生成一个字典&#xff0c;它的表现形式和列表推导式类似。例如&#xff0c;我们可以使用下面的代码生成一个包含4个随机数的字…

net.ipv4.icmp_echo_ignore_broadcasts 内核参数 ping请求超时

net.ipv4.icmp_echo_ignore_broadcasts 是 Linux 内核参数之一&#xff0c;用于控制系统是否响应发送到广播地址的 ICMP 回显请求&#xff08;ping&#xff09;。具体来说&#xff0c;当该参数的值为 1 时&#xff0c;系统将忽略发送到广播地址的 ICMP 回显请求&#xff0c;不会…

shell编程之面交互

Here Document Here Document使用注意事项 面交互 面交互修改账号密码 [rootlocalhost opt]# passwd zhangsan <<EOF > abc1234 #下面两行是输入密码 > abc1234 > EOF 更改用户 zhangsan 的密码 。 新的 密码&#xff1a;无效的密码&#xff1a;…

业务知识(Business Knowledge 业务分析能力)

背景 业务分析的胜任力模型&#xff0c;有六大部分&#xff0c;今天我们看第二部分&#xff0c;业务知识 Analytical Thinking and Problem Solving &#xff1a;分析判断及问题解决能力Behavioural Characteristics&#xff1a; 行为特质&#xff08;责任、道德、适应性等等…

贝叶斯:共轭先验(conjugacy)

共轭先验与共轭分布 在贝叶斯统计中&#xff0c;如果后验分布与先验分布属于同类&#xff0c;则先验分布与后验分布被称为共轭分布&#xff0c;而先验分布被称为似然函数的共轭先验。&#xff08;要求后验分布与先验分布是同类分布&#xff0c;不要求似然函数分布相同。&#…

红外超声波雷达测距

文章目录 一HC-SR04介绍1HC-SR04简介及工作原理 二用HAL库实现HC-SR04测量距离1STM32CubeMX配置2keil53代码的添加 三效果 一HC-SR04介绍 1HC-SR04简介及工作原理 超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等…

图像上划分网格

图像上划分网格 文章目录 图像上划分网格 # 读取图像的python库&#xff0c; 安装方法&#xff1a;pip install pillow from PIL import Image, ImageDraw import osfile_dir"C:/Users/Desktop/test_images" save_dir"C:/Users/Desktop/pic_grid" if not o…

基于Netty实现安全认证的WebSocket(wss)客户端

1.Netty服务端 服务端代码参考【基于Netty实现安全认证的WebSocket&#xff08;wss&#xff09;服务端-CSDN博客】 2.Netty客户端 客户端代码参考【基于Netty实现WebSocket客户端-CSDN博客】中两种都可以&#xff1b;这里用的是第一种。 新增SslHandler的代码&#xff1a; …

二叉树尾部分

1.二叉树的销毁 2.二叉树的层序遍历 3.判断二叉树是否为完全二叉树 4.二叉树的性质 1.二叉树的销毁 以后序的方式遍历销毁左右子数&#xff0c;因为前序和中序销毁的话根会被销毁而找不到左右子树的位置&#xff0c;后序的根访问在最后&#xff0c;可以找到左右的子树位置。…

PHP深入理解-PHP架构布局

PHP的架构布局涉及多个层次&#xff0c;让我们一起探讨一下吧&#xff01;&#x1f680; 执行流程&#xff1a;解析为Token&#xff1a;将PHP代码解析成标记&#xff08;tokens&#xff09;。抽象语法树&#xff1a;将语法解析树转换为抽象语法树。Opcodes&#xff1a;将抽象语…

RAG-GPT实践过程中遇到的挑战

引言 前面介绍了使用RAG-GPT和OpenAI快速搭建LangChain官网智能客服。有些场景&#xff0c;用户可能无法通过往外网访问OpenAI等云端LLM服务&#xff0c;或者由于数据隐私等安全问题&#xff0c;需要本地部署大模型。本文将介绍通过RAG-GPT和Ollama搭建智能客服。 RAG技术原理…

.Net Core 中间件与过滤器

过滤器这个是.Net MVC旧有的功能&#xff0c;中间件这个概念是新出的&#xff0c; ASP.NET Core只是完成了HTTP请求调度、报文解析等必要的工作&#xff0c;像检查用户身份、设置缓存报文头等操作都是在中间件中完成&#xff0c;中间件就是ASP.NET Core的一个组件&#xff0c;…

强化学习_06_pytorch-PPO2实践(Humanoid-v4)

一、PPO优化 PPO的简介和实践可以看笔者之前的文章 强化学习_06_pytorch-PPO实践(Pendulum-v1) 针对之前的PPO做了主要以下优化&#xff1a; -笔者-PPO笔者-PPO2refdata collectone episodeseveral episode(one batch)activationReLUTanhadv-compute-compute adv as one seri…

CC1链补充-LazyMap

前言 在我们上一篇中详细分析了CC1链&#xff0c;但是在CC1链中还有一条链就是LazyMap类 1.安装和CC1核心 环境安装的详情可以见上篇CC1分析的第二部分&#xff0c;环境搭建部分 两条不同的路线其实第一步核心都是相同的&#xff0c;执行类都是Tansformer接口和实现类&#…

【MySQL事务(上)】

文章目录 前言一、什么是事务&#xff1f;1.关于事务的特性 二、为什么要有事务三、事务的提交方式测试事务准备工作事务的操作1.启动事务2.对事务进行回滚&#xff08;只有在事务进行期间&#xff09;3.提交事务&#xff08;持久化&#xff09;4.事务的异常情况结论 四、事务的…

基于Java实现的归并排序算法

归并排序&#xff08;Merge Sort&#xff09;是一种典型的分治思想的应用&#xff0c;它将待排序的序列划分为若干个子序列&#xff0c;每个子序列是一个有序的序列。然后再把有序子序列合并为整体有序序列。归并排序的时间复杂度为O(nlogn)&#xff0c;是一种非常高效的排序算…