目录
引言
一、使用正确的方式实现分页
1.1.什么是分页
1.2.MyBatis中的分页实现方式
1.3.避免SQL注入的技巧
二、特殊字符的正确使用方式
2.1.什么是特殊字符
2.2.特殊字符在SQL查询中的作用
2.3.如何避免特殊字符引起的问题
2.3.1.使用CDATA区段
2.3.2.使用实体引用
三、总结和展望
3.1.MyBatis的优点和不足
优点
不足之处
3.2.未来发展趋势和应用场景
SQL注入是一种常见的数据库攻击手段,它利用了程序员在编写代码时疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。举个例子,如果一个网站没有对用户输入的字符串进行过滤、转义、限制或处理不严谨,那么攻击者就可以通过输入精心构造的字符串去非法获取到数据库中的数据 。
SQL注入的坏处包括但不限于:窃取敏感信息、破坏数据、影响系统稳定性等 。
SQL注入案例:
当用户输入的数据直接拼接到SQL语句中时,如果用户输入恶意数据,例如 ' OR '1'='1
,那么整个SQL语句会变成:
SELECT * FROM users WHERE name = '' OR '1'='1';
由于1=1 永远为真,所以这个SQL语句会返回所有用户记录。这就是一个典型的SQL注入攻击。如果使用MyBatis的动态SQL功能,用户可以在查询语句中直接输入变量名,而MyBatis会将这些变量替换为对应的值。如果用户输入的值包含恶意代码,那么就会导致SQL注入问题。
下面来看看我们怎么解决的吧!!
分页是一种操作系统里存储器管理的一种技术,可以使电脑的主存可以使用存储在辅助存储器中的数据。操作系统会将辅助存储器(通常是磁盘)中的数据分区成固定大小的区块,称为“页”。当不需要时,将当前访问的页从内存中换出,放入磁盘中,以便下次访问时再将其读入内存。这样,每次只需要读取所需的那一页数据,就可以避免一次性读取大量数据导致内存不足的问题。
举个例子,如果我们需要在一个网站上查看文章列表,但是每篇文章都有很多内容,如果我们一次性将所有文章全部加载到浏览器中,那么可能会导致浏览器崩溃。而如果我们使用分页技术,每次只加载一篇文章的内容,这样就可以避免这个问题。
MyBatis分页插件提供了多种分页方式,可以满足不同场景下的需求。例如,可以使用物理分页和逻辑分页两种方式来实现分页查询。物理分页是指将数据分成固定大小的块进行查询,而逻辑分页则是根据用户需求进行查询。使用MyBatis分页插件可以方便地实现这些功能,并且可以避免SQL注入等安全问题。
MyBatis中有多种分页实现方式,其中比较常用的有以下几种:
1.物理分页:将数据分成固定大小的块进行查询。这种方式的优点是速度快,但是缺点是占用内存大,不适用于数据量大的情况。
2.逻辑分页:根据用户需求进行查询。这种方式的优点是可以根据用户需求进行查询,灵活性高,但是缺点是需要手动编写SQL语句,维护成本高。
public List selectUsersByPage(int pageNum, int pageSize) {
int start = (pageNum - 1) * pageSize;
int end = start + pageSize;
List users = userMapper.selectAllUsers();
if (start < users.size()) {
users = users.subList(start, end);
}
return users;
}
3.MyBatis分页插件:提供了多种分页方式,可以满足不同场景下的需求。例如,可以使用物理分页和逻辑分页两种方式来实现分页查询。使用MyBatis分页插件可以方便地实现这些功能,并且可以避免SQL注入等安全问题。
我接下来要介绍的是第三种方式MyBatis分页插件,利用插件完成分页共有以下四步:
①导入pom依赖
com.github.pagehelper
pagehelper
5.1.2
②Mybatis.cfg.xml配置拦截器
注意事项:该标签不能写在
③使用PageHelper进行分页
BookMapper.xml
BookMapper
List
listPager(@Param("bname") String bname); BookBiz
List
listPager(String bname); BookBizImpl
package com.csdn.xw.biz.Impl; import com.csdn.xw.biz.BookBiz; import com.csdn.xw.mapper.BookMapper; import com.csdn.xw.model.Book; import java.util.List; /** * @author Java方文山 * @compay csdn_Java方文山 * @create 2023-08-19-13:41 */ public class BookBizImpl implements BookBiz { private BookMapper bookMapper; public BookMapper getBookMapper() { return bookMapper; } public void setBookMapper(BookMapper bookMapper) { this.bookMapper = bookMapper; } @Override public List
listPager(String bname) { return bookMapper.listPager(bname); } } BookBizImplTest
package demo; import com.csdn.xw.biz.Impl.BookBizImpl; import com.csdn.xw.mapper.BookMapper; import com.csdn.xw.util.SessionUtil; import com.github.pagehelper.PageHelper; import org.apache.ibatis.session.SqlSession; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.Arrays; import java.util.List; /** * @author Java方文山 * @compay csdn_Java方文山 * @create 2023-08-19-13:46 */ public class demo1 { private BookBizImpl bookBiz = new BookBizImpl(); SqlSession sqlSession; @Before public void setUp() throws Exception { System.out.println("初始换方法。。。"); //工具类中获取session对象 sqlSession = SessionUtil.openSession(); //从session对象中获取mapper对象 BookMapper mapper = sqlSession.getMapper(BookMapper.class); bookBiz.setBookMapper(mapper); } @After public void tearDown() throws Exception { System.out.println("方法测试结束。。"); sqlSession.commit(); } @Test public void listPager() { System.out.println("测试的mybatis的分页插件方法"); PageHelper.startPage(1, 10); // 第1页,每页10条数据 System.out.println("当前页数:"+PageHelper.getLocalPage().getPageNum()+"当前页展示数:"+PageHelper.getLocalPage().getEndRow()); bookBiz.listPager("圣墟").forEach(System.out::println); } }
④处理分页结果
使用参数化查询:使用参数化查询是防止SQL注入的最有效方法之一。通过将查询参数化,将用户提供的输入值作为参数传递给查询,而不是将输入值直接拼接到SQL语句中。这样可以确保输入值被正确地转义和处理,减少SQL注入的风险。
使用存储过程:存储过程是一种在数据库中预编译的SQL代码块,可以通过调用存储过程来执行SQL操作。使用存储过程可以避免SQL注入,因为它们不允许用户直接输入数据,而是使用预先定义好的参数来传递数据。
过滤用户输入:对用户输入进行过滤和验证,确保输入数据的合法性。例如,可以使用正则表达式或白名单来限制用户输入的字符集,或者限制输入长度等。
在Mybatis中,特殊字符是指在XML文件中需要转义的字符。这些字符包括:&、<、>、"、'、/等。为了避免这些字符对XML文件造成影响,我们需要对它们进行转义。
在SQL查询中,特殊字符可以用来进行模糊查询。其中,%
表示任何字符出现任意次数(可以是0次),而_
表示一个字符。除此之外,还有一些其他的字符,比如[]
、^
、\\
等等,它们也可以用来进行模糊查询。
例如,假设有一个名为"users"的表,其中包含一个名为"name"的列,我们可以使用以下语句来查找名字以字母"A"开头的所有用户:
SELECT * FROM users WHERE name LIKE 'A%';
这将返回所有名字以字母"A"开头的用户。另外,如果我们想要查找名字中包含两个字母"A"的用户,我们可以使用以下语句:
SELECT * FROM users WHERE name LIKE '%A%A%';
先来一个没有特殊处理过的
BookMapper.xml
BookBizImplTest
@Test
public void listPagerS() {
System.out.println("没有处理特殊字符之前");
Map map=new HashMap();
map.put("dname","圣墟");
map.put("max",20);
bookBiz.listPagerS(map).forEach(System.out::println);
}
测试结果:
直接报红了,因为有些特殊字符是需要处理的,下面我来给大家介绍两种处理方案:
CDATA区段是XML中的一个元素,它包含了不会被解析器解析的文本。一个CDATA区段中的标签不会被视为标记,同时实体也不会被展开。主要的目的是为了包含诸如XML片段之类的材料,而无需转义所有的分隔符 。
我们只需在需要有特殊字符的地方加上即可
BookMapper.xml
这时候再来看看效果:
在XML中,一些字符具有特殊的意义,比如<
、>
和&
等符号。如果我们需要在文本中使用这些符号,就需要将它们转义为对应的实体引用。例如,<
应该被转义为<
,>
应该被转义为>
,&
应该被转义为&
。
BookMapper.xml
测试效果:
以下是一些常见的需要转义的XML特殊字符及其对应的实体引用:
特殊字符 | 实体引用 |
---|---|
< |
< |
> |
> |
& |
& |
" |
" |
' |
' |
/ |
/ |
\ |
\ |
" |
" |
' |
' |
综上所述,MyBatis作为一种优秀的持久层框架,在未来将继续发挥重要作用。虽然存在一些不足之处,但随着技术的不断发展和创新,相信MyBatis将会不断改进和完善,为开发者提供更多便利和支持。
到这里我的分享就结束了,欢迎到评论区探讨交流!!
如果觉得有用的话还请点个赞吧 ♥ ♥