String sql = "select * from sys_user where 1=2"与String sql = "select * from sys_user where 1=1的对比介绍



今天在公司的项目中看到String sql = "select * from sys_user where 1=2";还有String sql = "select * from sys_user where 1=1";这些sql语句,看了半天不大明白什么意思,请教了一下大佬,总结整理了一下;
String sql = "select * from sys_user where 1=2和
String sql = "select * from sys_user where 1=1的比较;
相同点:可以拼接字符串;
比如:
String sql="select * from user where 1=1 "; 


if(username!=null) sql=sql+ " and username='"+username+"'"; 


if(password!=null) sql=sql+ " and password='"+password+"'"; 


select id from sys_user where 1=1
<if test="username !=null and password != ''">
AND name = #{name}
</if>
<if test="firstType !=null and firstType != ''">
AND firstType = #{firstType}
</if>
<if test="secondType !=null and secondType != ''">
AND secondType = #{secondType}
</if>


因为我这里是动态查询,假如第一个条件不成立,那么如果我没有使用 1 = 1 ,
我的SQL就会变成 select XXX from XXX where  and XXXX ,
如果我加了1 = 1,就会变成 select XXX from XXX where 1 = 1 and XXXX;
从这里面可以看出在动态sql中.加了这个1=1是可以拼接sql语句的;
不同点:
String sql="select * from user where 1=1 "; 
此sql返回的永远为真,也就是true,
可以理解为条件永远为真,查出的是所有数据;
相当于String sql="select * from user;
比如:
String sql="select * from user where 1=1 "; 


if(username!=null) sql=sql+ " and username='"+username+"'"; 


if(password!=null) sql=sql+ " and password='"+password+"'"; 


后面两个条件username,password两者都为空也是可以查询的,因为还有前面的查询条件;
String sql = "select * from sys_user where 1=2
此sql返回的永远为假,也就是false,
可以理解为where条件不成立,虽然执行了查询,但是返回的是空数据;
使用这句sql永远不能查询到数据;
建议使用上面的1=1好点;
附:本人菜鸟如有错误欢迎指正,谢谢诸位大佬;
有几个方面可以优化这段代码: 1.防止 SQL 注入攻击 在这段代码中,SQL 查询语句是通过字符串拼接的方式生成的,这存在 SQL 注入攻击的风险。建议使用 PreparedStatement 来代替 Statement,这样可以使用参数化查询,防止 SQL 注入攻击。 2.使用 try-with-resources 在代码中打开了 Connection、Statement 和 ResultSet,需要手动关闭,这存在资源泄漏的风险。建议使用 try-with-resources,这样可以自动关闭资源。 3.将数据库连接信息配置在配置文件中 在代码中直接硬编码了数据库连接信息,这样不方便修改和维护。建议将数据库连接信息配置在配置文件中,这样可以方便修改和维护。 4.合理处理异常 在代码中,如果发生异常,只是简单地打印了错误信息,没有进行合理的处理。建议使用合适的方式来处理异常,比如抛出异常或者返回错误码。 优化后的代码如下所示: ``` private void check(String name, String password) { boolean result = false; try { Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/student"; String user = "root"; String pwd = "271332"; String sql = "select * from users where uname=? and upwd=?"; try (Connection con = DriverManager.getConnection(url, user, pwd); PreparedStatement ps = con.prepareStatement(sql)) { ps.setString(1, name); ps.setString(2, password); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { JOptionPane.showMessageDialog(this, "欢迎" + name + "登陆!", "登陆成功", JOptionPane.INFORMATION_MESSAGE); } else { JOptionPane.showMessageDialog(this, "用户名或密码输入错误,请重试!", "登陆失败", JOptionPane.ERROR_MESSAGE); result = false; } } } } catch (ClassNotFoundException e) { JOptionPane.showMessageDialog(null, "数据库加载失败" + e, "失败", JOptionPane.ERROR_MESSAGE); } catch (SQLException ee) { JOptionPane.showMessageDialog(null, "数据读取失败" + ee, "失败", JOptionPane.ERROR_MESSAGE); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值