【MyBatis】MyBatis操作数据库(一)

news2024/11/17 5:50:23

目录

  • MyBatis的基础定义
    • MyBatis配置相关文件
    • 一、注解操作数据库
      • 1.1 @Insert(插入注解)
      • 1.2 @Delete(删除注解)
      • 1.3 @Update(修改注解)
      • 1.4 @Select(重点:查询注解)
      • 注解解决查询不匹配问题
      • 拓展:@Param(重命名注解)和@OPtions(自增注解)
    • 二、 XML操作数据库
      • 2.1 xml实现@Insert(插入数据)
      • 2.2 xml实现@Delete(删除数据)
      • 2.3 xml实现@Update(修改数据)
      • 2.4 xml实现@Select(重点:查询数据)
      • XML解决查询不匹配问题

MyBatis的基础定义

MyBatis是一个优秀的持久层框架,它的作用是简化jdbc的复杂操作,让我们更方便的使用数据库
持久层:用于访问数据库(Dao)的一层,都是以**mapper来命名,我的理解是@mapper与IOC中的那个数据层@repority有异曲同工之妙
@Mapper注解:表⽰是MyBatis中的Mapper接⼝程序运⾏时,框架会⾃动⽣成接⼝的实现类对象(代理对象),并给交Spring的IOC容器管理

在这里插入图片描述
思维联想:IOC的五大类注解以及@Bean方法注解,和DI中@Autiowed类型注入和@Resource方法名注入的区别。
且MyBatis操作数据库主要有两种方法

 1. 注解来操作(简单sql适用)
 2. 配置xml文件来操作(复杂sql适用)

MyBatis配置相关文件

 1. 配置MyBatis依赖和mysql的驱动
 2. 连接数据库,配置yml文件

一、想要配置MyBatis依赖和mysql的驱动,在我们创建项目时引入两个依赖即可,一个是MyBatis Fromwork,一个是Mybatis Driver。

二、连接数据库,配置yml文件,首先把application.perprity(可能拼错了哈)
在这里插入图片描述
修改成applicaton.yml文件,然后在里面添加连接数据库的配置(配置代码我放下面了)

spring:
  datasource:                         //注意,这里一定要修改成你的数据库的名称代替这里的()即可
    url: jdbc:mysql://127.0.0.1:3306/ ()?characterEncoding=utf8&useSSL=false
    username: //输入你的数据库用户名,一般默认的是root
    password: //输入你的数据库密码,如果为设置过,系统默认为空,直接写一个空串即可“”
    driver-class-name: com.mysql.cj.jdbc.Driver

一、注解操作数据库

注解来操作sql数据库的方式就是在mapper的方法上添加相关的注解来调用数据库查询,在返回查询到的数据结果

1.1 @Insert(插入注解)

在方法上添加@Insert注解,代码如下:

@Insert("insert into userinfo (id,username,password,age) values (#{id}," +
            " #{username},#{password},#{age})")
            
    public Integer  userinsert1(Integer id,String username,String password,Integer age) ;

在这里插入图片描述
大家注意了,这里的#{…}表示的是选中拿去数据值,这里建议和传入的参数名保持一致。

1.2 @Delete(删除注解)

在方法上添加@Delete注解,代码如下:

@Delete("delete from userinfo where id=#{id}")

    public Integer deleteUser(UserInfo userInfo);

1.3 @Update(修改注解)

在方法上添加@Update注解,代码如下:

 @Update("update userinfo set age=#{age} where id=#{id}")
 
    public  Integer updateUser(UserInfo userInfo);

1.4 @Select(重点:查询注解)

在方法上添加@Select注解,代码如下:

 @Select("select * from userinfo where id=#{userid}")
    public List<UserInfo> getid(Integer userid);

注解解决查询不匹配问题

关于查询不匹配问题:主要是由于数据库字段名与方法映射的名称不同,导致无法赋值而显示为null。
当⾃动映射查询结果时,MyBatis会获取结果中返回的列名并在Java类中查找相同名字的属性(忽略
⼤⼩写)
解决方法:

 1. 数据库使用as关键字重命名
 2. 使用Results进行字段映射
 3. 配置驼峰自动转换(大力推荐,简单省事儿)

一、 关于第一种方法我就不细说了,在查询时给as一下名称,使其能和参数名对应即可
二、 这里主要论述第二、种使用Results的方法,大家注意区分,它与下面使用XML方式的Result很容易混淆。
这里我简单举个栗子,大家把@Results当成中间商就可以,它是在mysql和方法参数中指定他们的映射关系,
请看接下来的代码:

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

这里可以看出来@Results相当于是一个数组,里面包含了很多个小的元素,其中每个元素通过@Result注解来指定了映射关系,如下图例子中:将delete_flag-映射给了deleteFlag、create_time映射给了createTime、update_time映射给了updateTime,这样就能使传的数据正确接收到了
在这里插入图片描述
当然,@Results中的id="resultMap"表示的是将这个方法定义一个名称为resultMap方便在下次使用该相同映射关系时可以直接调用@ResultMap注解添加该名称就可以实现和上面一样的效果。如下面的例子:

 @ResultMap(value = "resultMap")
    @Select("select * from userinfo")
    public List<UserInfo> selectUser1();

这里小总结一下:
注解中用到了@Results(类似于数组)
@Result(数组中的每个元素,其中每个元素描述了对应的映射关系)
@ResultMap(将前面数组定义好的映射关系直接拿来用)
用到了@Results,@Result ,@ResultMap,注意这里并没有用到@ResultType,这是在xml配置数据库中用到的,一定要捋清他们之间的关系

**三、**配置驼峰自动转换
直接在yml配置文件里添加即可,只要mysql的命名方式和java类型的命名遵循开发者手册中的正确命名方式就能实现自动转换,mysql应该命名为小写加下划线如:user_name,java属性类型命名为userName,在配置下就能生效。

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

拓展:@Param(重命名注解)和@OPtions(自增注解)

@Param(重命名注解)
@Parram注解有重命名和绑定参数两种特性,用法也分两种情况

1.如果传入的参数类型不是类属性只是一个变量,使用@Param则只有重命名属性,直接#{命名后的名字即可};
2.如果传入的参数类型为类属性,则不仅有重命名属性还有绑定参数的属性,在#{}时,不仅要使用重命名的名字,还要.出该类中对应的成员名

一、只有变量时
代码如下:

@Insert("insert into userinfo (username) values (#{user})")
    public Integer  userinsert2(@Param("user") String username) ;

二、有类属性时
代码如下:

 @Insert("insert into userinfo (id,username,password,age) values (#{userInfo.id}," +
            " #{userInfo.username},#{userInfo.password},#{userInfo.age})")
    public Integer  userinsert3(@Param("userInfo") UserInfo userInfo) ;

@OPtions(自增注解)
在想要拥有自增属性的方法上添加@Options注解,确定哪一个为自增主键就行了
代码如下:

@Options(useGeneratedKeys = true, keyProperty = "id")

@Insert("insert into userinfo (username, age, gender, phone) values (#{userinfo.username},#{userinfo.age},#{userinfo.gender},#{userinfo.phone})")
Integer insert(@Param("userinfo") UserInfo userInfo);
  • useGeneratedKeys:这会令MyBatis使⽤JDBC的getGeneratedKeys⽅法来取出由数据库内 部⽣成的主键(⽐如:像MySQL和SQL Server这样的关系型数据库管理系统的⾃动递增字 段),默认值:false.
  • keyProperty:指定能够唯⼀识别对象的属性,MyBatis会使⽤getGeneratedKeys的返回值或 insert语句的selectKey⼦元素设置它的值,默认值:未设置(unset)

这段代码中的自增主键是id,因此在插入数据时id会自动+1

注意:设置 useGeneratedKeys=true 之后,⽅法返回值依然是受影响的⾏数, ⾃增id 会设置在上述 keyProperty 指定的属性中

二、 XML操作数据库

XML的⽅式需要以下两步:

  1. 配置数据库连接字符串和MyBatis
  2. 持久层代码配置

一、配置数据库连接字符串和MyBatis
此步骤需要进⾏两项设置,数据库连接字符串设置和MyBatis的XML⽂件配置

spring:
  datasource:                         //注意,这里一定要修改成你的数据库的名称代替这里的()即可
    url: jdbc:mysql://127.0.0.1:3306/ ()?characterEncoding=utf8&useSSL=false
    username: //输入你的数据库用户名,一般默认的是root
    password: //输入你的数据库密码,如果为设置过,系统默认为空,直接写一个空串即可“”
    driver-class-name: com.mysql.cj.jdbc.Driver
# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis:
  mapper-locations: classpath:mapper/**Mapper.xml

该配置表示放置xml文件的包名必须是mapper命名,且xml文件的命名必须以…Mapper.xml结尾,如以下图片
在这里插入图片描述
二、 持久层配置
数据持久成的实现,MyBatis的固定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="要查询数据的包的全路径限定名">

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

这里的全路径限定名就是java 引入的package的名称+你写的类名
如:路径名"com.example.mybaties_demon.Model"+我的类名"UserInfo"
为"com.example.mybaties_demon.Model.UserInfo"
<mapper> 标签:需要指定 namespace 属性,表⽰命名空间,值为mapper接口的全限定
名,包括全包名.类名

<select> 查询标签:是⽤来执⾏数据库的查询操作的:
◦ id :是和Interface (接⼝)中定义的⽅法名称⼀样的,表⽰对接⼝的具体实现⽅法。
◦ resultType :是返回的数据类型,也就是开头我们定义的实体类.

在这里插入图片描述

2.1 xml实现@Insert(插入数据)

Xml代码实现如下:

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

其中的id名则是表示修饰的是配置这个类名中的哪一个方法

2.2 xml实现@Delete(删除数据)

Xml代码实现如下:

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

其中的id名则是表示修饰的是配置这个类名中的哪一个方法

2.3 xml实现@Update(修改数据)

Xml代码实现如下:

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

其中的id名则是表示修饰的是配置这个类名中的哪一个方法

2.4 xml实现@Select(重点:查询数据)

Xml代码实现如下:

<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>

其中的id名则是表示修饰的是配置这个类名中的哪一个方法
大家会惊讶的发现,诶,为什么会多出来一个resultType属性呢,这里表示查询结果的类型在哪一个基础包里
,因为UserInfo基本类与我们的mapper数据层路径不一致,这里需要特殊说明一下
属性ResultType主要是告诉我们查询的结果要放在那个类下面,这里就需要提供相应的类的路径了。

XML解决查询不匹配问题

解决办法和注解类似:

  1. 起别名
  2. 结果映射
  3. 开启驼峰命名

其中1,3的解决办法和注解⼀样,不再多说,接下来看下xml如果来写结果映射

<resultMap id="BaseMap" type="com.example.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="queryAllUser" resultMap="BaseMap">
	select id, username,`password`, age, gender, phone, delete_flag,
	create_time, update_time from userinfo
</select>

在这里插入图片描述

小总结一下:
前面注解中使用@Results、@Result、以及@ResultMap,并没有使用到@ResultType
且注解中的别名是有@Results注解来起别名,而@ResultMap是直接调用就行
XML中使用了@ResultMap、@Result、以及@ResultType,并没有使用到@Results
且XML中的起别名是由@ResultMap来起别名,且有@ResultMap来调用
还请注意区别注解和XML中这两种的区别,极其容易混淆

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

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

相关文章

迷你主机Esxi 6.7挂载新硬盘

背景 硬件&#xff1a;零刻SER Pro 6 系统&#xff1a;vmware Exsi 6.7.0 Update 3 现有的硬盘槽位占满了&#xff0c;但空间不够用&#xff0c;想要通过USB外接移动硬盘来进行扩容。使用了一块250G的硬盘做测试。 步骤 TL;DR # 停止usbarbitrator服务 /etc/init.d/usbarbi…

Unity2D横版摄像机跟随

在Unity2D横版游戏中&#xff0c;摄像机跟随是一个非常重要的功能。一个流畅的摄像机跟随系统可以让玩家更好地沉浸在游戏世界中。本文将介绍如何在Unity中实现2D横版摄像机跟随&#xff0c;并分享一些优化技巧。 一、准备工作 在开始实现摄像机跟随之前&#xff0c;请确保您…

分享 ASP.NET Core Web Api 中间件获取 Request Body 两个方法

不废话&#xff0c;直接上正文。_ 方法一 思路&#xff1a;利用 BodyReader 直接读取 HttpContext 的 Request Body&#xff0c;再反序列化 var reqStream context.Request.BodyReader.AsStream(); var jsonObj JsonSerializer.Deserialize<CheckAndParsingMiddlewareM…

宏集JMobile Studio—实现HMI界面高自由度设计

一、简介 物联网HMI的组态软件是数据可视化的重要工具&#xff0c;工程师可以通过图形化界面来配置、监控和管理现场采集的数据。目前&#xff0c;市面上大多数的组态软件里的可视化控件库都由设计师预先部署&#xff0c;用户只能调用而不能完全自定义控件&#xff0c;导致可视…

万界星空科技MES系统功能介绍

制造执行系统或MES 是一个全面的动态软件系统&#xff0c;用于监视、跟踪、记录和控制从原材料到成品的制造过程。MES在企业资源规划(ERP) 和过程控制系统之间提供了一个功能层&#xff0c;为决策者提供了提高车间效率和优化生产所需的数据。 万界星空科技MES 系统基础功能&am…

OpenCv之简单的人脸识别项目(登录页面)

人脸识别 一、项目准备二、登录页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件 3.运行脚本3.1定义识别脚本3.2定义提取脚本3.3定义标注脚本3.4定义人脸比对脚本3.5定义动态处理脚本3.6定义属性判断脚本 4.创建一个退出…

HTML跳动的爱心

目录 写在前面 HTML简介 跳动的爱心 代码分析 运行结果

eclipse-向Console控制台输出信息

首先这里主要用到的是org.eclipse.ui.console这个包&#xff0c;所以现在顺道先来了解一下&#xff1a; org.eclipse.ui.console是一个可扩展的console视图插件&#xff0c;利用它可以实现各种console&#xff0c;并把它们显示出来。该插件本身就实现了一个Message Console&…

2024瑜伽馆玩赚抖音,打造O2O线上线下超级门店

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89360427 更多资源下载&#xff1a;关注我。 课程介绍&#xff1a; 通过学习可以学会同城引流实操&#xff0c;通过线上放大实体门店盈利能力。清晰了解同城账号短视频的正确内容生产方向&#xff0c;并…

【记忆化搜索 】2312. 卖木头块

本文涉及知识点 记忆化搜索 LeetCode2312. 卖木头块 给你两个整数 m 和 n &#xff0c;分别表示一块矩形木块的高和宽。同时给你一个二维整数数组 prices &#xff0c;其中 prices[i] [hi, wi, pricei] 表示你可以以 pricei 元的价格卖一块高为 hi 宽为 wi 的矩形木块。 每…

如何解决 YUM源GPG密钥缺失:Public key for 猫头虎.rpm is not installed

如何解决 YUM源GPG密钥缺失&#xff1a;Public key for 猫头虎.rpm is not installed 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝…

史上最全网络安全面试题+答案

1、什么是SQL注入攻击 前端代码未被解析被代入到数据库导致数据库报错 2、什么是XSS攻击 跨站脚本攻击 在网页中嵌入客户端恶意脚本&#xff0c;常用s语言&#xff0c;也会用其他脚本语言 属于客户端攻击&#xff0c;受害者是用户&#xff0c;网站管理员也属于用户&#xf…

可视化大屏也在卷组件化设计了?分享一些可视化组件

hello&#xff0c;我是大千UI工场&#xff0c;这次分享一些可视化大屏的组件&#xff0c;供大家欣赏。&#xff08;本人没有源文件提供&#xff09;

【数据结构与算法 | 队列篇】力扣102, 107

1. 力扣102 : 二叉树的层序遍历 (1). 题 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3]…

SQL查询-电商数据案例

假设我们现在需要是某电商平台数据分析&#xff0c;由于业务需要&#xff0c;需要用sql取数 包括&#xff0c;Python连接数据库到模拟电商数据库&#xff0c;到sql场景查询 1,Python连接SQL数据库 以下是使用Python连接MySQL数据库并进行操作的示例代码&#xff1a; import…

1、C++编程概述

文章目录 一、基本概念二、数据的表示及运算计算机中数据表示进制间相互转化二进制计算规则 三、计算机数据的存储单位四、机器数和码制五、机器数运算机器数的加减运算机器数的乘除运算 面向对象编程语言把事物看成是具有属性和行为的对象&#xff0c;然后通过抽象找出属于同一…

基于 Coze 从 0-1 搭建专属 小白的Bot 机器人

基于 Coze 从 0-1 搭建专属 小白的Bot 机器人 ​ 作为一个GIS从业人员&#xff0c;对于AI的使用是必不可少的&#xff0c;在过去的一两年里各种大模型频出&#xff0c;AI技术已经成为GIS领域的一项重要工具&#xff0c;为我们提供了许多强大的功能和解决方案。看到好文章都在介…

深入了解python的关键字“break”与循环退出策略

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、break关键字的基础理解与用途 二、通过案例理解break的应用 三、总结break在编程中的实…

【刷题(12)】图论

一、图论问题基础 在 LeetCode 中&#xff0c;「岛屿问题」是一个系列系列问题&#xff0c;比如&#xff1a; 岛屿数量 &#xff08;Easy&#xff09;岛屿的周长 &#xff08;Easy&#xff09;岛屿的最大面积 &#xff08;Medium&#xff09;最大人工岛 &#xff08;Hard&…

学习Java的日子 Day48 函数,DOM

Day48 1.流程控制语句 if else for for-in(遍历数组时&#xff0c;跟Java是否一样) While do while break 语句用于跳出循环 continue 用于跳过循环中的一个迭代 2.函数 2.1 JavaScript 函数语法 函数就是包裹在花括号中的代码块&#xff0c;前面使用了关键词 function funct…