数据库常见问题总结

1.SQL注入是什么

一、什么是SQL注入? SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。

二、SQL注入总体思路 1、寻找到SQL注入的位置 2、判断服务器类型和后台数据库类型 3、针对不通的服务器和数据库特点进行SQL注入攻击

三、以登录为案例,数据库为MySQL,要求输入用户名和密码 点击登陆,如果没有做特殊处理,那么这个非法用户就很得意的登陆进去了。(当然现在的有些语言的数据库API已经处理了这些问题)

从理论上说,后台认证程序中会有如下的SQL语句:

String sql="select * from table where username='"+userName+"’and password='"+password+” '”;

 当输入了下面的用户名和密码,上面的SQL语句变成:

SELECT * FROM table WHERE username='1’or 1=1 # and password=''

条件后面username=‘1’ or 1=1 然后后面加#将后面的语句注释,让他们不起作用,这样语句就是恒真了,用户能轻易骗过系统,获取合法身份。SQL注入还可以用来删除、添加、修改数据库中的记录等等…

四、怎么防止sql注入?

1、不要图一时方便使用SQL语句直接拼接。

2、如果用SQL语句,那就使用参数化,添加Param。

3、尽可能的使用存储过程,安全性能高而且处理速度也快。

4、屏蔽SQL注入。

 

2. mybatis里面 # 和 $ 的区别

"#" :这种方式是使用预编译语句,会将参数按照 JDBC 类型进行处理,可以防止 SQL 注入攻击。在执行 SQL 前,#{}会使用 PreparedStatement 的参数设置,通过 JDBC 接口传递值,可以很大程度上防止 SQL 注入。

"$" :这种方式是直接拼接 SQL 语句,参数的值会直接按照传入的形式进行拼接,存在 SQL 注入的风险。在执行 SQL 时,MyBatis 会将 ${} 替换为实际的变量值,并将该 SQL 语句发送到数据库执行。

因此,一般情况下推荐使用 "#" 的方式进行参数绑定,以提高安全性并防止 SQL 注入攻击。

3.resultType和resultMap的区别

在MyBatis框架中,resultType和resultMap是用来映射查询结果的两种方式。

  1. resultType:

    • resultType用于指定单一结果对象的类型,通常用于简单的查询,返回的结果可以直接映射到一个JavaBean或基本数据类型。

    • 例如,你可以使用resultType来指定一个简单的POJO类,用于映射查询结果的列到该类的属性。

  2. resultMap:

    • resultMap用于定义复杂的结果映射关系,允许你在查询结果和Java对象之间建立更加灵活的映射关系,包括字段名的映射、嵌套查询、关联对象等。

    • 通过resultMap,你可以自定义查询结果的映射逻辑,以适应各种复杂的数据结构。

 

4.数据库的命名规范以及设计的逻辑,设计表需要考虑的问题

  1. 数据库的表名字规范,与项目的名字匹配,比如可以使用 项目名_模块名_表名  

  2. 数据库字段的设计应该符合数据规范性、业务要求和查询优化的原则, 数据库字段的名字规范,要符合实际的要求,要见名知意 

  3. 考虑数据类型的选取 大小的区别 和默认值问题    比如对时间的精度要求比较高就要选择TimeStamp类型,对精度无要求可以使用date类型数据, 大小的选择一般为2的幂次方,然后根据数据的范围来设置上限, 默认值的设置要符合逻辑,例如逻辑删除字段可以设置默认值为未删除

  4. 考虑是这个字段否为可以为空值  根据字段的作用和实际情况来判断

  5. 主键的确定 主键可以设置为 (表名_ID) 的形式

  6. 每一个字段都要加注释

  7. 索引的选取,考虑使用普通索索引.唯一索引.联合索引,保证索引的可用性

 

5.索引的各种用法,联合索引,唯一索引,普通索引

索引是数据库中用于提高查询效率的重要工具,它可以加速数据的检索速度。在数据库中,常见的索引包括普通索引、唯一索引和联合索引。

  1. 普通索引(Non-Unique Index): 普通索引是最基本的索引类型,它能够加快数据的检索速度,但允许索引列中存在重复的数值。普通索引可以用来加速 WHERE 子句中涉及索引列的查询,提升相应查询的性能。

  2. 唯一索引(Unique Index): 唯一索引与普通索引类似,不同之处在于唯一索引要求索引列中的数值必须是唯一的,不允许重复。唯一索引通常用于确保表中某一列的数值是唯一的,比如身份证号、用户名等。

  3. 联合索引(Composite Index): 联合索引是指针对表中多个列创建的索引,通过将多个列组合在一起建立索引,可以加速涉及这些列的查询。联合索引的选择性取决于涉及的列的选择性,选择性越高的列放在联合索引的前面,可以提高索引的效率。

索引的各种用法包括:

提高查询性能:索引可以加速 WHERE 子句中涉及索引列的查询,降低查询的时间复杂度。

约束数据完整性:唯一索引可以保证索引列中的数值唯一,确保数据的完整性。

加速连接操作:对连接操作涉及的列创建联合索引可以提升连接查询的性能。

在使用索引时需要注意以下事项:

不要滥用索引:过多的索引会增加数据库的存储空间和维护成本,同时在插入、删除和更新数据时也会影响性能。

根据实际需求选择合适的索引类型:根据业务需求和查询模式选择合适的索引类型,避免不必要的索引。

定期维护索引:对于频繁更新的表,需要定期对索引进行优化和重建,以保持索引的高效性。

 

6.返回值用int还是Integer类型

java的int和Integer的区别_接口返回的结果用int还是integer_Micrle_007的博客-CSDN博客

 要用包装类型,比如Integer,因为int有默认值0,而Integer的默认值是null,可以表示返回值为空的情况

 7.@Param注解的用法

1、概述 首先明确这个注解是为SQL语句中参数赋值而服务的。

  @Param的作用就是给参数命名,比如在mapper里面某方法A(int id),当添加注解后A(@Param("userId") int id),也就是说外部想要取出传入的id值,只需要取它的参数名userId就可以了。将参数值传如SQL语句中,通过#{userId}进行取值给SQL的参数赋值。

 2、实例: 实例一:@Param注解基本类型的参数

 mapper中的方法:public User selectUser(@Param("userName") String name,@Param("password") String pwd); 

映射到xml中的<select>标签

<select id="selectUser" resultMap="User">  
select * from user where user_name = #{userName} and user_password=#{password} </select>

 其中where user_name = #{userName} and user_password = #{password}中的userName和password都是从注解@Param()里面取出来的,取出来的值就是方法中形式参数 String name 和 String pwd的值。

实例二:@Param注解JavaBean对象

SQL语句通过@Param注解中的别名把对象中的属性取出来然后复制,这里命名就按照@param中的为标准

 mapper中的方法: public List<User> getAllUser(@Param("user") User u);
映射到xml中的<select>标签

 <select id="getAllUser" parameterType="com.vo.User" resultMap="userMapper">  
        select   
        from user t where 1=1  
             and   t.user_name = #{user.userName}  
             and   t.user_age = #{user.userAge}  
</select>  

3、注意点 当使用了@Param注解来声明参数的时候,SQL语句取值使用#{},${}取值都可以。

当不使用@Param注解声明参数的时候,必须使用的是#{}来取参数。使用${}方式取值会报错。

不使用@Param注解时,参数只能有一个,并且是Javabean。在SQL语句里可以引用JavaBean的属性,而且只能引用JavaBean的属性。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值