Mybatis笔记总结_mybatis连接池会连接销毁吗-程序员宅基地

技术标签: java  mybatis  mysql  Javaweb学习  

  • MyBatis是一款优秀的 持久层 框架,用于简化JDBC的开发。
  • MyBatis本是 Apache的一个开源项目iBatis,2010年这个项目由apache迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
  • 官网:https://mybatis.org/mybatis-3/zh/index.html

1. Mybatis入门

1.1 Mybatis操作数据库的步骤:

1.1.1 准备工作(创建springboot工程、数据库表user、实体类User)

创建springboot工程,并导入mybatis起步依赖和mysql驱动包
在这里插入图片描述
在这里插入图片描述

创建数据库中的表,并创建对应的实体类

1.1.2 引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)

使用图形化客户端工具,连接MySQL数据库是的配置:
在这里插入图片描述

在springboot项目中,可以编写application.properties文件,配置数据库连接信息。

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=1234
1.1.3 编写SQL语句(注解/XML)

在创建的springboot工程中,在引导类所在包下,在创建一个包mapper。

@Mapper注解:表示是mybatis中的Mapper接口

  • 程序运行时:框架会自动生成接口的实现类对象(代理对象),并给交Spring的IOC容器管理

@Select注解:代表的就是select查询,用于书写select查询语句

2 JDBC介绍

Mybatis框架,就是对原始的JDBC程序的封装。

2.1本质:

  • sun公司官方定义的一套操作所有关系型数据库的规范,即接口。
  • 各个数据库厂商去实现这套接口,提供数据库驱动jar包。
  • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。

2.2操作步骤

  1. 注册驱动
  2. 获取连接对象
  3. 执行SQL语句,返回执行结果
  4. 处理执行结果
  5. 释放资源
import com.itheima.pojo.User;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class JdbcTest {
    
    @Test
    public void testJdbc() throws Exception {
    
        //1. 注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");

        //2. 获取数据库连接
        String url="jdbc:mysql://127.0.0.1:3306/mybatis";
        String username = "root";
        String password = "1234";
        Connection connection = DriverManager.getConnection(url, username, password);

        //3. 执行SQL
        Statement statement = connection.createStatement(); //操作SQL的对象
        String sql="select id,name,age,gender,phone from user";
        ResultSet rs = statement.executeQuery(sql);//SQL查询结果会封装在ResultSet对象中

        List<User> userList = new ArrayList<>();//集合对象(用于存储User对象)
        //4. 处理SQL执行结果
        while (rs.next()){
    
            //取出一行记录中id、name、age、gender、phone下的数据
            int id = rs.getInt("id");
            String name = rs.getString("name");
            short age = rs.getShort("age");
            short gender = rs.getShort("gender");
            String phone = rs.getString("phone");
            //把一行记录中的数据,封装到User对象中
            User user = new User(id,name,age,gender,phone);
            userList.add(user);//User对象添加到集合
        }
        //5. 释放资源
        statement.close();
        connection.close();
        rs.close();

        //遍历集合
        for (User user : userList) {
    
            System.out.println(user);
        }
    }
}

2.3存在的问题

  1. 数据库链接的四要素(驱动、链接、用户名、密码)全部硬编码在java代码中
  2. 查询结果的解析及封装非常繁琐
  3. 每一次查询数据库都需要获取连接,操作完毕后释放连接, 资源浪费, 性能降低

2.4技术对比

  1. 数据库连接四要素(驱动、链接、用户名、密码),都配置在springboot默认的配置文件 application.properties中
  2. 查询结果的解析及封装,由mybatis自动完成映射封装,我们无需关注
  3. 在mybatis中使用了数据库连接池技术,从而避免了频繁的创建连接、销毁连接而带来的资源浪费。

3. 数据库连接池

3.1介绍和使用

数据库连接池是个容器,负责分配、管理数据库连接(Connection)

  • 程序在启动时,会在数据库连接池(容器)中,创建一定数量的Connection对象

允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个

  • 客户端在执行SQL时,先从连接池中获取一个Connection对象,然后在执行SQL语句,SQL语句执行完之后,释放Connection时就会把Connection对象归还给连接池。

3.2数据库连接池的好处:

  1. 资源重用
  2. 提升系统响应速度
  3. 避免数据库连接遗漏

4. lombok

Lombok是一个实用的Java类库。
常用的注解:

注解 作用
@Getter/@Setter 为所有的属性提供get/set方法
@ToString 会给类自动生成易阅读的 toString 方法
@EqualsAndHashCode 根据类所拥有的非静态字段自动重写 equals 方法和 hashCode 方法
@Data 提供了更综合的生成代码功能(@Getter + @Setter + @ToString + @EqualsAndHashCode)
@NoArgsConstructor 为实体类生成无参的构造器方法
@AllArgsConstructor 为实体类生成除了static修饰的字段之外带有各参数的构造器方法。

5. 基础操作

5.1 准备工作

创建工程项目,导入配置,除此之外,配置日志输出位置

  1. 打开application.properties文件
  2. 开启mybatis的日志,并指定输出到控制台
#指定mybatis输出日志的位置, 输出控制台

mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

5.2 预编译SQL

5.2.1 优势:
  1. 性能更高
  2. 更安全(防止SQL注入)
5.2.2 SQL注入:

SQL注入:是通过操作输入的数据来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。

5.2.3 参数占位符:
  • #{…}(推荐使用,不会出现SQL注入问题)
    • 执行SQL时,会将#{…}替换为?,生成预编译SQL,会自动设置参数值
    • 使用时机:参数传递,都使用#{…}
  • ${…}
    • 拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题
    • 使用时机:如果对表名、列表进行动态设置时使用

5.3 删除

@Delete注解:用于编写delete操作的SQL语句,一般放在mapper接口方法上
如果mapper接口方法形参只有一个普通类型的参数,#{…} 里面的属性名可以随便写,如:#{id}、#{value}。但是建议保持名字一致。

5.4 新增

5.4.1 基础新增

@insert注解:用于在mapper接口方法上来新增数据,方法接收传入的对象,然后sql语句取对象的属性与数据表中的属性一 一对应进行赋值,来实现新增数据。

5.4.2 主键返回

很多业务内容,再添加内容成功后,需要获取插入数据库数据的主键。

默认情况下,执行插入操作时,是不会主键值返回的。如果我们想要拿到主键值,需要在Mapper接口中的方法上添加一个Options注解,并在注解中指定属性useGeneratedKeys=true和keyProperty=“实体类属性名”。

5.5 更新

@update注解:用于在mapper接口方法上来更新数据,通过要更新的数据的id来找到数据,然后通过sql语句对其中的内容进行更新。

5.6 查询

5.6.1 基础查询

@select注解:在mapper接口方法上来查询数据。通过传入的参数进行数据查询,并肩查询到的数据添加到一个集合中,并将集合返回。

5.6.2 数据封装

问题:

  • 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。
  • 如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。

解决方案:

  1. 起别名
  2. 结果映射
  3. 开启驼峰命名
5.6.3 条件查询

实际业务中,查询会有多个条件,然后通过传入的条件进行查询。
例如:模糊查询,此时@select注解中的sql语句就会出现问题,容易发生sql注入的问题,此时需要借用concat方法对模糊查询的内容进行拼接。

6. MyBatis的XML文件的配置

Mybatis的开发方式有两种:

  1. 注解
  2. XML

6.1 XML配置文件规范

在Mybatis中使用XML映射文件方式开发,需要符合一定的规范:

  1. XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)
  2. XML映射文件的namespace属性为Mapper接口全限定名一致
  3. XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。

注意点:

<select>标签:就是用于编写select查询语句的。

resultType属性,指的是查询返回的单条记录所封装的类型。

6.2 XML配置文件实现

映射文件的编写:

  1. xml映射文件中的dtd约束,直接从mybatis官网复制即可
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">
<select id="list" resultType="com.itheima.pojo.Emp">
</select>
</mapper>
  1. XML映射文件的namespace属性为Mapper接口全限定名
  2. XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致

6.3 XML文件什么时候使用

结论:使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,例如:动态SQL。

7. 动态SQL

SQL语句会随着用户的输入或外部条件的变化而变化,我们称为:动态SQL

<if>:用于判断条件是否成立。

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

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

<foreach>:遍历传入的参数集合,一般是对数据进行批量操作时使用。
<foreach collection="集合名称" item="集合遍历出来的元素/项" separator="每一次遍历使用的分隔符" 
         open="遍历开始前拼接的片段" close="遍历结束后拼接的片段">
         
<sql>:定义可重用的SQL片段

<include>`:通过属性refid,指定包含的SQL片段
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/z1659079591/article/details/130754776

智能推荐

计算距离方法总结_两条线之间的欧式距离怎么算-程序员宅基地

文章浏览阅读2.5k次。欧氏距离(Euclidean Distance)欧式距离是最经典的一种距离算法,适用于求解两点之间直线的距离,适用于各个向量标准统一的情况,如各种药品的使用量、商品的售销量等。 欧氏距离也是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式。 二维空间上两点a(x1,y1)a(x_1,y_1)与b(x2,y2)b(x_2,y_2)之间的欧式距离: d12=(x1−x2)2+(y1−y_两条线之间的欧式距离怎么算

数学建模常用软件_什么软件可以分析数学建模的问题,以及给出合理的解释和分析-程序员宅基地

文章浏览阅读3.9w次,点赞78次,收藏436次。我参加过的数学建模比赛很多,除了本校的两次数学建模(二三等)外,全国数学建模(省二),亚太数学建模(s),ICM/MCM(M),五一建模联赛,电工杯(最近正在准备),之前错过mathorcup,有点遗憾。到2019年暑假前,总计自己一年左右参加7次建模比赛,说下自己建模常用的软件使用,本人在队里主要负责编程,但是写作和建模也同样会和队友交流。论文类LaTeX与WordWor..._什么软件可以分析数学建模的问题,以及给出合理的解释和分析

计算机网络原理知识_throught up速率-程序员宅基地

文章浏览阅读3k次。计算机网络原理╭第一章 计算机网络概述|第二章 网络应用|第三章 传输层|第四章 网络层内容大纲<|第五章 数据链路层与局域网|第六章 物理层|第七章 无线与移动网络╰第八章 网络安全基础第一章 计算机网络概述1.计算机网络基本概念(填空选择题)1>计算机网络定义*1.定义:1)计算机网络是 互连的、自治的 计算机的集合;互连: 是指利用通信链路链接相互独立的计算机系统;自治: 是指互连的计算机系统 彼此独立 ,不存在主从或控制与被控制的关系;2)一个计算机网络_throught up速率

html标签之视频各种标签_html 实现视频详情多tag标签-程序员宅基地

文章浏览阅读1.4k次。html标签之Object标签详解的定义和用法定义一个嵌入的对象。请使用此元素向您的 XHTML 页面添加多媒体。此元素允许您规定插入 HTML 文档中的对象的数据和参数,以及可用来显示和操作数据的代码。 标签用于包含对象,比如图像、音频、视频、Java applets、ActiveX、PDF 以及 Flash。object 的初衷是取代 img 和 applet 元素。不_html 实现视频详情多tag标签

(3)组合数学--鸽巢原理之最简单形式_鸽巢原理的三个公式-程序员宅基地

文章浏览阅读220次。定理:把n+1个物体放进n个盒子中,至少有一个盒子中含有两个物体理解:ai为第i天下的总棋盘数,显然an为递增序列,对an做部分和序列:如上图所示,上面77项,下面77项,共154项,153个盒子,所有存在aj+21 = ai,所以21 = aj - ai = bi + bi+1 + … + bj相当于19个物体,18个盒子五个点,四个三角形反证:Li <..._鸽巢原理的三个公式

Qt开发笔记之QCustomPlot:QCustomPlot介绍、编译与使用_qcustomplot编译-程序员宅基地

文章浏览阅读6.6w次,点赞20次,收藏194次。欢迎技术交流和帮助,提供所有IT相关的服务,有需要请联系博主QQ: 21497936,若该文为原创文章,未经允许不得转载原博主博客地址:http://blog.csdn.net/qq21497936本文章博客地址:http://blog.csdn.net/qq21497936/article/details/77847820目录效果 ​Demo下载地址QCustom..._qcustomplot编译

随便推点

深度优先算法(DFS)的python实现及骑士周游问题解析_用python代码写深度优先遍历算法的时间复杂度-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏21次。背景: 骑士周游问题在棋盘格里,马走日,遍历所有网格点,找到每个网格都走过,且只有一次的路径。算法实现:用于解决骑士周游问题的图搜索算法是深度优先搜索(DFS),该算法是逐层建立搜索树,沿着树的单支尽量深入的向下搜索。连接尽量多的顶点,必要时可以进行分支。深度优先搜索同样要用到顶点的“前驱”属性,来构建树或森林。另外需要设置“发现时间”和“结束时间”属性。发现时间是在第几步访问到了这个顶点(设置灰色);结束时间是在第几步完成了此顶点的探索(设置黑色)。通用的深度优先搜索算法代码:# BFS采_用python代码写深度优先遍历算法的时间复杂度

PHP4用户手册:函数->fwrite (转)-程序员宅基地

文章浏览阅读53次。PHP4用户手册:函数->fwrite (转)[@more@]fwrite(PHP 3, PHP 4 >= 4.0.0)fwrite--二进制文件写入 描述int fwrite (int fp, ..._php fwrite int 4

0 0/1 * * * ?-程序员宅基地

文章浏览阅读4.7w次,点赞6次,收藏27次。定时任务<property name="cronExpression"> <value>0 0/1 * * * ?</value><!-- [秒] [分] [时] [日] [月] [星期][年] -->年可有可不有,星期一般都写?,你可以指定第几周星期几 1#1,或者从周一到周日1/7或者本月最后一个星期一,1L,..._0 0/1 * * * ?

Python获取操作系统版本信息_python 获取当前os版本-程序员宅基地

文章浏览阅读1.3w次。 最近,想在我的YouMoney(http://code.google.com/p/youmoney/)里面增加提取用户操作系统版本信息。比如windows用户,可能要返回Windows XP ,或者Windows 2003, 苹果用户应该返回Mac OS X 10.5.8。用了很多办法,包括在mac系统里调用系统命令,取环境变量,等等。最后无意发现,原来python里里面有个platfor_python 获取当前os版本

【MaixPy快速上手】屏幕和摄像头的使用_maixpy reset failed-程序员宅基地

文章浏览阅读1.3k次。第一个程序: 使用屏幕和摄像头开发板有配套的摄像头和屏幕,请在上电前检查硬件连接是否正确然后上电,打开串口终端, 按键盘Ctrl+E,然后粘贴以下代码:import sensor, lcdsensor.reset()sensor.set_pixformat(sensor.RGB565)sensor.set_framesize(sensor.QVGA)sensor.run(1)sensor.skip_frames()lcd.init(freq=15000000)while(True)_maixpy reset failed

【系统性学习】Linux Shell易忘重点整理_shell赋值保留换行-程序员宅基地

文章浏览阅读1.1k次。本文主要基于《实用Linux Shell编程》总结,并加入一些网上查询资料和博主自己的推断。其中命令相关的,已抽取出来在另一篇中,可以一起使用。_shell赋值保留换行

推荐文章

热门文章

相关标签