[JAVAee]MyBatis

目录

MyBatis简介

MyBatis的准备工作 

框架的添加

连接数据库字符串的配置

MyBatis中XML路径的配置

​编辑 MyBatis的使用

各层的实现 

进行数据库操作

增加操作

拓展 

修改操作

删除操作

查询操作 

结果映射

单表查询

多表查询 

like模糊查询

动态SQL

 

 /


MyBatis简介

MyBatis是基于JDBC的一个工具框架,能够更好帮助程序与数据库进行交互,也能更方便的进行数据库中数据的存储与读取.

MyBatis是一个ORM(Object Relational Mapping)框架,ORM即是对象关系映射.在编程语言中,将关系型数据库中的数据与对象建立映射关系,更方便的完成数据与对象间的转换.

一般的ORM映射关系:

 在加入了Mybatis的项目中,一般会为一张表创建一个类并进行映射,就使得像平常操作对象一般操作数据库中的数据.

MyBatis的准备工作 

框架的添加

在项目中添加Mysql数据库与MyBatis相关的框架.

如果是老的项目可以使用EditStarters插件进行添加 

连接数据库字符串的配置

在项目的配置文件中对数据库的连接进行配置,此处使用的是yml类型的配置文件.主要是作用是将项目与数据库能够进行连接.

记得对URL中的目标数据库进行修改.

spring:datasource:url: jdbc:mysql://localhost:3306/test1?characterEncoding=utf8&useSSL=false #连接数据库的地址username: root #数据库的用户名password: #数据库的密码driver-class-name: com.mysql.cj.jdbc.Driver

 将上述代码放置到yml配置文件中

注意事项 :

 检查mysql-connector-java的版本号,如果是 5.x 之前的使⽤的“com.mysql.jdbc.Driver”,如果是⼤于 5.x使⽤的是“com.mysql.cj.jdbc.Driver”

MyBatis中XML路径的配置

在resources的目录下创建一个目录(此处我命名为mybatis).

并在项目的配置文件中将刚刚创建的目录添加到mybatis的xml路径

最终配置文件大致为:

 MyBatis的使用

 一般的业务的后端开发思路为:

 我们只要跟着上面的开发思路来写代码就好了.

注意:

下面所创建的所有类都要跟启动类放到同一个文件夹之中.

各层的实现 

创建实体类

映射到一个数据库中的表.

@Data
public class User {private String name;private int age;private int id;private String sex;
}

创建Serveric类

@Service
public class UserService {@AutowiredUserMapper userMapper;public User getUserByName(String name){return userMapper.getUserByName(name);}
}

创建Controller类

@Controller
public class UserController{@AutowiredUserService userService;public User getUserByName(String name){return userService.getUserByName(name);}
}

创建Mapper

Mapper的组成为接口+XML

@Mapper
public interface UserMapper {User getUserByName(@Param("name") String name);//使用Param注解,将接口方法中的参数设置成为xml中传输的参数(不写也可以,写了更严谨可以尽量避免出现bug)
}

在之前的配置文件中配置mybatis的xml的目录中创建一个对应的xml 

(将下面的代码拷贝,更改对应的mapper标签中的namespace.在mapper标签中写上对应的sql语句)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati
s.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.Mapper.UserMapper"><!--    sql语句的实现-->
</mapper>

mapper标签中需要指定namespace属性,表示命名空间,为mapper接口的全限定名(包名+类名)去指定一个mapper. 

进行数据库操作

对应表的创建语句:

create table Users(name varchar(15),age int,id int primary key auto_increment,sex varchar(6));

在MyBatis中的SQL语句都在XML文件中搭配对应的标签来实现.

可以在SpringBoot项目的配置文件中设置Mapper类的日志等级为debug,这样就可以在控制台中查看数据库操作的预处理语句,参数和受影响的行数了.

(此处为yml类型配置文件的语句) 

logging:level:com.example.demo.Mapper: debug  //此处是类的路径 + 日志的等级

增加操作

增加操作使用<insert>标签实现

controller类

@ResponseBody//记得添上@ResponseBody,表明返回的是一个数据而不是页面@PostMapping("/add")//POST由客户端上传数据至服务器public Integer add(@RequestBody User user){//@RequestBody标签将方法中的user参数获取请求body中的json格式return userService.add(user);}

Service类

public Integer add(User user){return userMapper.add(user);}

Mapper

最好要使用Integer做返回值噢

    //增加操作,返回受影响的行数//返回类型为Integer而不是int,是因为int的默认值为0,Integer的默认值为null//使用int就不知道语句是否对数据库造成了影响,//Integer可以区分未赋值与受影响行数为0的区别Integer add(User user);

xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati
s.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.Mapper.UserMapper"><!--sql语句的实现--><insert id="add">insert into Users(name,age,sex) values(#{name},#{age},#{sex});<!--#{}中为对象的属性--></insert>
</mapper>

可以看到返回值为受影响的行数. 

拓展 

返回受影响的行数据的主键

当我们在某些情况下想要获取对应的主键,可以在insert标签上进行设置.

useGeneratedKeys : 使用主键,默认值为false,

keyProperty : 主键的属性名为(实体类中的属性)

<insert id="add" useGeneratedKeys="true" keyProperty="id">insert into Users(name,age,sex) values(#{name},#{age},#{sex});<!--#{}中为对象的属性-->
</insert>

 然后我们就可以直接在方法中使用对象的主键属性了,先前都是默认自增值没有对其进行赋值,

@ResponseBody//记得添上@ResponseBody,表明返回的是一个数据而不是页面@PostMapping("/add")//POST由客户端上传数据至服务器public Integer add(@RequestBody User user){//@RequestBody标签将方法中的user参数获取请求body中的json格式Integer ret = userService.add(user);System.out.println("UserID为:" + user.getId());return ret;}

修改操作

使用<update>标签 

由于Controller类与Service类都大差不大就不展示啦. 

 Mapper

Integer update(User user);
<update id="update">update Users set age = #{age} where name = #{name};
</update>

删除操作

删除操作使用<delete>标签

Mapper

Integer delete(User user);
<delete id="delete">delete from Users where id = #{id};
</delete>

查询操作 

结果映射

在上述的增加,删除以及修改操作中,一般的默认的返回值为受影响的行数.但其实可以不使用映射来接收这个参数的.

但对于查询操作来说,不得不接收返回的参数,不然会进行报错.

而在MyBatis中,实现结果映射的标签一共有两种<resultType>返回类型与<resultMap>返回字典映射

<resultType>返回类型

此标签能够适用于绝大多数的场景,其中resultType表明要返回的类型.

可以是一个类,也可以的基本类型或引用类型.

其中的resultType值可以为类名,或"string"或"java.lang.String"或"int"或"java.lang.Integer"...

<select id="getNameById" resultType="java.lang.String">select name from Users where id = #{id};
</select>

因为<resultMap>标签的使用比较麻烦也以及不常用了,就不再此处介绍了

单表查询

将Controller类的标签更改为get方法,并使用表单传输信息. 

User getNameById(@Param("id") Integer id);
<select id="getNameById" resultType="com.example.demo.model.User">select name from Users where id = #{id};
</select>
多表查询 
like模糊查询

因为使用#{}会进行预处理编译,会把数据自动的加上单引号  zhangsan -> 'zhangsan'

如果直接使用模糊查询, like  '%#{name}%' 就会变成  ->  like '%'name'%' 显然是错误的,但如果使用${}字符串替换又会有sql注入的风险,

所以我们可以使用concat方法对%与参数进行连接.

<select id="getByName" resultType="com.example.demo.model.User">select * from Users where name like concat('%',#{name},'%');
</select>
动态SQL
<if>

我们之前可能在遇到过,填写个人信息表单的时候会出现非必填项.

此处就可以使用<if>标签来实现非必填项的方式

当我们填写name,age却不想写填写sex的时候,就可以使用<if>标签来拼接SQL语句

Mapper: 

Integer add2(User user);

XML: 

<insert id="add2">insert into Users(name,age<if test="sex != null">,sex</if>) values(#{name},#{age}<if test="sex != null">,#{sex}</if>);</insert>

其中<if>标签中的test属性填写的是传输参数的判断语句,sex是user对象的属性并非数据库中的字段.

如果传输的user对象中sex属性为空,则不填写<if>标签中的字符.

 对应的,因为<if>标签的作用,预处理后的语句也没有出现sex字段

 <trim>

上面的例子为单个非必填选项,那如果我每一个都是非必填呢?

因为SQL语句中字段间的分隔需要逗号来实现,所以单单依靠于<if>标签来实现是不可行的,这时候就出现了另一种标签:<trim>

<trim>标签与<if>标签搭配使用适用于多个字段都是非必填的场景.

<trim>标签中有如下属性:

  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为后缀
  • prefixOverrides:表示整个语句块要去除掉的前缀
  • suffixOverrides:表示整个语句块要去除掉的后缀  
<insert id="add2">insert into Users<trim prefix="(" suffix=")" suffixOverrides=","><if test="name != null">name,</if><if test="age != null">age,</if><if test="sex != null">sex,</if></trim><trim prefix="values (" suffix=")" suffixOverrides=","><if test="name != null">#{name},</if><if test="age != null">#{age},</if><if test="sex != null">#{sex},</if></trim></insert>

在使用<trim>标签之后可传输的数据就会变得很灵活了 

 <where>/<set>

其中还有这两个标签,其实这两个标签都是<trim>的变形

<set>也是同样的,只是<set>等价于<trim prefix="set" suffixOverrides=",">

<foreach>

对集合进⾏遍历时可以使⽤该标签。<foreach>标签有如下属性:

  • collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
  • item:遍历时的每⼀个对象
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:每次遍历之间间隔的字符串
<delete id="deleteByIds">delete from articlewhere id in<foreach collection="list" item="item" open="(" close=")" separator=",">#{item}</foreach>
</delete>

就像java里的foreach遍历一样.

传输数组进行调试

预处理后的样子:

 


 

 

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

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

相关文章

delphi 11 安装失败

delphi 11 安装遇到如下图&#xff1a; 解决方法&#xff1a; 以管理员身份重新安装&#xff01;&#xff01;&#xff01; 以管理员身份重新安装&#xff01;&#xff01;&#xff01; 以管理员身份重新安装&#xff01;&#xff01;&#xff01; 管理员身份&#xff01;&…

同城信息服务源码 本地生活服务小程序源码

同城信息服务源码 本地生活服务小程序源码 功能介绍&#xff1a; 基本设置&#xff1a;网站参数、安全设置、分站管理、支付设置、操作日志、地区设置、公交地铁、国际区号、清理缓存、模板风格、模块管理、域名管理、底部菜单、消息通知、登录设置 其他设置&#xff1a;关键…

企业年报API的应用:从金融投资到市场研究

引言 在数字化时代&#xff0c;企业年报不再仅仅是一份财务报告&#xff0c;它们变成了宝贵的信息资源&#xff0c;可用于各种商业应用。企业年报API已经改变了金融投资和市场研究的方式&#xff0c;使得从中获取数据变得更加高效和灵活。本文将深入探讨企业年报API的应用&…

箱讯科技成功闯入第八届“创客中国”全国总决赛—在国际物流领域一枝独秀

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 2023年9月26日&#xff0c;第八届“创客中国”数字化转型中小企业创新创业大赛决赛在贵州圆满收官。 经过初赛、复赛、决赛的激烈角逐&#xff0c;箱讯科技与众多强劲对手同台竞技&#xff0c;最终凭借出…

“全景江西·南昌专场”数字技术应用场景发布会 | 万广明市长莅临拓世集团展位,一览AIGC科技魅力

随着数字技术的迅猛发展&#xff0c;传统产业正在发生深刻的变革&#xff0c;新兴产业蓬勃兴起。但要想实现数字经济超常规发展&#xff0c;就要在数字产业化上培育新优势&#xff0c;大力实施数字经济核心产业提速行动&#xff0c;加快推进“一核三基地”建设。在这个数字经济…

Python接口自动化之unittest单元测试

以下主要介绍unittest特性、运行流程及实际案例。 一、单元测试三连问 1、什么是单元测试&#xff1f; 按照阶段来分&#xff0c;一般就是单元测试&#xff0c;集成测试&#xff0c;系统测试&#xff0c;验收测试。单元测试是对单个模块、单个类或者单个函数进行测试。 将访…

83、SpringBoot --- 下载和安装 MSYS2、 Redis

启动redis服务器&#xff1a; 打开小黑窗&#xff1a; C:\Users\JH>e: E:>cd E:\install\Redis6.0\Redis-x64-6.0.14\bin E:\install\Redis6.0\Redis-x64-6.0.14\bin>redis-server.exe redis.windows.conf 启动redis客户端&#xff1a; 小黑窗&#xff1a;redis-cli …

Mysql8安装+重装的数据备份方法【提供Mysql8.0.27版本的压缩包】

文章目录 Mysql8压缩安装包下载安装流程压缩包解压配置环境变量 初始化数据库连接数据库修改密码Mysql重装/重装系统 的数据库备份方法数据备份数据还原 Mysql8压缩安装包下载 压缩包下载路径 安装流程 压缩包解压 首先将压缩包解压&#xff0c;下图是解压之后的文件目录&a…

ChatGPT必应联网功能正式上线

今日凌晨发现&#xff0c;ChatGPT又支持必应联网了&#xff01;虽然有人使用过newbing这个阉割版的联网GPT4&#xff0c;但官方版本确实更加便捷好用啊&#xff01; 尽管 ChatGPT 此前已经展现出了其他人工智能模型无可比拟的智能&#xff0c;但由于其训练数据的限制&#xff…

jquery和jquery-ui拖动元素(vue2)

彩色小方块可以任意拖动&#xff0c;红色箭头指向的区域可以拖动 CDN在index.html文件中引入 <link rel"stylesheet" href"//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"><script src"https://code.jquery.com/jquery-3.6.0.min…

WebPack5高级使用总结(三)

WebPack5高级使用总结 1、提升开发体检1.1、SourceMap1.2、使用 2、提升打包构建速度2.1、HotModuleReplacement2.2、oneOf2.3、Include/Exclude2.4、Cache2.5、Thead 3、减少代码体积3.1、Tree Shaking3.2、Babel3.3、Image Minimizer 4、优化代码运行性能4.1、Code Split4.1.…

前端uniapp防止页面整体滑动页面顶部以上,设置固定想要固定区域宽高

解决&#xff1a;设置固定想要固定区域宽高 目录 未改前图未改样式改后图改后样式 未改前图 未改样式 .main {display: flex;flex-direction: row;// justify-content: space-between;width: 100vw;// 防止全部移动到上面位置&#xff01;&#xff01;&#xff01;&#xff01…

全面解读 SQL 优化 - 统计信息

一、简介 数据库中的优化器&#xff08;optimizer&#xff09;是一个重要的组件&#xff0c;用于分析 SQL 查询语句&#xff0c;并生成执行计划。在生成执行计划时&#xff0c;优化器需要依赖数据库中的统计信息来估算查询的成本&#xff0c;从而选择最优的执行计划。以下是关…

MySQL学习笔记21

MySQL逻辑备份&#xff1a; mysqldump基本备份&#xff1a; 本质&#xff1a;导出的是sql语句文件。 优点&#xff1a;无论是什么存储引擎&#xff0c;都可以用mysqldump备份成sql语句。 缺点&#xff1a;速度较慢&#xff0c;导入的时候出现格式不兼容的突发情况&#xff…

Docker 容器技术 (上) 环境安装和部署、容器镜像、使用IDEA构建Springboot程序镜像、远程仓库、容器网络管理

Docker容器技术 文章目录 Docker容器技术容器技术入门环境安装和部署从虚拟机到容器容器工作机制简述 容器与镜像初识容器镜像镜像结构介绍构建镜像发布镜像到远程仓库实战&#xff1a;使用IDEA构建SpringBoot程序镜像 容器网络管理容器网络类型用户自定义网络容器间网络容器外…

Java基础面试题精选:深入探讨哈希表、链表和接口等

目录 1.ArrayList和LinkedList有什么区别&#xff1f;&#x1f512; 2.ArrayList和Vector有什么区别&#xff1f;&#x1f512; 3.抽象类和普通类有什么区别&#xff1f;&#x1f512; 4.抽象类和接口有什么区别&#xff1f;&#x1f512; 5.HashMap和Hashtable有什么区别&…

Unity - 实践: Metallic流程贴图 转 Specular流程贴图

文章目录 目的Metallic Flow - SP - 输出输出的 MRA (MGA) 贴图 Metallic->Specular (根据教程一步一步实践)1. Base color Metallic -> Diffuse2. Base color Metallic -> Specular3. Roughness -> Glossiness输出贴图&#xff0c;在 unity 中展示&#xff1a;M…

华为数字能源,开启超充新纪元

编辑&#xff1a;阿冒 设计&#xff1a;沐由 在过去很长的一段时间里&#xff0c;国内某著名品牌火锅是从来不担心获客的。顶峰时期&#xff0c;该品牌每年服务超过1.6亿人次的顾客&#xff0c;翻台率达到了5次/天&#xff0c;几乎创下了餐饮界的最高翻台率。 翻台率是餐饮企业…

掌握 JavaScript 数组方法:了解如何操作和优化数组

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

C#中的for和foreach的探究与学习

一:语句及表示方法 for语句: for(初始表达式;条件表达式;增量表达式) {循环体 }foreach语句: foreach(数据类型 变量 in 数组或集合) {循环体 }理解 1.从程序逻辑上理解,foreach是通过指针偏移实现的(最初在-1位置,每循环一次,指针就便宜一个单位),而for循环是通