JavaWeb学习——mybatis

news2024/11/16 1:04:33

目录

一、入门学习

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 {

    @Autowired
    private EmpMapper empMapper;

    @Test
    public 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 mapper
        PUBLIC "-//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_time
        from 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">
        delete
        from 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">
        delete
        from 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_time
        from 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.coloradmin.cn/o/1975485.html

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

相关文章

TCP/IP协议:互联网通信的基础

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【深度学习】【框架】【基本结构】激活函数

1. relu 2. softmax 3. sigmoid 4. silu 函数&#xff1a;f(x) x * sigmoid(x) 优点&#xff1a; 它既有 ReLU&#xff08;Rectified Linear Unit&#xff09;激活函数的一些优点&#xff08;例如&#xff0c;能够缓解梯度消失问题&#xff09;&#xff0c;又能解决 ReLU …

JavaEE---Spring MVC(2)

5.传递数组 当请求中参数是多个的时候,浏览器就会封装成一个数组 下面是在postman中返回的值 6.传递集合 运行的时候报错了,状态码是500,表示此时是服务器的错误,我们去查看后端源码发现 默认封装的是数组而不是List接口 修改方式: 此时我们就拿到了列表的值 状态码是HT…

文案生成器有哪些?4款为你一键生成原创文案

大家好&#xff01;今天来分享一波超级实用的干货——文案生成器&#xff01;在今天这个信息爆炸的时代&#xff0c;咱们无论是打理社交媒体&#xff0c;还是搞广告宣传等等&#xff0c;对优质文案的需求那是与日俱增。可有时候&#xff0c;灵感枯竭、时间紧迫&#xff0c;怎么…

测试类型分类

前言&#x1f440;~ 上一章我们介绍了如何设计一个测试用例&#xff0c;接下来我们对测试类型进行分类以便更好的了解和分清不同测试测试的内容、对象、时间点等 按照测试对象划分 界面测试&#xff08;也称UI测试&#xff09; 可靠性测试 容错性测试 文档测试 兼容性测…

vue2怎么上传文件夹,并展示文件夹内的图片?

我使用的是element-ui组件库,发现el-upload组件并不能满足需求,于是用原生实现一下,这里贴一下关键代码,如果大家有更好的实现方法,欢迎分享!! 实现效果:

Jangow-1.0.1靶机

一、安装Jangow: 1.0.1靶机 下载靶机&#xff0c;导入到virtualBox里面 开机可以看到&#xff0c;他已经给出了靶机的IP地址&#xff0c;就不用我们自己去探测了 二、信息收集 扫描靶机的端口 首先访问80端口 扫描目录也就是一个site 点击site&#xff0c;来到以下界面 发现…

进阶SpringBoot之自动装配原理

pom.xml&#xff1a; spring-boot-dependencies -> spring-boot-starter-parent spring-boot-dependencies&#xff1a;核心依赖在父工程&#xff0c;引入依赖时不需要指定版本 启动器&#xff1a;SpringBoot 的启动场景 <dependency><groupId>org.springfra…

机器学习练手(二):基于KMeans的股票分类

总结&#xff1a;本文为和鲸python 可视化探索训练营资料整理而来&#xff0c;加入了自己的理解&#xff08;by GPT4o&#xff09; 原活动链接 在前一关我们学习了逻辑回归&#xff0c;学会如何训练模型、数据基础性分析、如何处理空值等操作&#xff0c;下面我们开始新的一关…

AI+生命科学第二课:入门RNA和特征学习 【Datawhale AI夏令营】

教程链接&#xff1a;Task2&#xff1a;深入理解赛题&#xff0c;入门RNN和特征工程 打卡;https://linklearner.com/activity/12/4/4 在大佬讲解的基础上&#xff0c;带上一些我自己的理解 分析训练流程 从原始特征到输入模型 初始数据转换为tensor后&#xff0c;将x通过fo…

【C++】初识引用

目录 概念引用的五大特性引用在定义时必须初始化一个变量可以有多个引用一个引用可以继续有引用引用了一个实体就不能再引用另一个实体可以对任何类型做引用(包括指针) 引用使用的两种使用场景做参数交换两数单链表头结点的修改 做返回值优化传递返回值 常引用权限放大这时候进…

【前端学习笔记二】CSS基础二

一、颜色模型 1.颜色设置 颜色名称 https://www.w3schools.com/colors/colors_names.asp 这里是一些颜色的名称&#xff08;关键字&#xff09;&#xff0c;比如red、black、green等&#xff0c;可以直接指定名称来设置颜色。名称不区分大小写。 color:red;transparent tr…

OCC 网格化(三)-网格划分算法原理

目录 一、简介 二、基本原理 三、工作流程 四、BRepMesh模块与网格化流程 4.1 BRepMesh 主要组件 4.2 工作流程 4.3 网格生成示例 五、关键参数总结 一、简介 BRepMesh_IncrementalMesh 是一种基于迭代细分的网格划分算法,通过设置线性偏转和角偏转参数,可以生成高精…

利用Python爬虫实现数据收集与挖掘

Python爬虫通常使用requests、selenium等库来发送HTTP请求&#xff0c;获取网页内容&#xff0c;并使用BeautifulSoup、lxml等库来解析网页&#xff0c;提取所需的数据。 以下是一个简单的Python爬虫示例&#xff0c;用于从某个网页上抓取数据&#xff1a; import requests …

免费【2024】springboot 大学生志愿者管理系统的设计与实现

博主介绍&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…

Executing an update/delete query,解决Hibernate更新数据库报错

问题描述 在使用Hibernate更新数据库中一条记录时,发送如下错误: javax.persistence.TransactionRequiredException: Executing an update/delete query at org.hibernate.internal.AbstractSharedSessionContract.checkTransactionNeededForUpdateOperation(AbstractShare…

HCIA基础回顾

OSI参考模型 OSI&#xff08;Open System Interconnect&#xff09;参考模型&#xff0c;即为开放式系统互连参考模型。 应用层&#xff1a;人机交互&#xff0c;提供网络服务。 表示层&#xff1a;将逻辑语言转换为二进制语言&#xff0c;定义数据格式。 会话层&#xff1…

Linux 安装gradle

1.下载 下载地址&#xff1a; 下载地址&#xff1a; Gradle | ReleasesFind binaries and reference documentation for current and past versions of Gradle.https://gradle.org/releases/ 2. 解压 unzip gradle-7.6.2-all.zip 3.修改配置文件 #1.进入配置文件 vim /etc/…

【探索Linux】P.44(数据链路层 —— 以太网的帧格式 | MAC地址 | MTU | ARP协议)

阅读导航 引言一、认识以太网二、以太网的帧格式三、MAC地址四、MTU五、ARP协议温馨提示 引言 在深入探讨了网络层的IP协议之后&#xff0c;本文将带领读者进一步深入网络的底层——数据链路层。我们将详细解析以太网的帧格式&#xff0c;这是数据链路层传输数据的基本单元&am…

漏洞复现:Apache solr

目录 漏洞简述 环境搭建 漏洞复现 漏洞检测 漏洞修复 漏洞简述 Apache Solr是一个开源的搜索服务&#xff0c;使用Java编写、运行在Servlet容器的一个独立的全文搜索服务器&#xff0c;是Apache Lucene项目的开源企业搜索平台。 该漏洞是由于没有对输入的内容进行校验&…