Java JDBC下执行SQL的不同方式、参数化预编译防御(三)

2014-11-23 22:28:02 · 作者: · 浏览: 3
ies props = new Properties();
props.load(new FileInputStream(paramFile));
driver = props.getProperty("driver");
url = props.getProperty("url");
user = props.getProperty("user");
pass = props.getProperty("pass");
}
public void createTable(String sql)throws Exception
{
// 加载驱动
Class.forName(driver);
try(
// 获取数据库连接
Connection conn = DriverManager.getConnection(url , user , pass);
// 使用Connection来创建一个Statment对象
Statement stmt = conn.createStatement())
{
// 执行DDL,创建数据表
stmt.executeUpdate(sql);
}
}
public static void main(String[] args) throws Exception
{
ExecuteDDL ed = new ExecuteDDL();
ed.initParam("mysql.ini");
ed.createTable("create table jdbc_test "
+ "( jdbc_id int auto_increment primary key, "
+ "jdbc_name varchar(255), "
+ "jdbc_desc text);");
System.out.println("-----建表成功-----");
}
}
复制代码
从代码中我们可以看到,我们并没有把数据库连接信息写在程序里,而是使用一个mysql.ini文件来保存数据库连接信息,这样当需要把程序从开发环境移植到生产环境时,无须修改源代码,只需要修改mysql.ini配置文件即可
mysql.ini:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/select_test
user=root
pass=111
使用executeQuery执行DDL、DML语句
复制代码
import java.sql.*;
public class ConnMySql
{
public static void main(String[] args) throws Exception
{
// 1.加载驱动,使用反射的知识,现在记住这么写。
Class.forName("com.mysql.jdbc.Driver");
try(
// 2.使用DriverManager获取数据库连接,
// 其中返回的Connection就代表了Java程序和数据库的连接
// 不同数据库的URL写法需要查驱动文档知道,用户名、密码由DBA分配
Connection conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/company"
, "root" , "111");
// 3.使用Connection来创建一个Statment对象
Statement stmt = conn.createStatement();
// 4.执行SQL语句
/*
Statement有三种执行sql语句的方法:
1 execute 可执行任何SQL语句。- 返回一个boolean值,
如果执行后第一个结果是ResultSet,则返回true,否则返回false
2 executeQuery 执行Select语句 - 返回查询到的结果集
3 executeUpdate 用于执行DML语句。- 返回一个整数,
代表被SQL语句影响的记录条数
*/
ResultSet rs = stmt.executeQuery("select *"
+ " from p8_ad_user"))
{
// ResultSet有系列的getXxx(列索引 | 列名),用于获取记录指针
// 指向行、特定列的值,不断地使用next()将记录指针下移一行,
// 如果移动之后记录指针依然指向有效行,则next()方法返回true。
while(rs.next())
{
System.out.println(rs.getInt(1) + "\t"
+ rs.getString(2) + "\t"
+ rs.getString(3) + "\t"
+ rs.getString(4));
}
}
}
}
复制代码
0x2: prepareStatement预编译对象
JDBC中的这个类对于安全人员、和 黑客都需要重点关注,它不仅可以提供SQL执行性能,同时还有防御SQL注入的功能。
当我们的业务层中和 数据库相关的代码经常要执行一些相似度很高的SQL语句,它们的结果基本相似,只是插入时插入的值不同而已
insert into student_table values(null, "LittleHann", 1);
insert into student_table values(null, "LittleHann", 2);
在这种情况下,我们可以使用带占位符( )参数的SQL语句来代替它
insert into student_table values(null, , );
为了满足这种功能,JDBC提供了prepareStatement接口,它是Statement接口的子接口,它可以预编译SQL语句,预编译后的SQL语句被存储在prepareStatement对象中,然后可以使用该对象多次高效地执行该语句。prepareStatement同样也使用execute()、executeUpdate()、executeQuery()来执行SQL语句,但这三