JavaWeb学习——mybatis

目录

一、入门学习

1、什么是mybatis?

2、入门使用

3、配置SQL提示

4、数据库连接池

5、lombok

二、基础操作学习

1、删除

2、新增

3、更新

4、查询

三、XML配置文件

1、映射规范

2、示例代码展示

四、动态SQL

1、学习

2、学习

3、学习

4、学习


一、入门学习

1、什么是mybatis?

        MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

2、入门使用

        mybatis可以在IDEA上使用,学习创建方式和额外的多项配置,引入SQL环境,每次创建mybatis项目后,都得进行一定的环境配置。

        上面提供的图片是一个用户信息数据库连接创建的mybatis例子,而右边2中的数据库连接四要素则要在application.properties文件里添加。

3、配置SQL提示

        在IDEA的使用中,我们编写Select、Update、Delete等SQL形式的注解时,里面的内容一般不会自动识别显现的,所以要配置SQL提示,能大幅提高代码编写效率。

        而在初步配置SQL提示后,我们会发现已有select、update等功能词汇的提示,但涉及数据库信息的不会出现,这时就得引入数据库。       

4、JDBC

        JDBC是Java Database Connectivity的缩写,它是一组用于Java编程语言中连接和操作数据库的API。JDBC API定义了一组标准接口,使Java应用程序能够与任何关系型数据库进行交互,如Oracle、MySQL、PostgreSQL、Microsoft SQL Server等。

        JDBC的作用是允许Java应用程序通过JDBC API与数据库进行通信,以实现对数据库的管理和查询。JDBC API支持创建连接、执行SQL语句、事务处理、元数据检索等操作,这些操作对于任何Java应用程序来说都是必要的。

        通过选择各大厂商的JDBC库,可以获取实现数据库执行的各种jar包。

        在了解JDBC的大致作用后,我们就该考虑JDBC的使用方法,接下来将给出一个图片比较JDBC的以前使用版本以及现在学习mybatis后使用的简易版本。

        在上图中,右边的是繁杂版本,如果只是小型项目且修改内容少的话,确实可以胜用,但如果是大项目且要进行多次更迭的话,还是左边的更好。

4、数据库连接池

        什么要用连接池:
        对于一个简单的数据库引用,用于对数据库的访问不是很频繁,这种情况可以简单的在需要访问数据库时,创建一个链接,用完关闭它,这样做不会有太明显的性能上的开销。但是对于复杂的数据库引用,情况就截然不同了,频繁的建立、关闭连接,会极大的减低系统的性能,这是对于连接的使用造成系统性能的瓶颈。
        连接池的作用:
        连接池的作用是为了提高性能,避免重复多次的打开数据库连接而曹诚性能的下降和系统资源的浪费;连接池是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对数据库进行访问。这样省略了创建和销毁的过程。这样以提高系统的性能。

        并且数据库选择的连接池有很多类型,比如IDEA默认的Hikari、阿里的Druid。

        如果我们想切换依赖的数据库连接池,可以进行依赖添加。

5、lombok

        Lombok是一个java库,可以自动插入到你的编辑器和构建工具中,让你的java变得更加简单。再也不用写其getter、setter、equals等方法,只需要一个注解,你的类就可以拥有一个功能齐全的javaBean。

        因此我们引入了lombok之后,可以实现各种类的简易功能实现。

二、基础操作学习

1、删除

SQL语句代码:

delete from 表名 where 条件;

下面是一个删除表emq中指定id的信息例子:

delete from emq where id=1;

这是接口实现的方法:

//根据ID删除数据@Delete("delete from emq where id=#{id}")public void delete(Integer id);//在test里的Java文件里实现运行
package com.itheima;import com.itheima.mapper.EmpMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class SpringbootMybatisCrudApplicationTests {@Autowiredprivate EmpMapper empMapper;@Testpublic void testDelete(){empMapper.delete(1);//System.out.println(id);}}

补充:

        注:上面两种占位符的使用平时偏向于使用#,而$则很少使用,因为#具有更高的安全保护性,为预编译类型。

2、新增

        后续的对比例子使用的是同一个表emq,在此展示新增用户信息的代码。

SQL方式:

-- 插入数据
insert into emq(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)values ('Tom','汤姆',1,'1.jpg',1,'2005-01-01',1,now(),now());

接口实现方式:

 //插入数据@Insert("insert into emq(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)\n" +"                values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updatetime})")public void insert(Emp emp);//想要实现此接口和上面的test里编写代码实现位置相同,后续填写即可

        注意:在这上面我们不难发现有的变量名不完全一样,这是因为接口实现中,如果SQL形式里出现create_time这样的,对应的就得以驼峰命名法表示,结果为createTime。

补充:

        上面的代码中还差主键返回的设置,因为在运行后现实的情况中无法确认主键的值,所以要有主键返回。

代码展示:

//插入数据@Options(useGeneratedKeys = true,keyProperty = "id")//获取返回的主键@Insert("insert into emq(username, name, gender, image, job, entrydate, dept_id, create_time, update_time)\n" +"                values (#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updatetime})")public void insert(Emp emp);

3、更新

SQL方法:

-- 更新数据
update emq set username='',name='',gender='',image='',job='',entrydate='',dept_id='',update_time='' where id='';

接口实现方法:

//更新员工信息@Update("update emq set username=#{username},name=#{name},gender=#{gender},image=#{image},\n" +"               job=#{job},entrydate=#{entrydate},dept_id=#{deptId},update_time=#{updateTime} where id=#{id};")public void update();

4、查询

根据ID查询员工信息

SQL方法:

-- 查询员工信息
select *
from emq where id='';

接口实现方法一:

//根据id查询员工//原始代码@Select("select *\n" +"from emq where id=#id;")public Emp getById(Integer id);//出现问题:有的返回内容为null,因为存在dept_id和deptId不同的字段

在得到的结果上出现了问题,那么我们来解决。

接口实现方法二:

//根据id查询员工
//方法一:给字段起别名,让别名与实体类属性一致@Select("select id, username, password, name, gender, image, job, entrydate, " +"dept_id deptId, create_time createTime, update_time updateTime\n" +"from emq where id=#id;")public Emp getById(Integer id);

接口实现方法三:

    //根据id查询员工
//方法二:通过Results,@Result注解手动映射封装@Results({Selec@Result(column = "dept_id",property = "deptId"),@Result(column = "create_time",property = "createTime"),@Result(column = "update_time",property = "updateTime")})@Select("select *\n" +"from emq where id=#id;")public Emp getById(Integer id);

接口实现方法四:开启mybatis的驼峰命名自动映射开关

在application.properties里添加 mybatis.configuration.map-underscore-to-camel-case=true

补充:多重条件查询

方式一:

SQL:

-- 条件查询员工
select *
from emq where name like '%张%' and gender=1 and entrydate between '2010-01-01' and '2020-01-01' order by update_time desc ;

接口实现:

//条件查询员工@Select("select *\n" +"from emq where name like '%${name}%' and gender=#{gender} and " +"entrydate between #{begin} and #{end} order by update_time desc ;")public List<Emp> list(String name, Short gender, LocalDateTime begin,LocalDateTime end);

        但是上面的接口实现方式存在安全问题,在此就要使用concat了。

方式二:

SQL:

-- 条件查询员工
select *
from emq where name like concat('%','张','%') and gender=1 and entrydate between '2010-01-01' and '2020-01-01' order by update_time desc ;

接口实现:

进行安全改造@Select("select *\n" +"from emq where name like concat('%',#{name},'%') and gender=#{gender} and " +"entrydate between #{begin} and #{end} order by update_time desc ;")public List<Emp> list(String name, Short gender, LocalDateTime begin,LocalDateTime end);

三、XML配置文件

1、映射规范

2、示例代码展示

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.itheima.mapper.EmpMapper"><sql id="commonSelect">select id, username, password, name, gender, image, job, entrydate, dept_id ,create_time ,update_timefrom emq;</sql><update id="update2">update emq<set><if test="username != null">username=#{username},</if><if test="name != null">name=#{name},</if><if test="gender != null">gender=#{gender},</if><if test="image != null">image=#{image},</if><if test="job != null">job=#{job},</if><if test="entrydate != null">entrydate=#{entrydate},</if><if test="dept_id != null">dept_id=#{deptId},</if><if test="update_time != null">update_time=#{updateTime}</if></set>where id = #{id};</update><!--    collection: 遍历的集合-->
<!--    item: 遍历出来的元素-->
<!--    separator: 分隔符-->
<!--    open: 遍历开始前拼接的SQL片段-->
<!--    close:遍历结束后拼接的SQL片段--><delete id="deleteById">deletefrom emq where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete><select id="list" resultType="com.itheima.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 entrydate between #{begin} and #{end}</if></where>order by update_time desc;</select></mapper>

四、动态SQL

1、<if>学习

<if>代表的就是SQL里的if作用

示例代码:

<select id="list" resultType="com.itheima.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 entrydate between #{begin} and #{end}</if></where>order by update_time desc;</select>

2、<update>学习

<update>的作用相当于SQL里的update

代码示例:

<update id="update2">update emq<set><if test="username != null">username=#{username},</if><if test="name != null">name=#{name},</if><if test="gender != null">gender=#{gender},</if><if test="image != null">image=#{image},</if><if test="job != null">job=#{job},</if><if test="entrydate != null">entrydate=#{entrydate},</if><if test="dept_id != null">dept_id=#{deptId},</if><if test="update_time != null">update_time=#{updateTime}</if></set>where id = #{id};</update>

3、<foreach>学习

<foreach>在动态SQL里与in结合使用

代码示例:

<!--    collection: 遍历的集合-->
<!--    item: 遍历出来的元素-->
<!--    separator: 分隔符-->
<!--    open: 遍历开始前拼接的SQL片段-->
<!--    close:遍历结束后拼接的SQL片段--><delete id="deleteById">deletefrom emq where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete>

4、<sql> <include>学习

作用:

        <sql>封装SQL语句简写select 和 insert语句, <include>根据id在查询和新增语句中调用<sql>标签中的语句。

        <sql>标签中的id 唯一对应<include>标签中的refid。

代码展示:

<sql id="commonSelect">select id, username, password, name, gender, image, job, entrydate, dept_id ,create_time ,update_timefrom emq;</sql><select id="list" resultType="com.itheima.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 entrydate between #{begin} and #{end}</if></where>order by update_time desc;</select>

上面提供的代码便是一个基础的使用方法

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

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

相关文章

Django文件上传

【图书介绍】《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 《Django 5企业级Web应用开发实战&#xff08;视频教学版&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 本节主要介…

算法力扣刷题记录 六十三【回溯章节开篇】

前言 开始回溯章节学习。 在二叉树中预先体会了回溯。那么回溯单独来说是怎么回事&#xff1f; 一、基础知识学习 回溯基础知识参考链接 二、组合问题 2.1题目阅读 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答…

【C++入门(上)】—— 我与C++的不解之缘(一)

前言&#xff1a; 学完C语言和初阶数据结构&#xff0c;感觉自己又行了&#xff1f; 接下来进入C的学习&#xff0c;准备好接受头脑风暴吧。 一、第一个C程序 C 的第一个程序&#xff0c;梦回出学C语言&#xff0c;第一次使用C语言写代码&#xff1b;这里使用C写第一个C代码。 …

对优先级队列(堆)的理解

目录&#xff1a; 一. 优先级队列&#xff1a; 二. 优先级队列的模拟实现&#xff1a; 三.常用接口介绍: 一. 优先级队列&#xff1a; 1 概念&#xff1a; 队列是一种先进先出的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队列时…

Linux系统目录结构

Linux系统下一切皆文件 &#xff01;&#xff01;&#xff01; 系统启动必须: /boot : 存放启动Linux时所需的内核文件&#xff0c;包括压缩后的内核镜像文件(vmlinuz)、虚拟文件系统镜像文件(initrd.img)、启动引导grub的配置文件。/etc : 系统全局配置文件&#xff0c;会影…

从Excel高手到SQL大师-解锁数据分析的无限潜力 -10分钟读懂职场必备技能

目录 Excel 和 SQL&#xff1a;看似相似却大不相同的数据处理利器Excel vs SQL&#xff1a;表面相似&#xff0c;本质迥异Excel&#xff1a;直观但受限的电子表格SQL&#xff1a;强大而灵活的数据库查询语言 从 Excel 到 SQL&#xff1a;跨越鸿沟Excel 数据筛选SQL 数据筛选 结…

基于 Kafka 的经验:AutoMQ 和 MinIO 如何解决成本和弹性挑战

Apache Kafka 因其出色的设计和强大的功能而成为流式处理的事实标准。它不仅定义了现代流式处理的架构&#xff0c;而且其独特的分布式日志抽象还为实时数据流处理和分析提供了前所未有的功能。Kafka 的成功在于它能够满足高吞吐量和低延迟的数据处理需求&#xff0c;多年来&am…

论文阅读:Most Probable Densest Subgraphs

摘要 本文提出了一种在不确定图中发现最有可能稠密子图&#xff08;MPDS&#xff09;的新方法。不确定图中的每条边都有存在概率&#xff0c;使得计算稠密子图变得複杂。作者定义了稠密子图概率&#xff0c;并证明了计算该概率是#P难的。为了解决这个问题&#xff0c;设计了基…

数据科学 - 数据预处理 (数据清洗,结构化数据)

1. 前言 数据清洗与结构化数据在数据分析和机器学习项目中扮演着至关重要的角色。随着大数据时代的到来&#xff0c;数据的质量、准确性和可用性成为决定项目成功与否的关键因素。 数据清洗提高数据质量&#xff0c;保证数据集的一致性&#xff1b;促进数据分析与挖掘&#xf…

【大数据开发语言Scala的入门教程】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🪁Scala 🪡Scala是一种功能丰富且具有强大表达能力的静态类型…

【2024蓝桥杯/C++/B组/传送阵】

题目 问题代码 #include<bits/stdc.h> using namespace std;const int N 1e610; int n; int porter[N]; int ans; int sign[N]; bool used;void dfs(int now, int cnt) {if(sign[now] && used){ans max(ans, cnt);return;}if(!sign[now]){cnt, sign[now] 1; …

成为git砖家(8): 使用 git log 查询范围内的 commit

文章目录 1. 查询 git log 的文档2. 不带任何参数: git log 啥意思&#xff1f;3. git log 最主要功能是什么&#xff1f;4. git log <commit1>..<commit2> 什么意思5. 查看最近n次commit6. References 1. 查询 git log 的文档 git help log --web市面上针对 git …

ubuntu sudo命令不需要密码

sudo vim /etc/sudoers1、注释掉 %sudo ALL(ALL:ALL) AL 2、添加 用户名 ALL(ALL:ALL) NOPASSWD:ALL保存&#xff0c;退出即可

NineData云原生智能数据管理平台新功能发布|2024年7月版

本月发布 12 项更新&#xff0c;其中性能优化 3 项、功能优化 8 项、安全性发布 1 项。 1. 性能优化 数据复制 - SQL Server 增量性能优化 调整读取和写入方式&#xff0c;让 SQL Server 增量复制的性能轻松达到 5000 RPS 以上。 数据复制 - Doris|SelectDB|StarRocks 性能优…

链式二叉树的实现

文章目录 &#x1f3af;引言&#x1f453;链式二叉树的实现1.链式二叉树的结构2.链式二叉树相关操作实现2.1源码展示2.2函数实现详解2.2.1前中后序遍历2.2.2二叉树的其他方法实现2.2.3二叉树的层序遍历和判断是否是完全二叉树 &#x1f947;结语 &#x1f3af;引言 欢迎来到Ha…

【多模态大模型】 BLIP-2 in ICML 2023

一、引言 论文&#xff1a; BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models 作者&#xff1a; Salesforce Research 代码&#xff1a; BLIP-2 特点&#xff1a; 该方法分别使用冻结的图像编码器&#xff08;ViT-L/…

全球氢钎焊市场规划预测:未来六年CAGR为3.4%

随着全球制造业的持续发展和消费者对高质量产品的需求增加&#xff0c;氢钎焊作为一种高效的焊接技术&#xff0c;正逐渐受到市场的广泛关注。本文旨在通过深度分析氢钎焊行业的各个维度&#xff0c;揭示行业发展趋势和潜在机会。 【市场趋势的演变】 1. 市场规模与增长&#…

C++自定义接口类设计器之可对称赋值三

关键代码 QStringList newLines;for (const auto& line : lines) {auto equalIndex line.indexOf("");if(-1 ! equalIndex) {// a b; 赋值auto var line.mid(0, equalIndex).trimmed();auto value line.mid(equalIndex 1).trimmed();if(value.endsWith(&quo…

【网络安全】副业兼职日入12k,网安人不接私活就太可惜了!

暑假来了&#xff0c;很多同学后台私信我求做兼职的路子&#xff0c;这里&#xff0c;我整理了一份详细攻略&#xff0c;请大家务必查收&#xff0c;这可能会帮你把几个学期的生活费都赚够&#xff01; Up刚工作就开始做挖漏洞兼职&#xff0c;最高一次赚了12k&#xff0c;后面…

STM32Cubemx在FreeRTOS中使用面向对象的方式使用串口

文章目录 前言一、创建FreeRTOS工程二、创建文件对串口进行封装三、代码编写总结 前言 本篇文章将带大家来学习使用面向对象的方式在FreeRTOS中使用串口&#xff0c;使用面向对象的方法非常适合编写可移植性强的代码&#xff0c;那么这篇文章就带大家来看一下这个代码要怎么写…