Java 使用SQLitestatement bindstring方法代替简单的字符串连接来执行sql语句有什么好处吗

Java 使用SQLitestatement bindstring方法代替简单的字符串连接来执行sql语句有什么好处吗,java,android,string,sqlite,android-sqlite,Java,Android,String,Sqlite,Android Sqlite,我想在androidstudio中的SQLite数据库的表中插入值,我想从下面给出的两种方法中选择哪种方法。 我从一门课程中学到了第一种方法,但我想用第二种方法。这就是我为什么要问这个问题 articleId、articleContent和articleTitle都是字符串类型 如果可以,请说明每种方法的优缺点。如果愿意,您可以建议另一种方法 String sql=“插入到文章(articleId、title、content)值(?,?)”; SQLiteStatement语句=articles

我想在androidstudio中的SQLite数据库的表中插入值,我想从下面给出的两种方法中选择哪种方法。 我从一门课程中学到了第一种方法,但我想用第二种方法。这就是我为什么要问这个问题

articleId、articleContent和articleTitle都是字符串类型

如果可以,请说明每种方法的优缺点。如果愿意,您可以建议另一种方法

String sql=“插入到文章(articleId、title、content)值(?,?)”;
SQLiteStatement语句=articlesDB.compileStatement(sql);
语句.bindString(1,articleId);
语句.bindString(2,articleTitle);
语句.bindString(3,articleContent);
语句。execute();
或者简单地使用字符串连接:

sqliteDatabase.execSQL(“插入到文章(articleId,title,content)值(“+articleId+”,“+articleititle+”,“+articleint+”));

是的,建议始终使用
bindString()
以避免通过SQL注入在数据库中进行可能的攻击。

在您的特定情况下,似乎要插入的值仅来自您的代码,而不是来自任何动态输入源,例如用户输入。在这种情况下,使用您在问题中提到的任何方法都是安全的

在您的情况下,您还可以使用
SQLiteDatabase
类中的
insert()
来代替字符串连接,这样可以避免任何语法错误:

SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("articleId", articleId);
values.put("title", articleTitle);
values.put("content", articleContent);
db.insert("articles", null, values);
它返回新插入行的行ID,如果发生错误,则返回-1

但是,如果您从用户输入中获取值,则使用字符串连接会使您的数据库完全容易受到潜在攻击者的攻击。这就是为什么总是建议使用
SQLiteProgram
类的
bindString()
方法在需要传递值的地方执行sql


另一个原因是,
bindString()
可以调用
java.lang.IllegalArgumentException
。因此,如果出现语法错误,使用此方法有助于异常处理和调试。

是为了避免SQL注入和语法错误,您应该使用bindString而不是字符串串联来避免。是的,SQL注入和具有
字符等,但在您的特定情况下,请使用
SQLiteDatabase#insert
方法