Java-JDBC与java数据库编程-PreparedStatement
原创约 856 字大约 3 分钟...
255-Java-JDBC与java数据库编程-PreparedStatement.md
注意
本博文仅供学术研究和交流参考,严禁将其用于商业用途。如因违规使用产生的任何法律问题,使用者需自行负责。
概念
可以防止注入风险

oracle.jdbc.driver.OracleConnection@64f6106c
java.sql.SQLException: ORA-01722: 无效数字
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:189)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:242)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:554)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1478)
at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteDescribe(TTC7Protocol.java:677)
at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:2371)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2660)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:457)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:387)
at com.tencent.chapter07.jdbc.EmpPreparedStatementDao.selectEmps(EmpPreparedStatementDao.java:78)
at com.tencent.chapter07.jdbc.EmpPreparedStatementDao.main(EmpPreparedStatementDao.java:42)
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.List.iterator()" because "empList" is null
at com.tencent.chapter07.jdbc.EmpPreparedStatementDao.main(EmpPreparedStatementDao.java:43)
示例代码
package com.tencent.chapter07.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.tencent.chapter07.jdbc.entity.Emp;
public class EmpPreparedStatementDao {
/**
创建JDBC应用程序的步骤:
0.项目右键-新建lib文件夹-将classes12.jar或者ojdbc14.jar复制到文件夹-classes12.jar右键-build path - add to build path
1.载入JDBC驱动程序
2.定义连接URL
3.建立连接
4.创建Statement对象
5.执行查询或更新
6.结果处理
7.关闭连接
Statement:
1.执行静态SQL语句
2.有SQL注入风险
PreparedStatement:
1.预编译SQL语句
2.解决SQL注入风险
CallableStatement:
1.执行存储过程
*/
public static void main(String[] args) {
EmpPreparedStatementDao dao = new EmpPreparedStatementDao();
//查询
List<Emp> empList = dao.selectEmps();
for (Emp emp : empList) {
System.out.println(emp.toString());
}
}
/**
* 查询所有的员工信息
* @return
*/
public List<Emp> selectEmps() {
Connection conn = null;
PreparedStatement stat = null;
ResultSet rs = null;
try {
//1.载入JDBC驱动程序
Class.forName("oracle.jdbc.driver.OracleDriver");//驱动描述符 oracle.jdbc.driver.OracleDriver
//2.定义连接URL jdbc:oracle:thin:@<主机IP>:1521:<数据库服务名>
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
//3.建立连接
conn = DriverManager.getConnection(url, "scott", "scott123");
System.out.println(conn);
//4.创建PreparedStatement对象
String empno = "8888 or 1=1 ";
stat = conn.prepareStatement("select empno, ename empName, job, mgr, hiredate, sal, comm, deptno from emp where empno = ?");//?表示一个占位符号,表示的该值为一个变量,需要被赋值
//-------4.1 ORA-01008: 并非所有变量都已绑定
stat.setString(1, empno);//索引从1开始,给第一个问号赋值
//5.执行查询或更新
//stat.execute("sql"); //如果第一个结果为 ResultSet 对象,则返回 true;如果其为更新计数或者不存在任何结果,则返回 false
//stat.executeQuery("sql"); //返回查询的结果集合ResultSet,适用于查询(select)
//stat.executeUpdate("sql"); //返回DML操作的影响行数,适用于新增(insert)、修改(update)、删除(select)
//stat.executeBatch(); //返回int[],使用批量删除、批量修改、批量新增
rs = stat.executeQuery();
//6.结果处理
List<Emp> empList = new ArrayList<Emp>();
while(rs.next())
{
//方式一:通过列索引index获取列的值
//int empno = rs.getInt(1);
//String ename = rs.getString(2);
//方式二:通过列名称label获取列的值-----【推荐】
//int empno = rs.getInt("empno");
//String ename = rs.getString("empName");
//每遍历一次,获得一个Emp的员工信息
Emp emp = new Emp();
emp.setEmpno(rs.getInt("empno"));
emp.setEname(rs.getString("empName"));
emp.setJob(rs.getString("job"));
//...............其他字段(略)
//将当前的emp添加到集合
empList.add(emp);
}
return empList;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//7.关闭连接
//使用顺序:Connection -> Statement -> ResultSet
//关闭顺序:ResultSet -> Statement -> Connection
try {
if(rs != null)
{
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(stat != null)
{
stat.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn != null)
{
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return null;
}
}
分割线
相关信息
以上就是我关于 Java-JDBC与java数据库编程-PreparedStatement 知识点的整理与总结的全部内容,希望对你有帮助。。。。。。。
Powered by Waline v2.15.4