目录
一、什么是 Mybaits
二、配置环境
2.1 导入 MyBatis Framework
2.2 连接 MyBatis
三、增删改查功能
3.1 创建实体类
3.2 select
3.3 delete 和 update
3.4 insert
四、SQL 注入
4.1 什么是 SQL 注入
4.2 SQL 注入代码
4.3 #{} 和 ${} 的区别
一、什么是 Mybaits
- Mybatis 是一个半 ORM(对象关系映射)持久层框架,它支持自定义 SQL、存储过程以及高级映射;
- 底层是对 JDBC 进行了封装,让数据库操作更加简单(开发人员只需编写核心SQL语句即可);
- 面对性能要求高,需求变化快的项目,MyBatis 即是开发人员的不二选择。
二、配置环境
2.1 在创建项目的时候,选择 MyBatis Framework 和 自己数据库的驱动,注意,我用的是 MySQL 数据库,这里就选择了 MySQL Driver。
2.2 在 resources 目录下创建一个 application.yml 文件 和 一个 mapper 文件夹,粘贴下面代码即可。url、 username 、password 和 配置 JDBC 创建对象时的方法一样,因为 Mybatis 底层还是对其进行封装实现的。
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/TestMybatis?characterEncoding=utf8&useSSL=false
username: root
password: 自己数据库的密码
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/**Mapper.xml
此时,运行项目的启动类来测试 Mybatis 是否连接,如果提示这行,表示配置成功。
三、增删改查功能
创建一个名为 TestMybatis 的数据库,导入测试数据表:mybatis.sql
3.1 创建实体类
属性名必须和创建的表里的字段名一致。Mybatis 提供映射标签,支持对象与数据库的 ORM 字段关系映射。
@Data
public class User {
private int id;
private String username;
private String password;
}
3.2 select
(1) 编写接口
在 demo 目录下创建一个 mapper 文件夹,进行接口的实现。
@Mapper
public interface UserMapper {
//查询所有用户
public List<User> userAll();
}
(2)编写 SQL 语句
在 resources/mapper 目录下, 创建一个 UserMapper.xml 文件进行核心代码实现,通过 xml 文件或注解的方式将要执行的各种 statement 配置起来。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
<select id="userAll" resultType="com.example.demo.model.User">
select * from user;
</select>
</mapper>
(3)测试代码
- 在刚才创建好的接口代码里,右键 Generate;
- 选择 Text,生成测试代码。
JUnit 是Java的一个开源的单元测试框架,用于编写和运行可重复的测试。JUnit 5是JUnit的下一代,目标是为JVM上的开发人员端测试创建一个最新的基础。这包括关注Java 8及以上版本,以及支持许多不同风格的测试。
@SpringBootTest
class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
void userAll() {
List<User> result = userMapper.userAll();
for (User user:result) {
System.out.println(user);
}
}
}
测试结果如下:
3.3 delete 和 update
(1)接口
因为 Mybatis 提供了 XML 标签,SQL 语句写在XML里面,即可以降低代码的耦合性,也可以提高复用率。
public int deleteUser(@Param("id") Integer id);
public int updateTitle(@Param("id") Integer id,@Param("content") String content);
(2)核心代码
<delete id="deleteUser">
delete from article where id = #{id};
</delete>
<update id="updateTitle">
update article set content = #{content} where id = #{id};
</update>
3.4 insert
(1)接口
public int insertArticle(@Param("article") Article article);
(2)核心代码
<insert id="insertArticle" useGeneratedKeys="true" keyProperty="id">
insert into article values (null,#{article.title},#{article.content},now());
</insert>
四、SQL 注入
4.1 什么是 SQL 注入
SQL 注入就是利用数据库漏洞,利用一些特殊的字段来拼接 SQL 语句,可跳过 Web 应用程序的安全验证,对数据库进行的攻击的一种违法手段。
4.2 SQL 注入代码
' or 1='1
select * from user where username = ‘张三’ and password = ’ ’ or 1='1 ’
上面这条语句可以在不知道用户密码的情况下,进行用户身份的查询,有的 SQL 注入甚至可以达到修改、删除数据等行为。
4.3 #{} 和 ${} 的区别
- #{} 是预编译时处理。
- ${}是字符串替换。
- 使用 #{} 能避免 部分 SQL 注入问题。
预编译处理就是在执行 SQL 语句时把 #{} 替换为 ? 号先进行占位,然后调用 PreparedStatement 的 set 方法根据字段的类型来赋值;字符串替换直接把 ${} 里面的字段当成字符串来处理。
SQL 注入解决方案:
- 在执行 SQL 语句之前进行参数判断,如果符合类型就执行,否则直接拒之门外;
- 尽可能使用 #{} 预查询的方式;
- 开发完毕之后,测试人员进行安全测试。
总结:SQL注入问题还是很可怕的,用户隐私泄漏……君子爱财取之有道,希望学习编程的我们能用所学知识,来造福社会。