jdbc---JdbcUtils,PreparedStatement,sqlDate,Clob数据

[code]
static void template(){
Connection comm = null;
Statement st = null;
ResultSet rs = null ; //因为我们是和接口打交道,所以我们这里选的是java.sql.ResultSet这个,我们要接口不要实现

try{
Class.forName("com.mysql.jdbc.Driver"); //驱动只应该注册一次
Connection conn = DriverManager.getConnection(url,user,pwd);
}finally{
}


}

public final class JdbcUtils{ //因为工具类是直接使用的,所以不允许继承,所以写final

private static String url = "jdbc:mysql://localhost:3306/jdbc"; //能够私有,尽量私有,因为你修改不会对别人造成影响,被人根本就不可能使用你的赛
private static String user = "root";
private static String password = "";
private JdbcUtils(){} //因为工具类是不需要实例的,所以不允许new
static{
try{
Class.forName("com.mysql.jdbc.Driver"); //因为静态代码块只会在加载到jvm中被执行一次,所以我们把只要注册一次的东西放到这里
}catch(Exception e){
throw new Exception(e);
}
}

public static Connection getConnection(){
return DriverManager.getConnection(url,user,password);
}

public static void free(ResultSet rs,Statement st,Connection conn){
try{
if(rs != null){//判断空是因为,如果某个地方出错,这里很可能就是空
rs.close();
}catch(Exception e){

}finally{
try{
if(st != null)
st.close();
}catch(Exception e){

}finally{
try{
if(conn != null){
conn.close();
}
}catch(Exception e){

}
}
}

}

}
ResultSet rs = st.executeQuery(sql);
int i = st.executeUpdate(sql); //这个方法是 insert和update,delete都可以用,是插入和更新语句的通用方法
如果在数据库中插入成功,那么返回1,其实意思是有一条记录受到了改语句的影响
如果是插入呢?
sql = "update user set money = money+10";
int i = st.executeUpdate(sql); //这个i当然也是被影响的行数啦

String sql = "select id,name,money,birthday from user where name ='"+name+"'"; //这样写的毛病
如果 name = " ' or 1 or ' ";那么会把所有的数据都查出来,为什么呢?因为 name=" ",因为两个单引号之间什么也没有,当然是空, 这个当然没有, or 1 表示 or true,这样就把所有的记录都查询出来了
所以拼串很不安全,(但是如果输入的是int ,拼字符串也是可以的)那么怎么办呢?

使用预处理的车子哈。。。他会过滤掉一些系统的保留字,还会对sql做些优化。。,可以解决sql注入哈
PreparedStatement ps = null;
ps = conn.prepareStatement(sql); //这里是在构造这个车子的时候就给他了哈,所以才叫预处理嘛。。
rs = ps.executeQuery(sql); //他是能调用Statement的所有方法。。这个方法就是。。因为PreparedStatement是从Statement继承过来的
rs = ps.executeQuery(); //我们一般用这个

Statement会使数据库频繁编译sql,可能造成数据库缓冲区溢出

所以,只要带有参数的sql,一定要用PreparedStatement,不带参数的就不要用了

java.util.Date date = rs.getDate(); //这个Date是java.sql.Date,而我们通常用的是java.util.Date , 他们的关系是java.sql.Date是继承了java.util.Date
//java.util.Date 是既有日期又有时间的,而java.sql.Date 只有日期没有时间,如果想转行也可以,赋值就可以了
ps.setDate(2,java.sql.Date); //如何将java.util.Date转化成java.sql.Date.... new java.sql.Date(birthday.getTime());----通过毫秒来转

注意:java.sql.Date做了些格式化的工作,所以他们输出的结果是 : 2008-09-24这样的字符串

注意: mysql中的text字段是大的文本串类型,这种大文本的专业术语是: clobText
因为是字符流,当然用字符流的读取器
BufferedReader reader = new BufferedReader(new FileReader(new File("src/cn/itcast/jdbc/JdbcUtils.java")));
ps.setCharacterStream(1,reader,(int)file.length); //使用字符流处理大文本、
或者可以ps.setString(1,new String(buf,0,len)); //可以用字符流,难道还不可以用字符串啊。。。


Writer writer = new BufferedWriter(new FileWriter(new File("XXXX.java")));
Clob clob = rs.getClob(1);//这个可以读取大文本
或者最好是 rs.getString(1); //这样也可以拿出来大文本
Reader reader = clob.getCharacterStream(); //也可以直接使用rs.getCharacterStream();
char[] buff = new char[1024];
int len;
while((len = reader.read(buff))>0){
writer.write(buff,0,len);
}
writer.close();
reader.close();
[/code]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值