MyBatis框架基础

文章目录

  • 1 MyBatis概述
  • 2 MyBatis入门
    • 2.1 相关依赖
    • 2.2 properties配置文件
    • 2.3 预编译SQL
  • 3 基本操作
    • 3.1 新增操作
    • 3.2 删除操作
    • 3.3 更新操作
    • 3.4 查询操作
  • 4 动态SQL
    • 4.1 XML映射文件
    • 4.2 if/set/where标签
    • 4.3 foreach标签
    • 4.4 sql/include标签
  • 5 参考资料


1 MyBatis概述

MyBatis是一款优秀的持久层(即数据访问层)框架,它支持定制化SQL、存储过程避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解来配置和映射原生信息,将接口和Java对象映射成数据库中的记录。

官网:https://mybatis.org/mybatis-3/zh/index.html


2 MyBatis入门

2.1 相关依赖

创建Spring Boot工程,并导入MyBatis Framework、MySQL Driver。

    <dependencies><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>3.0.3</version><scope>test</scope></dependency></dependencies>

Lombok工具包:通过注解的形式自动生成构造器、getter、setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率。

  1. @Data = @Getter + @Setter + @ToString + @EqualsAndHashCode:为所有的属性提供get方法、set方法,生成易阅读的 toString 方法,自动重写 equals 方法和 hashCode 方法。

  2. @NoArgsConstructor:为实体类生成无参的构造器方法。

  3. @AllArgsConstructor:为实体类生成除了static修饰的字段之外带有各参数的构造器方法。

        <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>

2.2 properties配置文件

在Spring Boot项目中,可以编写application.properties文件配置数据库连接信息,包括driver-class-name、url 、username,password。同时可以根据需要进行其他配置。

# 数据库连接信息
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
spring.datasource.username=root
spring.datasource.password=1234# 将MyBatis日志输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl# 自动将下划线命名的字段名按驼峰命名规则映射
mybatis.configuration.map-underscore-to-camel-case=true

2.3 预编译SQL

编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条语句时,不会再次编译,只是输入的参数不同。同时能将敏感字进行转义,保障SQL的安全性,防止SQL注入。

在Mybatis中提供的参数占位符有两种:${…} 、#{…}

  1. #{…}:执行SQL时,会将#{…}替换为 ? ? ?,生成预编译SQL,会自动设置参数值,一般用于参数传递,项目开发中更推荐使用。

  2. ${…}:拼接SQL,直接将参数拼接在SQL语句中,存在SQL注入问题,如果对表名、列表进行动态设置时使用。


3 基本操作

3.1 新增操作

@Mapper注解:MyBatis框架中的注解,用于标注数据访问层的接口。

@Insert注解:用于编写INSERT操作的SQL语句。

@Options注解:可以用于设置缓存时间或为对象生成自增的主键值。

@Mapper
public interface EmpMapper {@Options(useGeneratedKeys = true,keyProperty = "id")@Insert("INSERT INTO emp(username, name, gender, job, entry_date, dept_id, create_time, update_time) "+"VALUES(#{username},#{name},#{gender},#{job},#{entryDate},#{dept},#{createTime},#{updateTime})")void insertEmp(Emp emp);
}

3.2 删除操作

@Delete注解:用于编写DELETE操作的SQL语句。

@Mapper
public interface EmpMapper {@Delete("DELETE FROM emp WHERE id=#{id}")void deleteEmpById(Integer id);
}

3.3 更新操作

@Update注解:用于编写UPDATE操作的SQL语句。

@Mapper
public interface EmpMapper {@Update("UPDATE emp SET username=#{username},name=#{name},image=#{image},update_time=#{updateTime} WHERE id=#{id}")void updateEmp(Emp emp);
}

3.4 查询操作

@Select注解:

@Mapper
public interface EmpMapper {@Select("SELECT id, username, password, name, gender, image, job, entry_date, dept_id, create_time, update_time FROM emp WHERE id=#{id}")Emp selectEmpById(Integer id);
}

4 动态SQL

4.1 XML映射文件

实现复杂的SQL功能,建议使用XML来配置映射语句,在Mybatis中使用XML映射文件方式开发,需要符合一定的规范:

  1. XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在Resource中相同包下;

  2. XML映射文件的namespace属性为Mapper接口全限定名一致;

  3. XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。

在这里插入图片描述

4.2 if/set/where标签

<if>:用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。

<if test="条件表达式">要拼接的sql语句
</if>

<where>:只会在子元素有内容的情况下才插入WHERE子句,而且会自动去除子句的开头的AND或OR。

<set>:动态的在SQL语句中插入SET关键字,并会删掉额外的逗号。

EmpMapper.java

@Mapper
public interface EmpMapper {void updateEmp2(Emp emp);
}

EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.mapper.EmpMapper"><update id="updateEmp2">UPDATE emp<set><if test="username!=null">username=#{username},</if><if test="name!=null">name=#{name},</if><if test="image!=null">image=#{image},</if><if test="updateTime!=null">update_time=#{updateTime}</if>WHERE id=#{id}</set></update></mapper>

4.3 foreach标签

<foreach>:遍历集合内的参数并进行拼接。

<foreach collection="集合名称" item="集合遍历出来的元素/项" separator="每一次遍历使用的分隔符" open="遍历开始前拼接的片段" close="遍历结束后拼接的片段">
</foreach>

EmpMapper.java

@Mapper
public interface EmpMapper {void deleteEmpByIds(List<Integer> ids);
}

EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.mapper.EmpMapper"><delete id="deleteEmpByIds">DELETE FROM emp WHERE id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete></mapper>

4.4 sql/include标签

<sql>:定义可重用的SQL片段。

<include>:通过属性refid,指定包含的SQL片段。

EmpMapper.java

@Mapper
public interface EmpMapper {void updateEmp2(Emp emp);
}

EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.example.mapper.EmpMapper"><sql id="commonSelect">SELECT id, username, password, name, gender, image, job, entry_date, dept_id, create_time, update_timeFROM emp</sql><select id="selectEmpByCondition" resultType="com.example.pojo.Emp"><include refid="commonSelect"/><where><if test="name!=null">name LIKE CONCAT('%',#{name},'%')</if><if test="gender!=null">AND gender=#{gender}</if><if test="begin!=null and end!=null">AND entry_date BETWEEN #{begin} AND #{end}</if>ORDER BY update_time DESC</where></select></mapper>

5 参考资料

黑马程序员JavaWeb开发教程-bilibili

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

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

相关文章

每日复盘-202406019

今日关注&#xff1a; 20240619 六日涨幅最大: ------1--------300868--------- 杰美特 五日涨幅最大: ------1--------300462--------- 华铭智能 四日涨幅最大: ------1--------300462--------- 华铭智能 三日涨幅最大: ------1--------300462--------- 华铭智能 二日涨幅最大…

IntelliJ IDEA软件下载安装手册:从官方下载到配置启动全流程详解(Windows版)

一、访问官方下载页面 首先&#xff0c;您需要通过官方渠道访问IntelliJ IDEA的下载页面。在您的浏览器中输入官方网址&#xff1a; https://www.jetbrains.com/idea/download/&#xff0c;进入官方下载页面。 二、选择合适的版本下载 在官方下载页面&#xff0c;您将看到多…

Linux虚拟机安装nginx并进行浏览器访问 - 附带常见问题和常用指令(实施必备)

1、Linux安装Nginx 1.1、下载Nginx安装包 Linux Nginx-1.25.5 官方其他版本 1.2、解压安装包 tar -zxvf nginx-1.25.5.tar.gz 1.3、安装依赖包 由于我使用的是1.25.5版本&#xff0c;所以需要加入依赖包 # yum install pcre pcre-devel # yum install zlib-devel 1.4、配置…

[linux] 系统的基本使用

用户系统&#xff1a; 之前提到&#xff0c;linux是个多用户系统&#xff0c;所以要使用linux&#xff0c;首先你得是个用户 用户&#xff1a;普通用户管理员 每一个用户有自己的用户名密码&#xff0c; 会话(session):一个终端使用服务器的全过程 从你用户登录&#xff0c;到你…

Office--加载宏-CS上线

免责声明:本文仅做技术交流与学习... 目录 关于宏上线的格式: 操作流程: 其他office文本的上线格式一样: 关于宏上线的格式: doc宏病毒: 1-生成格式为dotm 只要点启用宏就上线 2-生成格式为()word 97-2003 .doc) 被杀 操作流…

关于Java的一点小小知识点(杂谈)

1&#xff0c;Resource和Autowire的区别 在java代码中可以使用Autowire或者Resource注解方式进行装配&#xff0c;这两个注解的区别是&#xff1a; Autowire默认按照类型装配&#xff0c;默认情况下它要求依赖对象必须存在如果允许为null&#xff0c;可以设置它required属性为…

JAVA实现利用phantomjs对URL页面(网页)进行转图片保存

一、前期准备 1、下载phantomjs工具 地址&#xff1a;https://phantomjs.org/download.html 解压到指定文件夹&#xff0c;后续代码要调用该工具&#xff0c;记住路径 2、准备好模板NetToPicMoban.js 用于给phantomjs提供需要执行的js&#xff0c;具体放在那看自己的需求&…

51单片机STC89C52RC——3.1 数码管静态展示

目的 让数码管在指定位置显示指定数字 一&#xff0c;STC单片机模块 二&#xff0c;数码管 2.1 数码管位置 2.2 生活中用到的数目管 红绿灯 LED数码管在生活中随处可见&#xff0c;洗衣机、电饭煲、热水器、微波炉、冰箱、这些最基本的家用电器上基本都用到了这种7段LED数…

广告权重及出价解析

由于算法一直在不断改变&#xff0c;所以公式只能作为参考&#xff0c;不过核心是不变的。一、广告权重及出价解析 链接质量分CTR分值**CR分值&#xff08;点击率*转化率&#xff09;广告质量分广告出价*链接质量分我们的出价下一名产品的广告质量评分/我们的链接质量分0.01 …

Spring Bean详解

Spring Bean作用域 默认情况下&#xff0c;所有的 Spring Bean 都是单例的&#xff0c;也就是说在整个 Spring 应用中&#xff0c; Bean 的实例只有一个 如果我们需要创建多个实例的对象&#xff0c;那么应该将 Bean 的 scope 属性定义为 prototype&#xff0c;如果 Spring 需…

嵌入式linux系统中SPI子系统验证03

今天主要给大家分享一下&#xff0c;如何使用SPI总线进行验证的方法。 第一&#xff1a;SPI验证流程 1. echo 1 > /dev / spidev3.0 2&#xff0e;逻辑分析仪抓波形 3.十六进指转化为十进制 4.ASCII字符代码表匹配 第二&#xff1a;SPI验证结果 第三&#xff1a;设备…

“论数据访问层设计技术及其应用”写作框架,系统架构设计师

论文真题 在信息系统的开发与建设中&#xff0c;分层设计是一种常见的架构设计方法&#xff0c;区分层次的目的是为了实现“高内聚低耦合”的思想。分层设计能有效简化系统复杂性&#xff0c;使设计结构清晰&#xff0c;便于提高复用能力和产品维护能力。一种常见的层次划分模…

eclipse如何导入springboot项目

打开eclipse 找到你的springboot项目 点击finish即可 test02就已经导入进去了 配置一下maven 在将那个springboot项目刷新一下即可 运行成功

得物面试:什么是零复制?说说 零复制 底层原理?(吊打面试官)

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的零复制的问题&#xff1a; 说一说Rocketmq、是如何实现每秒上百万数据的超…

【C++11】详谈隐式类型转换

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | Linux | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 C11中 隐式类型转换 的相关内容。 如果看到最后您觉得这篇文章写得…

实现跑马灯

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 跑马灯 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){Color[] colors { Color.Red, Color.Green, Color.Yellow };T…

JAVA每日作业day6.19

ok了家人们今天继续学习面向对象&#xff0c;话不多说看看今天学了什么 一.面向对象-封装 1&#xff0c;private private:私有的 权限修饰符 是一个成员修饰符&#xff0c;修饰成员变量 被private修饰的成员变量和成员方法只能在本类中使用 对外访问使用是 set XXX 和 get X…

IO流2.

字符流-->字符流的底层其实就是字节流 public class Stream {public static void main(String[] args) throws IOException {//1.创建对象并关联本地文件FileReader frnew FileReader("abc\\a.txt");//2.读取资源read()int ch;while((chfr.read())!-1){System.out…

pytorch库 02 Anaconda、Jupyter常用命令及操作

文章目录 一、Anaconda Prompt1、conda常用命令2、pip常用命令 二、Jupyter1、Jupyter常用命令及基本操作2、Jupyter代码补全插件安装 一、Anaconda Prompt 1、conda常用命令 下列命令可以在Anaconda Prompt中输入。 清屏&#xff1a; cls 查看帮助&#xff1a; conda -h 查…

海南聚广众达电子商务咨询有限公司抖音电商新引擎

在数字化浪潮席卷而来的今天&#xff0c;抖音电商作为新兴的商业模式&#xff0c;正以其独特的魅力和无限的潜力&#xff0c;引领着电子商务行业的革新与发展。海南聚广众达电子商务咨询有限公司&#xff0c;作为专注于抖音电商服务的领军企业&#xff0c;凭借其专业的团队、丰…