文章目录
需求及步骤
环境准备
其实也就是入门程序的那个操作
不过虽然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内置了个编译插件来进行形参名的保存)