JDBC技术,使用PrepareStatement实现数据库的CRUD
使用
Statement
类操作数据库时需要拼接SQL语句,而拼接SQL语句极易引起SQL注入漏洞。故使用
PreparedStatement
类替代Statement
以避免SQL注入漏洞。
PreparedStatement
采用预编译的方式解决SQL注入问题。
即预先写好SQL,而SQL中需要拼接,传入的参数均使用 ?
占位,之后将参数set为传入值。
步骤:
- 加载驱动
- 创建连接
- 为?赋值
- 执行SQL
- 如果是查询操作,需要解析
ResultSet
对象。
如:
// 设一创建好连接对象为connection
// ? 代替了需要拼接部分
String sql = "select id,name,age from student where id=?";
// 通过连接获取PreparedStatement对象
PreparedStatement ps = connection.prepareStatement(sql);
// 在执行语句之前将 ? 传入
ps.setObject(1, 1);// 第一个参数为对应?的下标(从1开始),第二个参数为要设置的值。
// 执行该语句,获取结果集对象。
ResultSet resultSet = ps.executeQuery();
PreparedStatement方法介绍
在使用connection.prepareStatement(sql)
获取PreparedStatement对象时要传入sql语句
setXX() 设置参数
即通过下标设置占位符?对应位置的参数。(下标从1开始)
executeXX() 执行SQL语句
即执行已传入的SQL,其中常用:
executeUpdate()
执行数据库更新语句(增删改)executeQuery()
执行查询语句executeBatch()
执行批量语句
getMetaData()
获取结果集元数据对象
该方法返回一个ResultSetMetaData
对象,通过该对象可获取该次查询结果集中的列名,列的别名,列数等信息
ResultSetMetaData
对象的常用方法:
getColumnLable(int column)
通过下标获取结果集中列的别名,下标从1开始(重要)getColumnName(int column)
通过下标获取结果中列名getColumnCount()
获取结果的列数。
示例代码:
PreparedStatement preparedStatement = connection.prepareStatement("select id, name userName from emp;");
// 获取查询结果的元数据。
ResultSetMetaData metaData = preparedStatement.getMetaData();
// 获取结果集中下标2的列名,即第二个列的列名
System.out.println(metaData.getColumnName(2));
// 获取结果集的列数,字段数
System.out.println(metaData.getColumnCount());
// 获取第二个列名的别名
System.out.println(metaData.getColumnLabel(2));
结果: