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

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();

你可能感兴趣的:(java,jvm,sql,mysql,jdbc)