认识 MyBatis + MyBatis如何使用 (MyBatis操作数据库)


前言

本篇介绍了什么是MyBatis,MyBatis的前期配置,MyBatis操作数据库的两种方式:.xml文件 / 注释,使用MyBatis的一些注意,如有错误,请在评论区指正,让我们一起交流,共同进步!


文章目录

  • 前言
  • 1. 什么是MyBatis?
  • 2. 使用MyBatis - 前期准备
  • 3. MyBatis 操作数据库:
    • 方式一:定义接口 + 实现.xml文件(实现接口)- 实现操作数据库
    • 方式二:定义接口 + 注释 - 实现操作数据库
  • 4. 使用MyBatis注意事项
      • 获取自增主键
      • 使用like查询
  • 总结

本文开始

1. 什么是MyBatis?

MyBatis(ORM: 对象关系映射框架): 一个持久层框架,也是一个工具实现程序与数据库交互,从而更简单的操作数据库的框架;

为什么使用MyBatis ?
MyBatis 省略了复杂的JDBC操作,可以通过.xml文件的方式 或 注释的方式实现数据库的快速操作;

2. 使用MyBatis - 前期准备

在之前创建的spring boot项目上 + 添加依赖MyBatis + 它操作的数据库(MySQL Driver)

运行程序验证项目是否创建成功:

问题:直接运行MyBatis,会报错;

在这里插入图片描述

  • 原因:未设置要连接的具体MySQL信息;

解决方式:需要先配置数据库信息 + MyBatis信息;
在application.properties文件下配置:

  • 数据库连接配置:
//配置数据库连接信息
spring.datasource.url= jdbc:mysql://localhost:3306/数据库名称?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=xxx
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  • MyBatis配置保存路径 + 保存的命名格式;
//设置MyBatis的xml保存路径 和 命名格式
mybatis.mapper-locations=classpath:mybatis/*Mapper.xml
//1.classpath:根目录, mybatis : 保存文件夹名称 - 可以任意起名(resoures文件之下的文件都会生成到根目录中)
//2.命名格式作用:读取mybatis文件下所有以 Mapper.xml为后缀的文件;#配置 MyBatis 执行时打印SQL
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#配置打印MyBatis执行的SQL - 设置默认日志级别
logging.level.com.example.demo=debug

3. MyBatis 操作数据库:

方式一:定义接口 + 实现.xml文件(实现接口)- 实现操作数据库

1.接口:定义接口,方法的声明 - 给Service层调用

  • 定义接口过程:
    1.在数据持久层定义一个接口类
    2.实现定义接口 - 接口类只能定义接口,不能实现;
    3.如果接口参数需要实体类,还需要在model实体层创建对应类;
    4.实体类实现的属性,与之对应操作的数据库相应表的属性值一样;
@Mapper // MyBatis中的接口使用注释Mapper - 数据持久层标识
public interface UserMapper {//接口只声明即可List<Userinfo> getUser();
}

2.XML:实现接口,对数据库进行具体操作增删改查等等;

  • xml实现接口过程:
    1.根据定义的MyBatis XML中的命名的文件夹名称mybatis
    2.在对应的文件夹(mybatis)下创建对应的xxxMapper.xml文件;
    3.配置xml文件格式,通过namespace实现对应接口路径(也就是之前声明的文件) - 参数为包名+类名;
    4.在文件中写sql标签,select, delete等等;再为标签设置属性 id: 方法的名称, resultType: 设置对应接口的返回类型;
    5.写正常的sql语句,不用加分号;
<?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.dao.UserMapper"><select id="getUser" resultType="com.example.demo.model.Userinfo">select * from userinfo</select>
</mapper>

实现时创建的目录示例:

在这里插入图片描述

方式二:定义接口 + 注释 - 实现操作数据库

示例:注解方式实现 单表 或 多表 查询 (update,detele等等操作数据库的方式也可以)
1.定义接口: 与方法一样,在mapper / dao包地下定义接口即可;
2.写对应注释:在定义的接口上,写上要操作数据库的sql语句;

@Select("select * from articleinfo where id=#{id}")List<Articleinfo> getListByUid(@Param("id")Integer id);@Select("select a.*,u.username from articleinfo a " +"left join userinfo u on a.uid=u.id")List<Articleinfo> getAllInfo();

4. 使用MyBatis注意事项

对于参数注入有两种:${}, #{}
① ${xxx} :及时执行,不安全,会发生sql注入;
执行过程:将 ${}位置直接替换;直接执行;
② #{xxx}:预执行;安全可以防止SQL注入;
执行过程:将#{}替换为占位符 ? 并且 ?不能为sql语句;

  • 问题1:SQL注入问题: 在登录时,正常是通过正确的用户+密码,而sql注入,可以通过非法的用户+密码正确登录;

示例:查询数据库时, 输入非法密码,使用${}直接替换而产生问题;

select * from userinfo where username='${username}' and password='${password}';//输入密码为 ' or 1='1
//sql进行替换
...where username='user_name' and password='' or 1 ='1';
//判断就变为了,密码为假,但是1='1'为真,从而登录成功;

【注】${} 使用场景:业务需要传递sql命令时使用, 结果可以被穷举;

  • 问题2:MyBatis通过名称进行映射,当 类中属性数据库的表中字段名 不一致时,查询结果为null

解决方法:
1.将类中属性名称 与 数据库中表中的字段名保存一样;
2.使用sql语句 as 进行字段名重命名,字段名==属性名;
3.定义一个resultMap, 将属性名 与 字段名手动映射;
主键使用 < id > 标签,column是字段名,property是属性名;

在这里插入图片描述

获取自增主键

1.定义接口,与正常方式一样;
2.实现接口:需要设置两个属性
useGeneratedKeys: 是否开启自增;
keyConlumn: 数据库中自增的字段名称 ;
keyProerty: 数据库自增的id赋值给此属性;

 <insert id="add2" useGeneratedKeys="true" keyProperty="id">insert userinfo(username, password)values(#{username}, #{password})</insert>

使用like查询

1.定义接口:
List getLikeList(@Param(“name”)String name);
2.实现接口:使用数据库中的函数 concat 拼接参数
示例:获取的最终结果:‘%name%’

<select id="getLikeList" resultType="com.example.demo.model.User">select * from user wherename like concat('%',#{name},'%')</select>

总结

✨✨✨各位读友,本篇分享到内容如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

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

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

相关文章

idea 2023 新版ui中git的相关操作

前两个月换了新电脑&#xff0c;下了最新版的idea发现可以切换一套新的ui了 切换新ui肯定不太习惯&#xff0c;很多操作都得重新摸索一下 在这里记录几个git相关的操作 忽略我下面截图中当前项目是js的后端项目…… 切换ui 首先说一下怎么切换新旧版ui&#xff0c;我这里就…

求解n阶勒让德多项式的值

描述 用递归方法求n阶勒让德多项式的值&#xff0c;递归公式为&#xff1a; 在主函数中输入一个整数n和一个实数x&#xff0c;调用函数 legendre(n,x)&#xff0c;并输出其返回值。 输入 第一行输入一个整数n&#xff0c;表示阶数&#xff1b;第二行输入一个实数x。 输出 …

STL空间配置器入门

STL简介   STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;&#xff0c;从根本上说&#xff0c;STL是一些“容器”的集合&#xff0c;这些“容器”有list,vector,set,map等&#xff0c;STL也是算法和其他一些组件的集合。 谈及组件&#xff0c…

Kubernetes 整体架构介绍

架构图 Kubernetes 主要由以下几个核心组件组成&#xff1a; etcd 保存了整个集群的状态&#xff1b;kube-apiserver 提供了资源操作的唯一入口&#xff0c;并提供认证、授权、访问控制、API 注册和发现等机制&#xff1b;kube-controller-manager 负责维护集群的状态&#xf…

k8s概念-pv和pvc

回到目录 kubernetes存储卷的分类太丰富了,每种类型都要写相应的接口与参数才行&#xff0c;这就让维护与管理难度加大。 persistenvolume(PV) 是配置好的一段存储(可以是任意类型的存储卷) 也就是说将网络存储共享出来,配置定义成PV。 PersistentVolumeClaim(PVC)是用户pod使…

C语言数组笔试题(详解)

目录 插入知识&#xff1a; 一.指向函数指针数组的指针 二.回调函数 什么是回调函数&#xff1f; 三.数组笔试题 个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生&#x1f43b;‍❄个人主页&#xff1a;GOTXX &#x1f4…

react ant icon的简单使用

refer: 快速上手 - Ant Design 1.引入ant npm install antd --save 2.在页面引用&#xff1a; import { StarOutlined } from ant-design/icons; 如果想要引入多个icon&#xff0c;可以这样书写&#xff1a; import { UserOutlined, MailOutlined, PieChartOutlined } fr…

学习gRPC (三)

测试gRPC例子 编写proto文件实现服务端代码实现客户端代码 通过gRPC 已经编译并且安装好之后&#xff0c;就可以在源码目录下找到example 文件夹下来试用gRPC 提供的例子。 在这里我使用VS2022来打开仓库目录下example/cpp/helloworld目录 编写proto文件 下面是我改写的exa…

前端主题切换方案——CSS变量

前言 主题切换是前端开发中老生常谈的问题&#xff0c;本文将介绍主流的前端主题切换实现方案——CSS变量 CSS变量 简介 编写CSS样式时&#xff0c;为了避免代码冗余&#xff0c;降低维护成本&#xff0c;一些CSS预编译工具&#xff08;Sass/Less/Stylus&#xff09;等都支…

使用ChatGPT编写技术文档

技术文档对于任何项目都是至关重要的&#xff0c;因为它确保所有利益相关者都在同一层面上&#xff0c;并允许有效的沟通和协作。创建详细而准确的技术文档可能既耗时又具有挑战性&#xff0c;特别是对于那些不熟悉主题或缺乏强大写作技巧的人来说。ChatGPT 是一个强大的人工智…

go编译文件

1.编译go文件 go build [go文件]2.执行文件编译文件 ./demo [demo为go文件名称]

4个顶级的支持消费级硬件的NeRF软件平台

似乎每天都有大量的创新发布&#xff0c;人们很容易感到不知所措。因此&#xff0c;让我们放慢脚步&#xff0c;看看4个主流的支持消费级硬件的NeRF 平台。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 1、Instant-NGP&#xff08;Instant-NeRF&#xff09; 2022 年…