一.删除操作:用准备工作里的案例
1.EmpMapper接口里:源代码
package com.itheima.mapper;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface EmpMapper {
//根据ID删除数据-->需要注解@Delete
/* 删除的id不确定,因此需要定义为动态的,在调用接口里的delete方法时要用到id,
所以要传递一个参数表示id。由于是动态的,还需要
Mybatis里提供的参数占位符即#{参数名字}
*/
@Delete("delete from emp where id = #{id}")
public void delete(Integer id);
}
图片:

2.测试类里:源代码
package com.itheima;
import com.itheima.mapper.EmpMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootMybatisCrudApplicationTests {
//注入接口对象
@Autowired
private EmpMapper empMapper;
@Test
public void testDelete(){
empMapper.delete(17);
}
}
图片:

3.运行结果:id为17的员工被删除

4.扩展:
a. EmpMapper接口里的delete方法有返回值时:源代码
package com.itheima.mapper;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface EmpMapper {
//根据ID删除数据-->需要注解@Delete
/* 删除的id不确定,因此需要定义为动态的,在调用接口里的方法时要用到id,
所以要传递一个参数表示id。由于是动态的,还需要
Mybatis里提供的参数占位符即#{参数名字}-->建议该参数名字和方法形参保持一致,因为这样可读性强
*/
@Delete("delete from emp where id = #{id}")
public int delete(Integer id); //有返回值时代表一共操作了几条记录
}
图片:

b.测试类里:源代码
package com.itheima;
import com.itheima.mapper.EmpMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class SpringbootMybatisCrudApplicationTests {
//注入接口对象
@Autowired
private EmpMapper empMapper;
@Test
public void testDelete(){
int delete = empMapper.delete(17);
System.out.println(delete);//运行结果为0
/* 因为刚才已经把id为17的员工删除了,此时就无法删除了,
故操作了0条数据
如果删除id为16的员工的话,delete结果为1,因为刚才没删除id为16的员工
*/
}
}
图片:

二.总结:

三.预编译SQL:

a.无需记住,记住关键字即可,剩下的让idea提示即可:


b.源代码:
spring.application.name=springboot-mybatis-crud
#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_practice
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=1234
#配置mybatis的日志,指定输出到控制台
# 记住关键字即可
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
c.运行结果:出现了执行的SQL语句


?代表参数占位符:最终在运行时会用下面的参数替换掉上面的?(本例中是16替换?)
Updates录入的是操作了几条记录。
四.预编译SQL的优势:



登录界面攻击:
未攻击前:密码或者用户名输入错误都会攻击失败

攻击后:

此时条件始终为true,用户名怎么输都是对的,密码输入'or'1'='1-->运行结果就是所有用户都被查询出来

因此用预编译SQL可以防止被攻击。
-->#{参数名称}这个占位符最终生成的就是预编译SQL
五.参数占位符:

第二个参数占位符在运行时不会被?替代,而是直接拼接:此时不是预编译SQL-->性能低,也可能被攻击

377

被折叠的 条评论
为什么被折叠?



