Mybatis介绍
什么是mybatis?
● Mybatis是作用于持久层的框架,用于简化JDBC的开发。 (是Apache的一个开源项目)
快速入门
以前我们是在图形化客户端工具中编写SQL查询代码,发送给数据库执行,数据库执行后返回操作结果。
图形化工具会把数据库执行的查询结果,使用表格的形式展现出来
现在使用Mybatis操作数据库,就是在Mybatis中编写SQL查询代码,发送给数据库执行,数据库执行后返回结果。
实例:编写入门程序,并进行测试
步骤:
1、准备工作,创建springboot工程、数据库表user、实体类User
2、引入Mybatis的相关依赖、配置Mybatis(数据库连接信息)
3、编写SQL语句(注解/XML)
步骤1:工程结构、表结构创建命令以及实体类代码如下:
步骤2:相关依赖如下,记得刷新Maven,连接数据库,数据库名Mybatis
步骤3:properties文件修改了很久 ,按这个格式可以跑通,可以在控制台查看六条信息
附:可以在IDEA中配置 SQL语句的自动填充,按以下步骤操作即可。
JDBC介绍
详细知识可以专门去学。
JDBC VS Mybatis
优势1:JDBC将连接信息写入代码,变动就要修改代码,Mybatis将其写入properties中方便配置
优势2:JDBC需要手动获取字段,Mybatis全是自动封装
优势3:JDBC需要频繁获取连接关闭连接造成资源浪费,Spring会将Mybatis的连接放入连接池
Mybatis需要关注的两个方面:
总结:JDBC是SUN公司开发的一套操作关系型数据库的API(规范),各数据库厂商来提供对应的实现,这套实现通常被叫做数据库的驱动,比如mysql。由于JDBC操作起来繁琐且效率低下,所以市面上出现了类似Mybatis这样的持久层(dao层)框架,对JDBC程序实现封装,从而简化开发。
数据库连接池
● 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
● 它允许应用程序重复使用一个现有的数据库连接(提前创立多个连接对象),而不是再重新建立一个
● 释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗漏
优势:
● 资源复用
● 提升系统响应速度
● 避免数据库连接遗漏
标准接口:Datasource
● 官方提供的数据库连接池接口,由第三方组织实现此接口
● 功能:获取连接
常用连接池:Druid(德鲁伊)、Hikari(springboot默认)
如何切换Druid数据库连接池
1.在pom.xml中添加依赖(springboot3添加以下代码)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.8</version>
</dependency>
2.在application.properties中配置信息
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/Mybatis
#连接数据库的用户名
spring.datasource.username=zimo
#连接数据库的密码
spring.datasource.password=0428
#切换druid连接池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
lombok
● Lombok是一个实用的Java类库,能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率。
首先需要引入lombok的依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
一个实体类的构建对象可简化为如下:
package com.itheima.pojo;
import lombok.*;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Integer id;
private String name;
private Short age;
private Short gender;
private String phone;
}
注意事项:Lombok会在编译时,自动生成对应的java代码,我们使用lombok时,还需要安装一个lombok的插件(idea自带)
Mybatis基础操作(核心)
准备工作
● 准备数据库表 emp
● 创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、 lombok)
● application.properties中引入数据库连接信息
● 创建对应的实体类 Emp(实体类属性采用驼峰命名)
● 准备Mapper接口EmpMapper
根据主键删除员工
在前端页面点击删除按钮后,前端给服务端发送请求,删除数据,数据库删除数据时,需要获取该数据的唯一标识(主键id),所以前端发送请求时会将唯一标识(主键id)传递过来。
在EmpMapper接口中定义delete方法,同时在上方添加@Delete注解,其中SQL语句中的 #{}为字符串插值匹配id值
日志输出
可以在application.properties中,打开mybatis的日志,并指定输出到控制台。
# 指定mybatis输出日志的位置,输出控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
打开日志后运行可以得到如下红框内容,为预编译SQL,?为实际传入的参数的占位符
预编译SQL
参数占位符(${...}是拼接,会有SQL注入的风险)
新增员工
注意:接口方法中#{...}的属性名必须和Emp中变量名相同,不然会报错
示例:
主键返回
描述:在数据添加成功后,需要获取插入数据库数据的主键
示例:
由于我前几次因为插入了相同的数据,主键产生了冲突,但是默认情况下,数据表中ID列是自增的,所以ID并不连续。
更新员工信息
示例:
更新id为18的员工数据
查询员工信息
根据ID查询
示例:
我们发现,有三个数据,deptId,createTime,updateTime 在数据表中是有值的,但是在输出中却为null,它们没有被封装起来
数据封装
● 实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装
● 如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装
所以我们知道了,这三个数据 实体类属性名和数据库表查询返回字段不一样,我们有以下几种方法解决此问题:使用第三种就行,但是要严格遵循驼峰命名规范(数据库字段名a_column,类中的属性名aColumn)
条件查询
参数名说明
XML配置文件
● XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)
● XML映射文件的namespace属性为Mapper接口全限定名一致
● XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。
XML映射文件
● MybatisX是一款基于IDEA的快速开发Mybatis的插件,为效率而生
● 安装
使用Mybatis的注解,主要是来完成一些简单的增删改查功能,入宫需要实现复杂的SQL功能,建议使用XML来配置映射语句
Mybatis动态SQL
随着用户输入或外部条件的变化而变化的SQL语句,我们称之为动态SQL
之前的查询语句,只能输入所有带条件字段才能查询,现在用动态SQL可以实现不用输入全部字段,即可进行查询。
通过 if 条件改造
标签
<if>
用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。
<if test="name!=null">
name like concat('%',#{name},'%')
</if>
动态更新员工信息
<set>:动态地在行首插入SET关键字,并会删除掉额外的逗号(用在update语句中)
<foreach>
<sql><include>
主要是用来将多个字段封装起来。sql标签负责公共的字段的抽取,include标签表示引用