Mybatis基础操作

文章介绍了MyBatis中预编译SQL的优点,如提高性能和防止SQL注入,并展示了如何使用@Delete注解进行删除操作。此外,还讨论了参数占位符的使用,以及如何处理主键返回和数据封装,特别是驼峰命名规则在数据库字段和Java实体类之间的映射。最后,文章提到了条件查询的编写和模糊查询的实现方法。
摘要由CSDN通过智能技术生成

需求及步骤

在这里插入图片描述
在这里插入图片描述

环境准备

在这里插入图片描述
其实也就是入门程序的那个操作
不过虽然sql里面是
create_time 但是我们对应实体类是createTime
驼峰原则
date对应数据类型LocalDate
datetime对应数据类型是LocalDateTime

就上个快速入门操作,自己试一试
在这里插入图片描述

删除

在这里插入图片描述

实现的话就是我们根据唯一标识(id)来进行对应的删除
对应的empMapper接口
因为肯定是动态删除,用@Delete(“delete from emp where id = #{id}”)
想要获取我们传递的参数就需要这样的形式
好像涉及数据库,web的都用这些包装类

#{参数名称}来获取方法参数
@Mapper
public interface EmpMapper {
    //根据ID删除数据
    @Delete("delete from mybatis.emp where id=#{id}")
    public int delete(Integer id);//返回值代表影响记录数
}

在这里插入图片描述

我们测试一下,在test里面测试一下,先从后往前删吧,删一下16

@SpringBootTest
@SpringBootTest
class SpringbootMybatisCrudApplicationTests {
    @Autowired
    private EmpMapper empMapper;

    @Test
    public void testDelete(){
        int delete =empMapper.delete(16);
        System.out.println(delete);
    }

}

操作前数据库的表
在这里插入图片描述

操作后数据库的表
在这里插入图片描述

第16条数据成功删除,且成功的输出了1(1条记录受影响)

预编译sql语句

在这里插入图片描述
配置下日志
这样会把mybatis的操作输出到控制台
在这里插入图片描述
运行下,红框部门就是我们对应运行的sql和对应参数
最终16或代替?(也就是id=16)
这个delete from emp where id = ? 语句也有一个专业的名字-预编译sql
在这里插入图片描述

预编译sql优点

在这里插入图片描述

性能更高

说性能之前先了解
sql语句是怎么执行的
sql语句执行发送个mysql数据服务器后
1.语法检查2.优化sql3.编译sql
会把优化编译后的SQL放入缓冲(一块内存区域)中
下一次再执行sql会检查缓存,如果有就不同进行前三步操作可以直接执行
没有还需要先执行前三步操作

在这里插入图片描述
像非预编译sql,每个语句就是一次(因为 1 2 3明显不一样)
而预编译sql
是在执行sql时候用参数替代?
而且显然?是同一个
不用多次执行前三步操作,只需要最后把?替换即可

防止sql注入

sql注入是什么
在这里插入图片描述
怎么样算登陆成功
根据账号(username)和密码(password)
如果查询到了对应数据就算成功
在这里插入图片描述

如果结果>0登陆成功(有对应数据),如果结果=0登陆不成功(因为没有对应数据)
但是这样可以sql注入

username=随意吧
password='or'1'=1

在这里插入图片描述
!!!!!!妙啊
这样的话
where (username=‘…’ and password=‘’)or (‘1’=‘1’)
它相当于两个条件,而后面那个条件必定是满足的,所以无论如何都可以登陆
而当是预编译的时候
username=? and password=?
你把参数换进去
就是

username=? password=?
替换后
会把整个字符串传给?,是个参数传个?,而不是拼接
可能有的同学觉得一样
其实是不一样的,因为
传过去会用转义符把引号之类的视为纯文本!!!

传过去会用转义符把引号之类的视为纯文本
预编译防止SQL注入的原理就是将敏感字符转义成普通字符

两种不同的参数占位符(面试)

项目一般用#{}
在这里插入图片描述
使用${id},这种就不属于预编译sql了
的话就是直接将参数拼接到里面
相当于运行的是delete from emp where id =16
而不是

delete from emp where id =?
再用16替换?

在这里插入图片描述

新增

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
可以看到其实就是个insert语句呗

新增员工
写参数的时候
我们可以最直接那么多参数封装到emp里面
就不用一个一个写了

但是#{参数}
里面对应的是参数名而不是sql里面的名字
所以我们用的是emp类里面的属性名
deptId 而不是 dept_id
在这里插入图片描述
所以我们传值的时候要构造员工对象
对里面的属性进行set再进行传值
在这里插入图片描述
测试
在这里插入图片描述
为什么是id是18
好像自增长会算上删除的数据

主键返回功能

注解
@Options(keyProperty="id",useGeneratedKeys=true)
后面那个参数代表要获取对应的主键
前面那个keyPorperty代表把获取的参数封装到emp的id属性

在这里插入图片描述
注解的参数谁先后无所谓
在这里插入图片描述

封装到位了后
再进行id的输出就可以知道对应的主键了
在这里插入图片描述

更新

在这里插入图片描述

在这里插入图片描述
修改数据根据主键id进行修改
update_time上面没写但也要修改的
正常的写语句
在这里插入图片描述
测试
在这里插入图片描述

查询

根据ID查询

正常写语句
注意返回值是Emp类对象
在这里插入图片描述
测试
在这里插入图片描述
在这里插入图片描述

这里可以发现奥,那个deptId是null
因为他们的名字不同Java中是驼峰命名数据库中是下划线,所以查询出来为null

下面就来了解一下mybatis的数据封装

mybatis的数据封装(驼峰映射)

在这里插入图片描述
在这里插入图片描述

那怎么解决这种可能封装不进去的问题呢
1.给sql的字段起别名(3常用)
在这里插入图片描述

dept_id deptId,create_time createTime,update_time updateTime
这样让别名和属性名保持一致即可

这样就可以成功封装
2.通过@Results,@Result注解手动映射封装(3常用)
在这里插入图片描述
对应的column是表中的字段名,property是类中的属性名
3.开启mybatis的驼峰命名自动映射的开关!!!(常用)
可以自动将那a_cloumn字段自动封装到aColumn属性当中
在这里插入图片描述

#开启mybatis的驼峰命名自动映射开关 a_column ------> aCloumn
mybatis.configuration.map-underscore-to-camel-case=true

so我们起属性一般是驼峰
起字段名一般是下划线

条件查询

在这里插入图片描述

在这里插入图片描述

编写sql注意
1.返回值
2.#{}不能在’'(单引号)里面用,要使用${}
3.模糊查询前后都有%(匹配多个字符的标志)
在这里插入图片描述
但是这样肯定不行
我们可以用一个函数来解决这个问题
concat函数

contact('hello','world')
就会拼接处helloworld
如果弄成contact('%',#{name},'%');
这样就可以了,#{}就不会在单引号里面了

在这里插入图片描述

参数说明(和版本相关)

就用springboot1和单独用mybatis
需要在某个参数前加上@Param(‘名称’)
这个名称和那个sql语句的名称对应
(因为正常编译不保存那个参数名,springboot2内置了个编译插件来进行形参名的保存)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小袁拒绝摆烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值