MySql在Java中获取参数值的两种方法(字符串拼接和占位符赋值)

前言

 在java中操作mysql时,有些同学不会如何将java中的数据传入sql语句中。还有些同学在进行增删改查时写的sql语句都是死的,这样在每对数据库进行一次操作时就要新增一条sql语句,这样是非常麻烦的,本文就通过下面两种方法解决以上两个问题。


一、使用字符串拼接获取参数

在一个java程序中,经常需要我们通过java程序中的变量值来操作数据库,例如最常见的,根据java中一个String类型的变量name去数据库中查询与这个name变量值一致的一行数据。

此时我们就能使用字符串拼接的方法来在sql语句中获取java中的变量值来进行查询,具体方法也很简单,就是在sql语句中在将要写入java变量的地方用一个'"+java变量+"'的形式传入java变量。

具体代码如下所示

public ResultSet getUserByName(String name)
{
   //连接数据库
   Connection con=getConn();
   ResultSet rs=null;
   try 
   {
       Statement st = con.createStatement();
       //在数据库中查询名字为name的数据
       rs=st.executeQuery("select * from tb_user where name='"+name+"'");
   }
    catch (Exception e){e.printStackTrace();}
    return rs;
}

拓展:这种获取参数的方法十分简单,但在实际中运用较少,一个重要的原因就是他不是很安全,在B/S系统下,若采用字符串拼接的方法从业务层获取字符串,那么当有人恶意在业务端输入一些特别的代码如“1234 OR TRUE”,那么sql语句就会变成“UPDATE users SET userpass= '123456' WHERE user_id=1234 OR TRUE;”如果执行以上语句,将更改所有用户的密码。这就是我们常说的sql注入。而我们接下来讲的方法就能很好的避免sql注入。若读者还想了解更多sql注入的细节可以看下面博客的内容,博主描述的十分详细。
sql注入基础原理(超详细)icon-default.png?t=N2N8https://blog.csdn.net/yujia_666/article/details/90296495?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168129647916782427414691%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168129647916782427414691&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-90296495-null-null.142^v83^koosearch_v1,201^v4^add_ask,239^v2^insert_chatgpt&utm_term=sql注入&spm=1018.2226.3001.4187

 

二、使用占位符赋值获取参数

java提供了预编译语句preparedStatement,他与Statement相比更加强大,效率更加强大。而且根据占位符赋值的方法还能很好的解决sql注入问题。

preparedStatement的使用方法就是将要运行的sql语句在创建时就传入进去,采用预编译,这样的好处就是它在使用时只需要编译一次就可运行多次,相比于Statement的编译一次运行一次而言效率提升不言而喻。

且PreparedStatement还提供了一个setXxx方法,配合占位符使用就能实现在java中获取参数。

其具体使用方法我们可以看以下例子:

//往user表中存入账号密码
public void DepositUser(String name,String password)
{
    //连接数据库
    Connection con=getConn();
    try
    {
          //在预编译中使用占位符
          PreparedStatement preparedStatement =
          con.prepareStatement("INSERT INTO `user` (`user_name`, `user_password`) VALUES 
          (?,?);");
          //使用setXxx方法为占位符赋值
          preparedStatement.setString(1,name);
          preparedStatement.setString(2,password);
          preparedStatement.executeUpdate();

    }
    catch (Exception e){e.printStackTrace();}
}

使用预编译能很好防止sql注入的原因就是在Statement中使用字符串拼接时传入的字符串会被当做本来的sql语句,但在使用预编译占位符赋值时,无论传入什么样的字符串都会被当成一个变量。说到安全问题就提醒一下读者,我上面程序往数据库中存账号密码的这种方式也是不安全的,因为这样账号密码是在数据库中明文存储的。为了安全,应使用加密存储,若有读者想去了解如何加密存储可以看一下我的另外一篇文章。

JAVA使用mysql加密解密函数(AES_ENCRYPT/AES_DECRYPT)

 


 总结

这就是文章的全部内容,希望对你有所帮助

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值