- 准备
- 创建一个新的springboot工程,选择引入对应的起步依赖(mybatis、mysql驱动、lombok)
- application.properties中引入数据库连接信息(复制过来即可)
- 准备数据库表 emp,及对应的实体类 Emp(实体类属性采用驼峰命名)
新建一个pojo包,在包下面创建Emp
- 准备Mapper接口 EmpMapper
定义一个Mapper的包,在包下面建EmpMapper接口
- 根据主键删除案例
- 在接口中写sql语句
- 在测试中对其进行测试
注意:@Mapper 也可以控制反转,所以在测试当中就直接可以依赖注入了
三、日志输出
四、预编译SQL
优点:
- 性能更高
- 防止SQL注入
性能高:
使用#{}是不写死数据,便于传输,他可以在内存中缓存一段时间,如果遇到有相同语法的代码进来就会直接使用,不需要重新编译,这个过程就是预编译SQL语句了
如果直接写死由于参数传入的不同,那么我们每次都需要编译一次,这样会大大影响效率。
预编译SQL,编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条insert语句时,SQL语句一样,不会再次编译。 只是输入的参数不同。
防止SQL注入:
SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。密码采用:’or’ ‘1’=1’这种形式
将敏感字进行转义,安全。
五、参数占位符
在Mybatis中提供的参数占位符有两种:${...}, #{...}。
1). #{...}
执行SQL时,会将#{…}替换为?,生成预编译SQL,会自动设置参数值。
使用时机:参数传递,都使用#{…}
2). ${...}
拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题。
使用时机:如果对表名、列表进行动态设置时使用。
注意事项:
在项目开发中,建议使用#{...},生成预编译SQL,防止SQL注入安全。
- 新增案例:
(1)在接口中写sql语句
(2)在测试中对其进行测试
- 新增(主键返回)
含义:在数据添加成功后,需要获取插入数据库数据的主键。如:添加菜品口味
实现:
在mapper接口对应的方法上面写上一个@Options注解
注意:只能用于返回主键,无论定义的什么拿到的数据都是主键对应的数据
- 更新
九、查询(根据ID查询)
而在测试的过程中,我们会发现有几个字段(deptId、createTime、updateTime)是没有封装上的
原因如下:
- 实体类属性名 和 数据库表查询返回的字段名一致,mybatis会自动封装为实体类。
- 如果实体类属性名 和 数据库表查询返回的字段名不一致,不能自动封装。
解决方法有三个:
方法一:取别名,在SQL语句中,对不一样的列名起别名,别名和实体类属性名一样。
方法二:手动结果映射:通过 @Results及@Result 进行手动结果映射。
方法三:开启驼峰命名(推荐):如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射。
- 开启驼峰命名自动映射,即从经典数据库列名 a_column 映射到经典 Java 属性名 aColumn。
- mybatis.configuration.map-underscore-to-camel-case=true
- 要使用驼峰命名前提是 实体类的属性 与 数据库表中的字段名严格遵守驼峰命名。
十、查询(根据条件查询)
在员工管理的列表页面中,我们需要根据条件查询员工信息,查询条件包括:姓名、性别、入职时间
- 姓名:要支持模糊匹配
- 性别:要求精确匹配
- 入职时间:要求进行范围查询
- 并且最后要求根据修改时间进行倒序排序
方式一:
这种方式使用 $ 进行字符串拼接,这种方式呢,由于是字符串拼接,并不是预编译的形式,所以效率不高、且存在sql注入风险。
方式二、
Concat()是数据库的字符串拼接函数
十一、Mybatis动态SQL
(1)XML映射文件
使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就是将SQL语句写在XML配置文件中。
SQL映射配置文件的是需要符合一定的规范的:
- XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下。(同包同名)
- XML映射文件的namespace属性为Mapper接口全限定名一致。
- XML映射文件中sql语句的id与Mapper 接口中的方法名一致,并保持参数类型和返回值类型一致。