※ PreparedStatement和Statemnet区别
- PreparedStatement是Statemnet的子类
- PreparedStatement执行的是同构的sql语句,Statemnet执行的是异构的sql语句;
- PreparedStatement执行sql语句的时候只编译一次sql语句并且可以采用占位符?,Statemnet每执行一条sql语句都要编译。
- PreparedStatement可以执行批处理,Statemnet不执行批处理。
下图为PereparedStatement和Statement处理SQL语句的方式
※ 占位符 “?”
prepareStatement执行sql语句只编译一次,编译好的sql语句存储在数据库端,里面的参数采用占位,后期执行的时候传一组数据数据采用占位之后数据的设置在编译之后执行之前,设置是基于?处在第几个(同时还要关注类型)
Statement执行的时候每条sql语句都编译,编译之后的sql语句存在客户端(java程序端)
※ 数据库中也有占位符 “&”
select &name from s_emp;
//会显示:请输入name的值
//通过占位符可以后输入查询的内容
//一般不常用
※ (异)同构
同构:sql语句结构一样(表名,参数的个数和顺序一样,值不一样)
insert into s_tea values(1,’tom’,34);
insert into s_tea values(2,’tom1’,34);
insert into s_tea values(3,’tom2’,34);
insert into s_tea values(4,’tom3’,34);
不同构:sql语句结构不一样(表名,参数的个数和顺序不一样)
insert into s_tea values(4,’tom3’,34);
select * from s_tea;
insert into s_tea(id, name) values(4,’tom3’);
※ 测试perparedStatement对象
package com.briup.jdbc;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
public class DMLPJdbc {
private String driver="oracle.jdbc.driver.OracleDriver";
private String url="jdbc:oracle:thin:@192.168.43.216:1521:XE";
private String user="jd1812";
private String password="briup";
public static void main(String[] args) {
// new DMLPJdbc().insertp(new Teacher(2, "jake", 30, new Date(new java.util.Date().getTime())));
// List<Teacher> list=new ArrayList<>();
// for(int i=0;i<10000;i++){
// list.add(new Teacher(i, "tom"+i, i, new Date(new java.util.Date().getTime())));
// }
// new DMLPJdbc().insertMore(list);
new DMLPJdbc().selectAllTeacher("tom2000");
}
public void insertp(Teacher teacher){
Connection conn=null;
PreparedStatement ps=null;
try {
Class.forName(driver);
conn=DriverManager.getConnection(url, user, password);
String sql="insert into s_tea values(?,?,?,?)";
//prepareStatement执行sql语句只编译一次,编译好的sql语句
//存储在数据库端,里面的参数采用占位,后期执行的时候
//传一组数据数据(id name age birth)
//采用占位之后数据的设置在编译之后执行之前,
//设置是基于?处在第几个(同时还要关注类型)
//Statement执行的时候每条sql语句都编译,编译之后的sql语句存
//在客户端(java程序端)
ps=conn.prepareStatement(sql);
ps.setLong(1, teacher.getId());
ps.setString(2, teacher.getName());
ps.setInt(3, teacher.getAge());
ps.setDate(4, teacher.getBirth());
ps.execute();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(ps!=null)ps.close();
if(conn!=null)conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void insert(Teacher teacher){
Connection conn=null;
PreparedStatement ps=null;
try {
Class.forName(driver);
conn=DriverManager.getConnection(url, user, password);
SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yy");
String dd=sdf.format(teacher.getBirth());
String sql="insert into s_tea values("+teacher.getId()+",'"+teacher.getName()+"',"+teacher.getAge()+",to_date('"+dd+"','dd-mm-yy'))";
ps=conn.prepareStatement(sql);
ps.execute();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(ps!=null)ps.close();
if(conn!=null)conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void insert(List<Teacher> teas){
Connection conn=null;
PreparedStatement ps=null;
try {
Class.forName(driver);
conn=DriverManager.getConnection(url, user, password);
String sql="insert into s_tea values(?,?,?,?)";
ps=conn.prepareStatement(sql);
long start_date=System.currentTimeMillis();
for(int i=0;i<teas.size();i++){
Teacher tea=teas.get(i);
ps.setLong(1, tea.getId());
ps.setString(2, tea.getName());
ps.setInt(3, tea.getAge());
ps.setDate(4, tea.getBirth());
ps.execute();
}
long end_date=System.currentTimeMillis();
System.out.println("sum:"+(end_date-start_date));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(ps!=null)ps.close();
if(conn!=null)conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void insertMore(List<Teacher> teas){
Connection conn=null;
PreparedStatement ps=null;
try {
Class.forName(driver);
conn=DriverManager.getConnection(url, user, password);
String sql="insert into s_tea values(?,?,?,?)";
ps=conn.prepareStatement(sql);
long start_date=System.currentTimeMillis();
for(int i=0;i<teas.size();i++){
Teacher tea=teas.get(i);
ps.setLong(1, tea.getId());
ps.setString(2, tea.getName());
ps.setInt(3, tea.getAge());
ps.setDate(4, tea.getBirth());
//构建一组数据放在缓存中
ps.addBatch();
if(i!=0&&i%3500==0){
//同时传输1000组数据给数据库
ps.executeBatch();
}
}
ps.executeBatch();
long end_date=System.currentTimeMillis();
System.out.println("sum:"+(end_date-start_date));
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(ps!=null)ps.close();
if(conn!=null)conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void selectAllTeacher(String name){
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
Class.forName(driver);
conn=DriverManager.getConnection(url, user, password);
String sql="select id,name names,age,birth from s_tea where name=?";
ps=conn.prepareStatement(sql);
ps.setString(1, name);
rs=ps.executeQuery();
while(rs.next()){
long id=rs.getLong("id");
String names=rs.getString("names");
int age=rs.getInt("age");
Date da=rs.getDate(4);
System.out.println(id+"-"+names+"-"+age+"-"+da);
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
if(rs!=null)ps.close();
if(ps!=null)ps.close();
if(conn!=null)conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}