[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>
多表查询 

使用多表查询获取一对多,使用List来接收多个对象.但注意xml中的返回类型是单个对象的类型 

Mapper

List<BookVO> get(String name);

XML 

<select id="get" resultType="com.example.demo.model.VO.BookVO">select title,author_id,name from books left join Users on books.author_id = Users.id where Users.name = #{name};
</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遍历一样.

传输数组进行调试

预处理后的样子:

 

TIPS:

在后端类的属性与数据库中字段名不相同时,可以在SQL语句中使用as为字段起别名

<select id="getId" resultType="com.example.demo.model.Book">select author_id as authorID,title,content from books where title = #{title};</select>


 

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

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

相关文章

第7讲:VBA中利用FIND的代码实现单值查找实例

【分享成果&#xff0c;随喜正能量】心真如&#xff0c;随缘生起一切法&#xff0c;一切法还归于真如。《大乘起信论》讲心真如门就是体&#xff0c;心生灭门就是相用&#xff0c;心生灭、心真如都从一心而起&#xff0c;离开心别无二法。我们想从心真如门修行不易进入&#xf…

基于PHP+MySQL的家教平台

摘要 设计和实现基于PHP的家教平台是一个复杂而令人兴奋的任务。这个项目旨在为学生、家长和教师提供一个便捷的在线学习和教授平台。本文摘要将概述这个项目的关键方面&#xff0c;包括用户管理、课程管理、支付处理、评价系统、通知系统和安全性。首先&#xff0c;我们将建立…

【JVM】双亲委派模型

双亲委派模型 1. 什么是双亲委派模型2. 双亲委派模型的优点 1. 什么是双亲委派模型 提到 类加载 机制&#xff0c;不得不提的一个概念就是“双亲委派模型”。 双亲委派模型指的就是 JVM 中的类加载器如何根据类的全限定名找到 .class 文件的过程 类加载器: JVM 里面专门提供…

小谈设计模式(6)—依赖倒转原则

小谈设计模式&#xff08;6&#xff09;—依赖倒转原则 专栏介绍专栏地址专栏介绍 依赖倒转原则核心思想关键点分析abc 优缺点分析优点降低模块间的耦合度提高代码的可扩展性便于进行单元测试 缺点增加代码的复杂性需要额外的设计和开发工作 Java代码实现示例分析 总结 专栏介绍…

正态分布的概率密度函数|多种正态分布检验|Q-Q图

正态分布的概率密度函数&#xff08;Probability Density Function&#xff0c;简称PDF&#xff09;的函数取值是指在给定的正态分布参数&#xff08;均值 μ 和标准差 σ&#xff09;下&#xff0c;对于特定的随机变量取值 x&#xff0c;计算得到的概率密度值 f(x)。这个值表示…

ISP图像信号处理——平场校正介绍以及C++实现

参考文章1&#xff1a;http://t.csdn.cn/h8TBy 参考文章2&#xff1a;http://t.csdn.cn/6nmsT 参考网址3&#xff1a;opencv平场定标 - CSDN文库 平场校正一般先用FPN(Fixed Pattern Noise)固定图像噪声校正,即暗场校正&#xff1b;再用PRNU(Photo Response Non Uniformity)…

Bug:elementUI样式不起作用、Vue引入组件报错not found等(Vue+ElementUI问题汇总)

前端问题合集&#xff1a;VueElementUI 1. Vue引用Element-UI时&#xff0c;组件无效果解决方案 前提&#xff1a; 已经安装好elementUI依赖 //安装依赖 npm install element-ui //main.js中导入依赖并在全局中使用 import ElementUI from element-ui Vue.use(ElementUI)如果此…

百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 预测部署简介与总览

1. 预测部署简介与总览 本章主要介绍PP-OCRv2系统的高性能推理方法、服务化部署方法以及端侧部署方法。通过本章的学习&#xff0c;您可以学习到&#xff1a; 根据不同的场景挑选合适的预测部署方法PP-OCRv2系列模型在不同场景下的推理方法Paddle Inference、Paddle Serving、…

MySQL学习笔记25

逻辑备份 物理备份 在线热备&#xff1a; 真实案例&#xff1a; 数据库架构是一主两从&#xff0c;但是两台从数据库和主数据不同步。但是每天会全库备份主服务器上的数据到从服务器上。需要解决主从不同步的问题。 案例背后的核心技术&#xff1a; 1、熟悉MySQL数据库常见…

Linux--进程间通信之命名管道

目录 前言概念命名管道的创建命名管道特性 命名管道通信建立连接资源处理 Client && Server通信总结 前言 上一篇文章介绍匿名管道的进程间通信只适合在具有血缘关系的进程间进行通信&#xff0c;但是如果我们想让两个不相关的进程实现通信&#xff0c;使用匿名管道显…

Kafka:安装与简单使用

文章目录 下载安装windows安装目录结构启动服务器创建主题发送一些消息启动消费者设置多代理集群常见问题 工具kafka tool 常用指令topic查看topic删除topic 常见问题参考文献 下载安装 下载地址&#xff1a;kafka-download windows安装 下载完后&#xff0c;找一个目录解压…

notepad++配置python2环境

&#xff08;1&#xff09;python2版本下载&#xff1a;Index of /ftp/python/2.7.8/https://www.python.org/ftp/python/2.7.8/ &#xff08;2&#xff09; 配置notepad环境 1.打开Notepad&#xff0c;点击“插件”-“插件管理器”&#xff0c;在“可用”选项卡中&#xff0c…

前言技术 VScode + 其他插件-2

一、扩展插件 1.1 chinese 作用&#xff1a;使得软件变成中文显示 1.2 prettier 作用&#xff1a;格式化代码 需要多重配置&#xff1b;看视频 第一步&#xff1a;安装 第二步&#xff1a;软件设置 第三步&#xff1a;查询 save , 修改保存时自动对齐格式&#xff0c;打✔…

【软考】系统集成项目管理工程师(五)项目立项管理【5分】

一、 项目建议书 1、定义 项目建议书又称为立项申请&#xff1b;建设单位向上级主管部门提交项目申请时所必须的文件&#xff0c;是对拟建项目提出的框架性的总体设想&#xff1b;是项目发展周期的初始阶段&#xff0c;是国家或上级主管部门选择项目的依据&#xff0c;也是可行…

WordPress外贸建站Astra免费版教程指南(2023)

在WordPress的外贸建站主题中&#xff0c;有许多备受欢迎的主题&#xff0c;如AAvada、Astra、Hello、Kadence等最佳WordPress外贸主题&#xff0c;它们都能满足建站需求并在市场上广受认可。然而&#xff0c;今天我要介绍的是一个不断颠覆建站人员思维的黑马——Astra主题。 …

Hudi第二章:集成Spark

系列文章目录 Hudi第一章&#xff1a;编译安装 Hudi第二章&#xff1a;集成Spark 文章目录 系列文章目录前言一、安装Spark1、安装Spark2.安装hive 二、spark-shell1.启动命令2.插入数据3.查询数据1.转换DF2.查询 3.更新4.时间旅行5.增量查询6.指定时间点查询7.删除数据1.获取…

linux Mysql 8.0.16 安装搭建

文章目录 Mysql 搭建一、安装包下载二、创建用户组用户和修改权限三、配置my.cnf Mysql 搭建 一、安装包下载 mysql 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 这里有所有的mysql的版本&#xff0c;下载自己需要的版本&#xff0c;我们这里下载 …

视频高效剪辑,批量调整视频速度,让视频更加精彩

你是否曾经需要调整多个视频的速度&#xff0c;但却苦于手动操作效率低下&#xff1f;如果你也遇到了这样的问题&#xff0c;那么是时候采取行动&#xff0c;使用一款高效易用的视频处理工具了。 首先&#xff0c;我们要进入好简单批量智剪&#xff0c;并在板块栏里选择“任务…

搭建自己的搜索引擎之五

一、前言 接上文 搭建自己的搜索引擎之四&#xff0c;下面继续介绍茴香豆茴字的另外两种写法。 二、Jest Jest是ES的Java Http Rest客户端&#xff0c;它主要是为了弥补以前ES自有API缺少HttpRest接口客户端的不足&#xff0c;但因为现在ES官方已经提供了RestClient ,该项目已…

cJSON.c 在mfc中编译失败报 lnk2005错误

问题一、在MFC工程中导入cJson.c 编译时报以下错误&#xff1a; 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C1853 “x64\Release\xxx.pch”预编译头文件来自编译器的早期版本&#xff0c;或者预编译头为 C 而在 C 中使用它(或相反) xxx …