MySQL Prepared语句(Prepared Statements)

4 篇文章 0 订阅

在数据库应用中,很多SQL语句都会重复执行很多次,每次执行可能只是where条件中的变量值不同,但MySQL依然会解析SQL语法并生成执行计划。对于这类情况,可以利用prepared语句来避免重复解析SQL的开销。

一、prepared语句优点

prepared语句通过准备一个SQL执行对象,然后通过execute语句来重复进行执行,在每次执行的过程中提供变量的实际值。相比于重复执行SQL语句,prepared statement具有如下优势:

  • 在execute语句重复执行的过程中,每次只有传入的变量值不同,SQL的执行计划不会改变,避免重复解析SQL。
  • 避免SQL注入攻击。

二、prepare语句用法

prepare statement主要有3个组成部分:

  • prepare语句:生成一个prepared statement对象并为其指定别名,可使用占位符?指定变量。
  • execute语句:通过别名执行一个prepared statement,可通过using子句为变量提供值。
  • deallocate prepared语句:通过别名释放一个prepared statement。

Prepare语句的生效范围是会话,MySQL使用参数max_prepared_stmt_count来控制语句的最大数量,如果将该参数设置为0,将会禁用prepared statement功能。

show variables like 'max_prepared_stmt_count';

在这里插入图片描述

执行如下SQL准备示例数据:

create table person(
id int auto_increment primary key,
name varchar(32));
insert into person values (null, 'Vincent'), (null, 'Victor'), (null, 'Grace');
select * from person;

在这里插入图片描述

2.1 prepare语句

prepare语句根据文本生成一个SQL语句对象,并为其指定一个别名,在准备过程中,可以使用占位符?来替代变量:

set @sql = 'select name from person where id=?';
prepare stmt from @sql;

在这里插入图片描述
示例中通过变量名来传入SQL文本,也可以直接通过SQL文本prepare,例如:prepare stmt from ‘select name from person where id=?’;

prepare语句还有一个较常用的场景为动态SQL拼接。即根据用户选择的条件来快速调整过滤条件拼接出不同的SQL:

set @base = 'select * from person where 1=1';
set @id_filter = ' and id=?';
set @name_filter = ' and name=?';
set @sql2 = concat(@base, @id_filter, @name_filter);   -- 选择了条件,就加入拼接
prepare stmt2 from @sql2;

在这里插入图片描述

2.2 execute语句

执行完prepare语句后,即可用execute语句来执行,如果有?代替的变量,则需要通过using语句为其指定值(数量要和prepare语句中?数量相同)。execute语句在每次执行提供不同的变量,即可实现一次解析,多次执行:

set @var1 = 1;
execute stmt using @var1;
set @var2 = 2;
execute stmt using @var2;

在这里插入图片描述

注意using子句中只能通过变量来提供值,如果通过常量提供值,则会报错:

execute stmt using 1;

在这里插入图片描述

2.3 deallocate prepare语句

prepare语句使用完成后可以使用deallocate/drop prepare ….语句手动进行释放,另外当会话断开时,所有未释放的prepare语句也会自动释放,因此重连或者异常中断都会导致prepare statement丢失。

deallocate prepare stmt;

在这里插入图片描述

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我是AI语言模型,无法提供完整的Android显示MySQL内容代码,但是我可以给您一些指导: 1. 首先,您需要建立一个连接MySQL数据库的类。这个类需要实现Java中的JDBC接口。 2. 接下来,您需要编写一个查询语句,从MySQL数据库中获取数据。您可以使用Java中的PreparedStatementStatement对象来执行SQL语句。 3. 在获取数据后,您需要将数据显示在Android应用程序中。您可以使用ListView或RecyclerView来显示数据。 4. 最后,您需要在Android应用程序中调用连接MySQL数据库的类和获取数据的方法,以显示MySQL内容。 这里是一个示例代码片段,显示如何从MySQL数据库中获取数据: // 创建一个连接MySQL数据库的类 public class MySQLConnection { private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; private static final String DB_URL = "jdbc:mysql://localhost:3306/mydatabase"; private static final String USER = "root"; private static final String PASS = "password"; private Connection conn = null; private Statement stmt = null; public MySQLConnection() { try { Class.forName(JDBC_DRIVER); conn = DriverManager.getConnection(DB_URL, USER, PASS); stmt = conn.createStatement(); } catch (SQLException se) { se.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } // 获取MySQL内容的方法 public ResultSet getMySQLData() { String sql = "SELECT * FROM mytable"; ResultSet rs = null; try { rs = stmt.executeQuery(sql); } catch (SQLException se) { se.printStackTrace(); } return rs; } } 在Android应用程序中调用MySQLConnection类和getMySQLData方法,以显示MySQL内容: // 在Activity中调用MySQLConnection类和getMySQLData方法 public class MainActivity extends AppCompatActivity { private ListView listView; private MySQLConnection mySQLConnection; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = findViewById(R.id.list_view); mySQLConnection = new MySQLConnection(); // 获取MySQL内容并显示在ListView上 ResultSet rs = mySQLConnection.getMySQLData(); List<String> data = new ArrayList<>(); try { while (rs.next()) { data.add(rs.getString("column_name")); } } catch (SQLException se) { se.printStackTrace(); } ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data); listView.setAdapter(adapter); } } 请注意,这只是一个示例代码片段,您需要根据自己的需求进行修改和优化。同时,为了安全起见,您应该使用prepared statements来执行SQL语句,以避免SQL注入攻击。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值