所需jar包mysql-connector-java-5.1.7-bin.jar
Statement实例分为以下3 【下面案例只演示了前面两种】
种类型:
1、执行静态SQL语句。通常通过Statement实例实现。
2、执行动态SQL语句。通常通过PreparedStatement实例实现。
3、执行数据库存储过程。通常通过CallableStatement实例实现
package com.sd.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author Administrator 2017年3月23日
*
*
*/
public class JDBCutil {
/*
连接URL定义了连接数据库时的协议、子协议、数据源标识。
书写形式:协议:子协议:数据源标识
协议:在JDBC中总是以jdbc开始
子协议:是桥连接的驱动程序或是数据库管理系统名称。
数据源标识:标记找到数据库来源的地址与连接端口。
*/
//private static String url ="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";
private static String url="jdbc:mysql://localhost:3306/test";
private static String username="root";
private static String password="123456";
public static Connection mysqlConnect(){
Connection con=null;
try {
Class.forName("com.mysql.jdbc.Driver");//成功加载后,会将Driver类的实例注册到DriverManager类中。
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
con=DriverManager.getConnection(url,username,password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
//statment
/*
常用的几种查询
ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ; // 返回ResultSet对象。当希望得到一个结果集使用此方法,就像使用一个SELECT语句。
int rows = stmt.executeUpdate("INSERT INTO ...") ; //返回受影响的SQL语句执行的行数。使用此方法来执行,而希望得到一些受影响的行的SQL语句 - 例如,INSERT,UPDATE或DELETE语句。
boolean flag = stmt.execute(String sql) ; //返回一个布尔值true,如果ResultSet对象可以被检索,否则返回false。使用这个方法来执行SQL DDL语句,或当需要使用真正的动态SQL。
*/
public static void statment_query(int id){
String sql_query="select * from a where id="+id+";";
String sql_update="insert into a (id,username) values (1234,'sdf'),(1234,'sssss')";
Connection con=mysqlConnect();
Statement stmt=null;
try {
stmt=con.createStatement();
ResultSet rs=stmt.executeQuery(sql_query);
while(rs.next()){
int prim_id=rs.getInt("id");
String username=rs.getString("username");
System.out.println("executeQuery:"+prim_id+"---"+username);
}
/*Boolean isSuccess= stmt.execute(sql_update);
System.out.println("execute:"+isSuccess);*/
/*int insertCount=stmt.executeUpdate(sql_update);
System.out.println("executeUpdate:"+insertCount);*/
if(rs!=null){
rs.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(con!=null){
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//PreparedSatement方法同上
public static void preparedSatement_query(int id,String username){
String sql="select * from a where id=? and username=?";
Connection con=mysqlConnect();
PreparedStatement ps= null;
try {
ps=con.prepareStatement(sql);
ps.setInt(1, id);
ps.setString(2, username);
ResultSet rs=ps.executeQuery();
while(rs.next()){
int prim_id=rs.getInt("id");
String un=rs.getString("username");
System.out.println("PreparedSatement:"+prim_id+"----"+un);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String args[]){
statment_query(1234);
preparedSatement_query(1234,"DJ");
}
}
/*
1、执行静态SQL语句。通常通过Statement实例实现。
2、执行动态SQL语句。通常通过PreparedStatement实例实现。
3、执行数据库存储过程。通常通过CallableStatement实例实现。【了解】
*/
/*
PreparedStatement 和 statement;
1.PreparedSatement可以写动态参数化查询如上
2.PrepareStatement比statemnt更快,使用PrepareStatement SQL语句会预编译在数据库系统中
执行计划同样会被缓存起来,它允许数据库做参数化查询。使用预处理语句比普通的查询更快,因为它做的工作更少
(数据库对SQL语句的分析,编译,优化已经在第一次查询前完成了)
【如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出它预编译的优越性。PrepareStatement只需
DBMS运行SQL语句,而不必先编译执行许多SQL语句的JDBC程序产生大量的Statement和PreparedStatement
对象。通常认为PreparedStatement对象比Statement对象更有效,特别是如果带有不同参数的同一SQL语句被多
次执行的时候。PreparedStatement对象允许数据库预编译SQL语句,这样在随后的运行中可以节省时间并增加代码
的可读性】
sql1:prestmt = conn.prepareStatement("select * from a where id=" + id);
sql2:PreparedStatement prestmt = conn.prepareStatement("select * from a where id=?");
prestmt.setInt(1,id);
sql1用追加方式是错误的使用方法;
3.防止sql注入式攻击
sql1="select * from a where id='"+id+"' and username='"+usernsme+"';"
恶意填入 :id = "1' OR '1'='1";
username = "1' OR '1'='1";
最终sql1变为"select * from a where id='1' OR '1'='1' and username='1' OR '1'='1';"
使得sql1中的where条件恒等。可以达到无账号密码登录网站。
防爬:将参数里的单引号替换掉id.replace("'",",")【连续2个单引号字符在SQL数据库中会视为字符中的一个单引号字符】
PrepareStatement不是已追加方式处理所以可防止sql注入攻击
*/
/*
DDL(data definition language):数据定义语言
DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。
常用的语句关键字包括:
(1)CREATE
(2)ALTER
(3)DROP
2、DML(data manipulation language):数据库操纵语言
用于添加、删除、更新和查询数据库记录,并检查数据完整性。SQL中处理数据等操作统称为数据操纵语言 。
常用的语句关键字包括:
(1)SELECT
(2)UPDATE
(3)INSERT
(4)DELETE
3、DCL(Data Control Language):数据控制语言
用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等 。
常用的语句关键字包括:
(1)COMMIT 提交
(2)SAVEPOINT 保存点
(3)ROLLBACK 回滚
(4)SET TRANSACTION 设置当前事务的特性,它对后面的事务没有影响
*/